// ScreensA.jsx — Home, News (+ article), Events (+ sheet)

// ─── Hilfsfunktionen ─────────────────────────────────────────
function fmtNewsDate(dateStr) {
  if (!dateStr) return '';
  return new Date(dateStr).toLocaleDateString('de-AT', { day: 'numeric', month: 'long', year: 'numeric' });
}

function formatNewsArticle(n) {
  return { ...n, date: fmtNewsDate(n.created_at) };
}

// ─────────────────── HOME ───────────────────
function ScreenHome({ onNav, onOpenArticle, onOpenEvent, events = [], unreadCount = 0, onOpenNotifications }) {
  const [featured, setFeatured] = React.useState(null);
  const upcoming = events.slice(0, 3);

  React.useEffect(() => {
    const token = sessionStorage.getItem('sbp_token');
    sbpApi('GET', '/news', null, token)
      .then(data => { if (data.length > 0) setFeatured(data[0]); })
      .catch(() => {});
  }, []);
  return (
    <div className="sbp-screen" style={{ overflow: 'auto', paddingBottom: 90 }}>
      {/* HERO */}
      <div style={{ position: 'relative', height: 340, overflow: 'hidden' }}>
        <div className="sbp-img" style={{ position: 'absolute', inset: 0 }}/>
        {/* dramatic horns silhouette */}
        <svg viewBox="0 0 360 340" preserveAspectRatio="xMidYMax slice"
             style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', opacity: 0.55 }}>
          <defs>
            <linearGradient id="h-glow" x1="0" y1="1" x2="0" y2="0">
              <stop offset="0" stopColor="var(--sbp-accent)" stopOpacity="0.8"/>
              <stop offset="1" stopColor="var(--sbp-accent)" stopOpacity="0"/>
            </linearGradient>
          </defs>
          <ellipse cx="180" cy="320" rx="180" ry="80" fill="url(#h-glow)"/>
          {/* mountain ridges */}
          <path d="M0 280 L60 230 L110 260 L160 200 L210 250 L260 210 L320 240 L360 220 L360 340 L0 340 Z" fill="rgba(0,0,0,0.7)"/>
          <path d="M0 310 L80 270 L150 300 L220 260 L300 290 L360 270 L360 340 L0 340 Z" fill="rgba(0,0,0,0.85)"/>
          {/* horns silhouette */}
          <path d="M120 180 C100 140 90 110 95 80 C110 110 130 140 140 175 Z" fill="#000"/>
          <path d="M240 180 C260 140 270 110 265 80 C250 110 230 140 220 175 Z" fill="#000"/>
        </svg>
        <div style={{
          position: 'absolute', inset: 0,
          background: 'linear-gradient(180deg, rgba(10,5,6,0.4) 0%, transparent 30%, rgba(10,5,6,0.95) 100%)'
        }}/>
        {/* Top brand row */}
        <div style={{ position: 'relative', display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '14px 20px' }}>
          <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
            <SbpMark size={32}/>
            <div>
              <div className="sbp-display" style={{ fontSize: 11, letterSpacing: '0.3em' }}>Schafberg</div>
              <div className="sbp-meta" style={{ marginTop: -1, color: 'var(--sbp-ember-200)' }}>· Pass ·</div>
            </div>
          </div>
          <button className="sbp-icon-btn" aria-label="Benachrichtigungen" onClick={onOpenNotifications} style={{ position: 'relative' }}>
            <IconBell size={20}/>
            {unreadCount > 0 && (
              <span style={{
                position: 'absolute', top: 5, right: 5,
                minWidth: 16, height: 16, padding: '0 4px', borderRadius: 99,
                background: 'var(--sbp-accent)', boxShadow: '0 0 8px var(--sbp-accent)',
                fontSize: 9, fontWeight: 700, color: '#fff', letterSpacing: 0,
                display: 'flex', alignItems: 'center', justifyContent: 'center',
                pointerEvents: 'none',
              }}>{unreadCount > 9 ? '9+' : unreadCount}</span>
            )}
          </button>
        </div>
        {/* hero text */}
        <div style={{ position: 'absolute', left: 20, right: 20, bottom: 20 }}>
          <div className="sbp-eyebrow" style={{ marginBottom: 8 }}>Gegründet  · Anno MMV </div>
          <h1 className="sbp-h1 sbp-glow-text" style={{ fontFamily: 'var(--sbp-font-rustic)', fontWeight: 600, letterSpacing: 0, fontSize: 38, lineHeight: 1, margin: 0 }}>
            Willkommen
          </h1>
          <p className="sbp-body" style={{ marginTop: 10, color: 'var(--sbp-text-2)', maxWidth: 280 }}>
            Hier findest du alle Termine, Neuigkeiten und zukünftig noch mehr.
          </p>
        </div>
      </div>

      {/* QUICK ACCESS */}
      <div style={{ padding: '20px 20px 0', display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 10 }}>
        {[
          { i: <IconEvents size={18}/>, l: 'Termine', a: 'events' },
          { i: <IconNews size={18}/>, l: 'News', a: 'news' },
          { i: <IconUser size={18}/>, l: 'Profil', a: 'profile' },
        ].map(s => (
          <button key={s.l} onClick={() => onNav(s.a)} className="sbp-card" style={{
            padding: '14px 8px', display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 8,
            cursor: 'pointer', color: 'var(--sbp-text)',
          }}>
            <span style={{ color: 'var(--sbp-ember-200)' }}>{s.i}</span>
            <span className="sbp-display" style={{ fontSize: 10, letterSpacing: '0.18em' }}>{s.l}</span>
          </button>
        ))}
      </div>

      {/* FEATURED NEWS */}
      {featured && (
        <div style={{ padding: '24px 20px 0' }}>
          <div className="sbp-rule" style={{ marginBottom: 14 }}>
            <span style={{ color: 'var(--sbp-ember-200)' }}>✦</span>
            <span>News</span>
            <span style={{ color: 'var(--sbp-ember-200)' }}>✦</span>
          </div>
          <article onClick={() => onOpenArticle(formatNewsArticle(featured))}
                   className="sbp-card sbp-card--ember"
                   style={{ cursor: 'pointer' }}>
            <div className="sbp-img" style={{ height: 160 }}>
              <div style={{
                position: 'absolute', inset: 0,
                background: 'radial-gradient(40% 60% at 30% 60%, rgba(217,109,28,0.55) 0%, transparent 60%)'
              }}/>
            </div>
            <div style={{ padding: 18 }}>
              <span className="sbp-eyebrow">{featured.eyebrow} · {fmtNewsDate(featured.created_at)}</span>
              <h3 className="sbp-h2" style={{ margin: '8px 0 8px', fontFamily: 'var(--sbp-font-rustic)', fontSize: 24, fontWeight: 600 }}>{featured.title}</h3>
              <p className="sbp-body" style={{ color: 'var(--sbp-text-2)' }}>{featured.excerpt}</p>
              <div style={{ marginTop: 12, display: 'flex', alignItems: 'center', gap: 8, color: 'var(--sbp-ember-200)' }}>
                <span className="sbp-display" style={{ fontSize: 11, letterSpacing: '0.2em' }}>Weiterlesen</span>
                <IconArrowRight size={14}/>
              </div>
            </div>
          </article>
        </div>
      )}

      {/* UPCOMING */}
      <div style={{ padding: '28px 20px 0' }}>
        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline', marginBottom: 14 }}>
          <span className="sbp-display" style={{ fontSize: 13, letterSpacing: '0.22em' }}>Kommende Läufe</span>
          <button onClick={() => onNav('events')} className="sbp-meta" style={{ background: 'none', border: 0, color: 'var(--sbp-ember-200)', cursor: 'pointer', letterSpacing: '0.2em', fontSize: 10, textTransform: 'uppercase', fontFamily: 'var(--sbp-font-display)' }}>Alle ansehen</button>
        </div>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
          {upcoming.map(ev => (
            <button key={ev.id} onClick={() => onOpenEvent(ev)} className="sbp-card" style={{
              display: 'flex', gap: 14, padding: 14, textAlign: 'left', cursor: 'pointer', color: 'var(--sbp-text)'
            }}>
              <div style={{
                width: 56, minWidth: 56, height: 64, borderRadius: 10,
                border: '1px solid var(--sbp-border-strong)',
                background: 'linear-gradient(180deg, color-mix(in oklab, var(--sbp-accent) 25%, transparent), transparent)',
                display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center',
              }}>
                <span className="sbp-meta" style={{ color: 'var(--sbp-ember-200)' }}>{ev.month}</span>
                <span style={{ fontSize: 24, fontWeight: 700, lineHeight: 1, fontFamily: 'var(--sbp-font-rustic)' }}>{ev.day}</span>
                <span className="sbp-meta" style={{ fontSize: 10 }}>{ev.year}</span>
              </div>
              <div style={{ flex: 1, minWidth: 0 }}>
                <div style={{ display: 'flex', gap: 6, marginBottom: 6 }}>
                  <span className="sbp-chip sbp-chip--ember">{ev.kind}</span>
                </div>
                <div className="sbp-h3" style={{ marginBottom: 4 }}>{ev.title}</div>
                <div className="sbp-meta" style={{ display: 'flex', gap: 12 }}>
                  <span style={{ display: 'inline-flex', gap: 4, alignItems: 'center' }}><IconClock size={12}/>{ev.time}</span>
                  <span style={{ display: 'inline-flex', gap: 4, alignItems: 'center', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}><IconLocation size={12}/>{ev.location}</span>
                </div>
              </div>
            </button>
          ))}
        </div>
      </div>

      {/* Zitat */}
      <div style={{ padding: '32px 20px 24px', textAlign: 'center' }}>
        <div className="sbp-rule" style={{ marginBottom: 16 }}>
          <span style={{ color: 'var(--sbp-ember-200)' }}>✦</span>
          <span>Zitat</span>
          <span style={{ color: 'var(--sbp-ember-200)' }}>✦</span>
        </div>
        <p style={{
          fontFamily: 'var(--sbp-font-rustic)', fontStyle: 'italic',
          fontSize: 22, lineHeight: 1.35, color: 'var(--sbp-fog-200)', margin: 0,
        }}>
          „Wir san a richtig geile Truppe ,<br/>und man kann sich auf jeden verlassen!<br/>Sau geil is do dabei zu sein ."
        </p>
        <div className="sbp-meta" style={{ marginTop: 12 }}>— Obmann Michael Dorn, 2025</div>
      </div>
    </div>
  );
}

// ─────────────────── CONFIRM DELETE MODAL ────────────────────
function ConfirmDeleteModal({ onConfirm, onCancel, message }) {
  return (
    <div onClick={onCancel} style={{
      position: 'absolute', inset: 0, zIndex: 200,
      background: 'rgba(0,0,0,0.7)', backdropFilter: 'blur(6px)',
      display: 'flex', alignItems: 'center', justifyContent: 'center',
      padding: '0 32px',
      animation: 'sbp-fade-in 0.15s ease',
    }}>
      <div onClick={e => e.stopPropagation()} style={{
        width: '100%', maxWidth: 320,
        background: 'linear-gradient(180deg, var(--sbp-night-2), var(--sbp-night-1))',
        borderRadius: 20,
        border: '1px solid var(--sbp-border-strong)',
        boxShadow: '0 20px 60px rgba(0,0,0,0.6)',
        padding: '28px 24px 24px',
        textAlign: 'center',
      }}>
        <div style={{ color: 'var(--sbp-blood-400)', marginBottom: 14 }}>
          <IconTrash size={30}/>
        </div>
        <h3 className="sbp-h3" style={{ fontFamily: 'var(--sbp-font-rustic)', fontSize: 22, fontWeight: 600, marginBottom: 10 }}>
          Beitrag löschen?
        </h3>
        <p className="sbp-body" style={{ color: 'var(--sbp-text-2)', fontSize: 14, lineHeight: 1.55 }}>
          {message || 'Wollen Sie den Beitrag wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.'}
        </p>
        <div style={{ display: 'flex', gap: 10, marginTop: 22 }}>
          <button onClick={onCancel} className="sbp-btn sbp-btn--ghost" style={{ flex: 1 }}>Nein</button>
          <button onClick={onConfirm} style={{
            flex: 1, display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 6,
            padding: '12px 16px', borderRadius: 10, cursor: 'pointer', fontWeight: 600,
            fontFamily: 'var(--sbp-font-display)', fontSize: 12, letterSpacing: '0.16em', textTransform: 'uppercase',
            background: 'color-mix(in oklab, var(--sbp-blood-500) 30%, transparent)',
            border: '1px solid color-mix(in oklab, var(--sbp-blood-400) 50%, transparent)',
            color: 'var(--sbp-blood-400)',
          }}>
            <IconTrash size={14}/>Ja, löschen
          </button>
        </div>
      </div>
    </div>
  );
}

// ─────────────────── NEWS LIST ───────────────────
function ScreenNews({ onOpenArticle, role = 'user', bookmarks = { news: {}, events: {} }, onBookmarkToggle }) {
  const canEdit = role === 'moderator' || role === 'admin';
  const [filter, setFilter]       = React.useState('Alle');
  const [news, setNews]           = React.useState([]);
  const [loading, setLoading]     = React.useState(true);
  const [showAdd, setShowAdd]     = React.useState(false);
  const [deleteId, setDeleteId]   = React.useState(null);
  const [showSearch, setShowSearch] = React.useState(false);
  const [query, setQuery]           = React.useState('');
  const searchRef = React.useRef(null);

  const token = sessionStorage.getItem('sbp_token');

  const isNewsBookmarked = (id) => !!(bookmarks.news?.[String(id)]);
  const toggleNewsBookmark = (n) => onBookmarkToggle?.('news', n.id, formatNewsArticle(n));

  const loadNews = async () => {
    setLoading(true);
    try {
      const data = await sbpApi('GET', '/news', null, token);
      data.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
      setNews(data);
    } catch (err) {
      console.error('[NEWS]', err);
    } finally {
      setLoading(false);
    }
  };

  React.useEffect(() => { loadNews(); }, []);

  // Fokus ins Suchfeld sobald es eingeblendet wird
  React.useEffect(() => {
    if (showSearch && searchRef.current) searchRef.current.focus();
  }, [showSearch]);

  const openSearch = () => { setShowSearch(true); setQuery(''); };
  const closeSearch = () => { setShowSearch(false); setQuery(''); };

  // Tags aus den tatsächlich vorhandenen Beiträgen ableiten
  const tags = ['Alle', ...Array.from(new Set(news.map(n => n.tag))).sort()];

  React.useEffect(() => {
    if (filter !== 'Alle' && !news.some(n => n.tag === filter)) setFilter('Alle');
  }, [news]);

  // Volltextsuche über Titel, Eyebrow, Excerpt, Body, Tag
  const matchesQuery = (n) => {
    if (!query.trim()) return true;
    const q = query.toLowerCase();
    return (
      (n.title   || '').toLowerCase().includes(q) ||
      (n.eyebrow || '').toLowerCase().includes(q) ||
      (n.excerpt || '').toLowerCase().includes(q) ||
      (n.body    || '').toLowerCase().includes(q) ||
      (n.tag     || '').toLowerCase().includes(q)
    );
  };

  const byTag     = filter === 'Alle' ? news : news.filter(n => n.tag === filter);
  const filtered  = byTag.filter(matchesQuery);

  const doDelete = async () => {
    const id = deleteId;
    setDeleteId(null);
    try {
      await sbpApi('DELETE', `/news/${id}`, null, token);
      setNews(prev => prev.filter(n => n.id !== id));
    } catch (err) {
      alert(err.message);
    }
  };

  return (
    <div className="sbp-screen" style={{ overflow: 'auto', paddingBottom: 90 }}>
      <SbpTopBar
        title="News"
        subtitle="Neuigkeiten aus dem Pass"
        leading={
          <button onClick={showSearch ? closeSearch : openSearch}
                  className="sbp-icon-btn"
                  style={{ width: 36, height: 36, color: showSearch ? 'var(--sbp-ember-200)' : undefined }}>
            {showSearch ? <IconClose size={18}/> : <IconSearch size={18}/>}
          </button>
        }
        trailing={
          canEdit
            ? <button onClick={() => setShowAdd(true)} className="sbp-icon-btn" style={{ width: 36, height: 36, color: 'var(--sbp-ember-200)' }}><IconPlus size={18}/></button>
            : <button className="sbp-icon-btn" style={{ width: 36, height: 36 }}><IconBell size={18}/></button>
        }
      />

      {/* Suchfeld */}
      {showSearch && (
        <div style={{ padding: '10px 16px 0', animation: 'sbp-fade-in 0.2s ease' }}>
          <div style={{ position: 'relative' }}>
            <span style={{ position: 'absolute', left: 12, top: '50%', transform: 'translateY(-50%)', color: 'var(--sbp-text-3)', pointerEvents: 'none' }}>
              <IconSearch size={16}/>
            </span>
            <input
              ref={searchRef}
              className="sbp-input"
              placeholder="Beiträge durchsuchen…"
              value={query}
              onChange={e => setQuery(e.target.value)}
              style={{ paddingLeft: 38, paddingRight: query ? 36 : 12 }}
            />
            {query && (
              <button onClick={() => setQuery('')} style={{
                position: 'absolute', right: 10, top: '50%', transform: 'translateY(-50%)',
                background: 'none', border: 0, color: 'var(--sbp-text-3)', cursor: 'pointer',
                display: 'flex', alignItems: 'center', padding: 2,
              }}>
                <IconClose size={14}/>
              </button>
            )}
          </div>
        </div>
      )}

      {/* Tag-Filter (dynamisch aus DB-Beiträgen) — bei aktiver Suche ausgeblendet */}
      {!showSearch && (
        <div style={{ padding: '14px 16px', display: 'flex', gap: 8, overflowX: 'auto' }}>
          {tags.map(t => (
            <button key={t} onClick={() => setFilter(t)}
                    className="sbp-chip"
                    style={{
                      cursor: 'pointer', whiteSpace: 'nowrap',
                      background: filter === t ? 'color-mix(in oklab, var(--sbp-accent) 25%, transparent)' : undefined,
                      borderColor: filter === t ? 'color-mix(in oklab, var(--sbp-accent) 50%, transparent)' : undefined,
                      color: filter === t ? 'var(--sbp-ember-100)' : undefined,
                    }}>
              {t}
            </button>
          ))}
        </div>
      )}

      <div style={{ padding: '4px 20px 0', display: 'flex', flexDirection: 'column', gap: 14 }}>
        {loading ? (
          <div style={{ textAlign: 'center', padding: '40px 0', color: 'var(--sbp-text-3)' }}>
            <div className="sbp-meta">Lade Beiträge…</div>
          </div>
        ) : filtered.length === 0 ? (
          <div style={{ textAlign: 'center', padding: '40px 0' }}>
            <p className="sbp-body" style={{ color: 'var(--sbp-text-3)' }}>
              {query ? `Keine Ergebnisse für „${query}".` : 'Keine Beiträge vorhanden.'}
            </p>
          </div>
        ) : filtered.map((n, i) => (
          // Outer div is position:relative wrapper — NOT clickable itself
          <div key={n.id} className="sbp-card" style={{ overflow: 'hidden', position: 'relative' }}>
            {/* Navigation button: covers image + text, no interactive children inside */}
            <button
              onClick={() => onOpenArticle(formatNewsArticle(n))}
              style={{ display: 'block', width: '100%', background: 'none', border: 0, padding: 0, cursor: 'pointer', textAlign: 'left', color: 'inherit' }}
            >
              <div className="sbp-img" style={{ height: 140 }}>
                <div style={{
                  position: 'absolute', inset: 0,
                  background: i % 2 === 0
                    ? 'radial-gradient(50% 70% at 30% 80%, rgba(217,109,28,0.55), transparent 70%)'
                    : 'radial-gradient(50% 70% at 70% 30%, rgba(155,28,28,0.6), transparent 70%)'
                }}/>
                <div style={{ position: 'absolute', top: 12, left: 12 }}>
                  <span className="sbp-chip sbp-chip--ember">{n.tag}</span>
                </div>
              </div>
              <div style={{ padding: 16 }}>
                <div className="sbp-meta" style={{ display: 'flex', gap: 10, marginBottom: 6 }}>
                  <span>{fmtNewsDate(n.created_at)}</span><span>·</span><span>{n.eyebrow || n.author_name}</span>
                </div>
                <h3 className="sbp-h3" style={{ marginBottom: 6, fontFamily: 'var(--sbp-font-rustic)', fontSize: 20, fontWeight: 600 }}>{n.title}</h3>
                <p className="sbp-body" style={{ color: 'var(--sbp-text-2)', fontSize: 14 }}>{n.excerpt}</p>
              </div>
            </button>
            {/* Bookmark button: top-right (shifts left if delete button also visible) */}
            <button onClick={() => toggleNewsBookmark(n)} style={{
              position: 'absolute', top: 8, right: canEdit ? 48 : 8,
              width: 32, height: 32, borderRadius: 8,
              background: 'rgba(0,0,0,0.55)', backdropFilter: 'blur(8px)',
              border: isNewsBookmarked(n.id)
                ? '1px solid color-mix(in oklab, var(--sbp-accent) 60%, transparent)'
                : '1px solid rgba(255,255,255,0.12)',
              color: isNewsBookmarked(n.id) ? 'var(--sbp-accent)' : 'var(--sbp-text-3)',
              cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center',
            }}>
              <IconHeart size={14} fill={isNewsBookmarked(n.id) ? 'currentColor' : 'none'}/>
            </button>
            {/* Delete button: sibling to nav button, absolutely positioned — no bubbling to nav */}
            {canEdit && (
              <button onClick={() => setDeleteId(n.id)} style={{
                position: 'absolute', top: 8, right: 8,
                width: 32, height: 32, borderRadius: 8,
                background: 'rgba(0,0,0,0.55)', backdropFilter: 'blur(8px)',
                border: '1px solid color-mix(in oklab, var(--sbp-blood-400) 50%, transparent)',
                color: 'var(--sbp-blood-400)', cursor: 'pointer',
                display: 'flex', alignItems: 'center', justifyContent: 'center',
              }}>
                <IconTrash size={14}/>
              </button>
            )}
          </div>
        ))}
      </div>

      {deleteId && (
        <ConfirmDeleteModal
          onCancel={() => setDeleteId(null)}
          onConfirm={doDelete}
        />
      )}

      {showAdd && (
        <AddNewsSheet
          token={token}
          onCancel={() => setShowAdd(false)}
          onSave={() => { setShowAdd(false); loadNews(); }}
        />
      )}
    </div>
  );
}

// ─────────────────── ARTICLE ───────────────────
function ScreenArticle({ article, onBack, role = 'user', bookmarks = { news: {}, events: {} }, onBookmarkToggle }) {
  const canEdit = role === 'moderator' || role === 'admin';
  const [current, setCurrent]       = React.useState(article);
  const [showDelete, setShowDelete] = React.useState(false);
  const [showEdit, setShowEdit]     = React.useState(false);
  const token = sessionStorage.getItem('sbp_token');
  const bookmarked = !!(bookmarks.news?.[String(article.id)]);
  const toggleBookmark = () => onBookmarkToggle?.('news', current.id, current);

  const doDelete = async () => {
    setShowDelete(false);
    try {
      await sbpApi('DELETE', `/news/${current.id}`, null, token);
      onBack();
    } catch (err) {
      alert(err.message);
    }
  };

  return (
    <div className="sbp-screen" style={{ overflow: 'auto', paddingBottom: 90 }}>
      <div style={{ position: 'relative', height: 280 }}>
        <div className="sbp-img" style={{ position: 'absolute', inset: 0 }}/>
        <div style={{
          position: 'absolute', inset: 0,
          background: 'linear-gradient(180deg, rgba(10,5,6,0.5) 0%, transparent 40%, rgba(10,5,6,0.95) 100%)'
        }}/>
        <button onClick={onBack} className="sbp-icon-btn" style={{
          position: 'absolute', top: 14, left: 16, width: 38, height: 38,
          background: 'rgba(0,0,0,0.4)', backdropFilter: 'blur(12px)',
        }}>
          <IconChevronLeft size={20}/>
        </button>
        <div style={{ position: 'absolute', top: 14, right: 16 }}>
          <button onClick={toggleBookmark} className="sbp-icon-btn" style={{
            width: 38, height: 38, background: 'rgba(0,0,0,0.4)', backdropFilter: 'blur(12px)',
            color: bookmarked ? 'var(--sbp-accent)' : undefined,
            border: bookmarked ? '1px solid color-mix(in oklab, var(--sbp-accent) 50%, transparent)' : undefined,
          }}>
            <IconHeart size={18} fill={bookmarked ? 'currentColor' : 'none'}/>
          </button>
        </div>
        <div style={{ position: 'absolute', bottom: 18, left: 20, right: 20 }}>
          <span className="sbp-chip sbp-chip--ember">{current.tag}</span>
          <h1 className="sbp-h1 sbp-glow-text" style={{ fontFamily: 'var(--sbp-font-rustic)', fontWeight: 600, letterSpacing: 0, fontSize: 30, lineHeight: 1.1, margin: '10px 0 6px' }}>{current.title}</h1>
          <div className="sbp-meta" style={{ display: 'flex', gap: 10 }}>
            <span>{current.date}</span><span>·</span><span>{current.eyebrow || current.author_name || 'Vorstand'}</span>
          </div>
        </div>
      </div>

      <div style={{ padding: '24px 22px 0' }}>
        <p className="sbp-body" style={{ fontSize: 17, lineHeight: 1.65, color: 'var(--sbp-fog-200)' }}>
          {current.body}
        </p>

        {/* Merken-Button — für alle User */}
        <button onClick={toggleBookmark} className="sbp-btn sbp-btn--ghost" style={{
          width: '100%', marginTop: 22,
          color: bookmarked ? 'var(--sbp-accent)' : undefined,
          borderColor: bookmarked ? 'color-mix(in oklab, var(--sbp-accent) 50%, transparent)' : undefined,
        }}>
          <IconHeart size={16} fill={bookmarked ? 'currentColor' : 'none'}/>
          {bookmarked ? 'Gemerkt ✓' : 'Merken'}
        </button>

        {/* Moderator/Admin Aktionen */}
        {canEdit && (
          <div style={{ display: 'flex', flexDirection: 'column', gap: 10, marginTop: 28 }}>
            <div style={{ borderTop: '1px solid var(--sbp-border)', paddingTop: 20 }}>
              <div className="sbp-eyebrow" style={{ marginBottom: 12 }}>Verwaltung</div>
              <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
                <button onClick={() => setShowEdit(true)} className="sbp-btn sbp-btn--ghost" style={{ width: '100%' }}>
                  <IconEdit size={16}/>Beitrag bearbeiten
                </button>
                <button onClick={() => setShowDelete(true)} style={{
                  width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,
                  padding: '12px 16px', borderRadius: 10, cursor: 'pointer',
                  background: 'color-mix(in oklab, var(--sbp-blood-500) 20%, transparent)',
                  border: '1px solid color-mix(in oklab, var(--sbp-blood-400) 40%, transparent)',
                  color: 'var(--sbp-blood-400)',
                  fontFamily: 'var(--sbp-font-display)', fontSize: 12, letterSpacing: '0.16em',
                  textTransform: 'uppercase', fontWeight: 600,
                }}>
                  <IconTrash size={16}/>Beitrag löschen
                </button>
              </div>
            </div>
          </div>
        )}
      </div>

      {showDelete && (
        <ConfirmDeleteModal
          onCancel={() => setShowDelete(false)}
          onConfirm={doDelete}
        />
      )}

      {showEdit && (
        <EditNewsSheet
          article={current}
          token={token}
          onCancel={() => setShowEdit(false)}
          onSave={(updated) => {
            setCurrent({ ...current, ...updated, date: fmtNewsDate(updated.updated_at || current.created_at) });
            setShowEdit(false);
          }}
        />
      )}
    </div>
  );
}

// ─────────────────── EDIT NEWS SHEET ─────────────────────────
function EditNewsSheet({ article, token, onCancel, onSave }) {
  const [f, setF] = React.useState({
    eyebrow: article.eyebrow || '',
    title:   article.title   || '',
    tag:     article.tag     || 'News',
    excerpt: article.excerpt || '',
    body:    article.body    || '',
  });
  const [saving, setSaving] = React.useState(false);
  const [error, setError]   = React.useState('');
  const set = (k) => (e) => setF(prev => ({ ...prev, [k]: e.target.value }));

  const submit = async () => {
    if (!f.title.trim()) { setError('Titel ist erforderlich.'); return; }
    setSaving(true);
    setError('');
    try {
      await sbpApi('PUT', `/news/${article.id}`, f, token);
      onSave(f);
    } catch (err) {
      setError(err.message);
      setSaving(false);
    }
  };

  return (
    <div onClick={onCancel} style={{
      position: 'absolute', inset: 0, zIndex: 100,
      background: 'rgba(0,0,0,0.6)', backdropFilter: 'blur(4px)',
      display: 'flex', alignItems: 'flex-end', animation: 'sbp-fade-in 0.2s ease'
    }}>
      <div onClick={e => e.stopPropagation()} style={{
        width: '100%', maxHeight: '92%',
        background: 'linear-gradient(180deg, var(--sbp-night-2), var(--sbp-night-1))',
        borderTopLeftRadius: 24, borderTopRightRadius: 24,
        border: '1px solid var(--sbp-border-strong)', borderBottom: 0,
        boxShadow: '0 -20px 60px rgba(0,0,0,0.5), 0 -4px 30px color-mix(in oklab, var(--sbp-accent) 20%, transparent)',
        overflow: 'auto', padding: '8px 22px 28px',
        animation: 'sbp-fade-in 0.3s ease',
      }}>
        <div style={{ width: 40, height: 4, background: 'var(--sbp-fog-500)', borderRadius: 2, margin: '8px auto 18px' }}/>
        <span className="sbp-eyebrow">Beitrag bearbeiten</span>
        <h2 className="sbp-h2" style={{ fontFamily: 'var(--sbp-font-rustic)', fontSize: 26, fontWeight: 600, marginTop: 6, marginBottom: 18 }}>Beitrag bearbeiten</h2>

        {error && (
          <div style={{
            padding: '8px 12px', borderRadius: 8, marginBottom: 14, fontSize: 13,
            background: 'color-mix(in oklab, var(--sbp-blood-500) 25%, transparent)',
            border: '1px solid color-mix(in oklab, var(--sbp-blood-400) 40%, transparent)',
            color: 'var(--sbp-ember-100)',
          }}>{error}</div>
        )}

        <label className="sbp-label">Titel *</label>
        <input className="sbp-input" placeholder="Titel des Beitrags" value={f.title} onChange={set('title')}/>

        <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 10, marginTop: 14 }}>
          <div>
            <label className="sbp-label">Eyebrow</label>
            <input className="sbp-input" placeholder="z. B. Vorstand" value={f.eyebrow} onChange={set('eyebrow')}/>
          </div>
          <div>
            <label className="sbp-label">Tag (Filter)</label>
            <input className="sbp-input" placeholder="z. B. News" value={f.tag} onChange={set('tag')}/>
          </div>
        </div>

        <label className="sbp-label" style={{ marginTop: 14 }}>Kurztext</label>
        <textarea className="sbp-input" rows={2} value={f.excerpt} onChange={set('excerpt')} placeholder="Kurze Beschreibung …"/>

        <label className="sbp-label" style={{ marginTop: 14 }}>Volltext</label>
        <textarea className="sbp-input" rows={5} value={f.body} onChange={set('body')} placeholder="Vollständiger Beitragstext …"/>

        <div style={{ display: 'flex', gap: 10, marginTop: 22 }}>
          <button onClick={onCancel} className="sbp-btn sbp-btn--ghost" style={{ flex: 1 }}>Abbrechen</button>
          <button onClick={submit} disabled={saving} className="sbp-btn sbp-btn--primary" style={{ flex: 2 }}>
            <IconCheck size={16}/>{saving ? 'Speichern…' : 'Änderungen speichern'}
          </button>
        </div>
      </div>
    </div>
  );
}

// ─────────────────── EVENTS ───────────────────
const SHORT_MONTHS = ['Jän','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'];

function buildCalMonth(jsDate) {
  const year = jsDate.getFullYear();
  const monthIdx = jsDate.getMonth();
  const name = jsDate.toLocaleString('de-AT', { month: 'long' });
  const firstWeekday = (new Date(year, monthIdx, 1).getDay() + 6) % 7; // Mon=0
  const days = new Date(year, monthIdx + 1, 0).getDate();
  const short = SHORT_MONTHS[monthIdx];
  return { name, year, firstWeekday, days, short };
}

function ScreenEvents({ onOpenEvent, role = 'user', events = [], onEventAdd, onEventDelete }) {
  const canEdit = role === 'moderator' || role === 'admin';
  const [view, setView] = React.useState('cal'); // 'cal' | 'list'
  const [showAdd, setShowAdd] = React.useState(false);
  const [selectedDay, setSelectedDay] = React.useState(null);
  const [monthOffset, setMonthOffset] = React.useState(() => {
    const now = new Date();
    return (now.getFullYear() - 2026) * 12 + (now.getMonth() - 11);
  });

  const calMonth = buildCalMonth(new Date(2026, 11 + monthOffset, 1));

  const changeMonth = (delta) => { setMonthOffset(o => o + delta); setSelectedDay(null); };

  const prefill = selectedDay ? { day: String(selectedDay), month: calMonth.short, year: calMonth.year } : null;

  return (
    <div className="sbp-screen" style={{ overflow: 'auto', paddingBottom: 90 }}>
      <SbpTopBar
        title="Termine"
        subtitle={`${calMonth.name} ${calMonth.year}`}
        leading={
          <button onClick={() => changeMonth(-1)} className="sbp-icon-btn" style={{ width: 36, height: 36 }}>
            <IconChevronLeft size={18}/>
          </button>
        }
        trailing={
          <div style={{ display: 'flex', gap: 4 }}>
            <button onClick={() => changeMonth(1)} className="sbp-icon-btn" style={{ width: 36, height: 36 }}>
              <IconChevronRight size={18}/>
            </button>
            {canEdit && (
              <button onClick={() => setShowAdd(true)} className="sbp-icon-btn" style={{ width: 36, height: 36, color: 'var(--sbp-ember-200)' }}>
                <IconPlus size={18}/>
              </button>
            )}
          </div>
        }
      />

      {/* segmented */}
      <div style={{ padding: '14px 20px 0' }}>
        <div style={{
          display: 'grid', gridTemplateColumns: '1fr 1fr',
          background: 'rgba(0,0,0,0.4)', border: '1px solid var(--sbp-border)',
          borderRadius: 10, padding: 4,
        }}>
          {[['cal', 'Kalender'], ['list', 'Liste']].map(([v, l]) => (
            <button key={v} onClick={() => setView(v)} style={{
              padding: '8px 0', borderRadius: 8, border: 0, cursor: 'pointer',
              fontFamily: 'var(--sbp-font-display)', fontSize: 11, letterSpacing: '0.18em', textTransform: 'uppercase', fontWeight: 600,
              color: view === v ? 'var(--sbp-fog-100)' : 'var(--sbp-text-3)',
              background: view === v ? 'color-mix(in oklab, var(--sbp-accent) 22%, transparent)' : 'transparent',
              boxShadow: view === v ? 'inset 0 0 0 1px color-mix(in oklab, var(--sbp-accent) 50%, transparent)' : 'none',
            }}>{l}</button>
          ))}
        </div>
      </div>

      {view === 'cal'
        ? <CalendarView events={events} onOpenEvent={onOpenEvent} calMonth={calMonth} canEdit={canEdit} onEventDelete={onEventDelete} selectedDay={selectedDay} onDaySelect={setSelectedDay}/>
        : <EventsList events={events} onOpenEvent={onOpenEvent} canEdit={canEdit} onEventDelete={onEventDelete}/>}
      {canEdit && showAdd && <AddEventSheet onCancel={() => setShowAdd(false)} prefill={prefill} onSave={(ev) => { onEventAdd?.(ev); setShowAdd(false); }}/>}
    </div>
  );
}

function CalendarView({ events, onOpenEvent, calMonth, canEdit, onEventDelete, selectedDay, onDaySelect }) {
  const wkdays = ['Mo','Di','Mi','Do','Fr','Sa','So'];
  const cells = [];
  for (let i = 0; i < calMonth.firstWeekday; i++) cells.push(null);
  for (let d = 1; d <= calMonth.days; d++) cells.push(d);
  while (cells.length % 7 !== 0) cells.push(null);

  const monthEvents = events.filter(e => e.month === calMonth.short && e.year === calMonth.year);
  const marks = {};
  monthEvents.forEach(e => { marks[e.day] = { kind: e.kind }; });
  const dayEvents = selectedDay ? monthEvents.filter(e => e.day === selectedDay) : [];

  return (
    <div style={{ padding: '18px 20px 0' }}>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(7, 1fr)', gap: 4, marginBottom: 6 }}>
        {wkdays.map(d => (
          <div key={d} className="sbp-meta" style={{ textAlign: 'center', fontSize: 10, letterSpacing: '0.2em', color: 'var(--sbp-text-3)' }}>{d}</div>
        ))}
      </div>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(7, 1fr)', gap: 4 }}>
        {cells.map((d, i) => {
          if (d === null) return <div key={i}/>;
          const mark = marks[d];
          const isSel = d === selectedDay;
          return (
            <button key={i} onClick={() => onDaySelect(isSel ? null : d)} style={{
              aspectRatio: '1', borderRadius: 10, border: '1px solid var(--sbp-border)',
              background: isSel
                ? 'linear-gradient(180deg, color-mix(in oklab, var(--sbp-accent) 35%, transparent), color-mix(in oklab, var(--sbp-blood-500) 25%, transparent))'
                : (mark ? 'rgba(240,233,223,0.04)' : 'transparent'),
              boxShadow: isSel ? '0 0 0 1px var(--sbp-accent), 0 0 16px color-mix(in oklab, var(--sbp-accent) 40%, transparent)' : 'none',
              color: isSel ? 'var(--sbp-fog-100)' : 'var(--sbp-text)',
              cursor: 'pointer',
              display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center',
              padding: 0, fontFamily: 'var(--sbp-font-rustic)', fontWeight: 600, fontSize: 16,
              position: 'relative',
            }}>
              {d}
              {mark && <span style={{
                position: 'absolute', bottom: 4, width: 4, height: 4, borderRadius: '50%',
                background: 'var(--sbp-accent)',
                boxShadow: '0 0 6px var(--sbp-accent)',
              }}/>}
            </button>
          );
        })}
      </div>

      {selectedDay ? (
        <>
          <div className="sbp-rule" style={{ marginTop: 22, marginBottom: 12 }}>
            <span style={{ color: 'var(--sbp-ember-200)' }}>✦</span>
            <span>{selectedDay}. {calMonth.name}</span>
            <span style={{ color: 'var(--sbp-ember-200)' }}>✦</span>
          </div>
          {dayEvents.length === 0 ? (
            <p className="sbp-body" style={{ textAlign: 'center', color: 'var(--sbp-text-3)', padding: '20px 0' }}>
              Kein Termin an diesem Tag.
            </p>
          ) : (
            <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
              {dayEvents.map(ev => <EventListCard key={ev.id} ev={ev} onOpenEvent={onOpenEvent} canEdit={canEdit} onDelete={onEventDelete}/>)}
            </div>
          )}
        </>
      ) : monthEvents.length > 0 ? (
        <>
          <div className="sbp-rule" style={{ marginTop: 22, marginBottom: 12 }}>
            <span style={{ color: 'var(--sbp-ember-200)' }}>✦</span>
            <span>Alle Termine</span>
            <span style={{ color: 'var(--sbp-ember-200)' }}>✦</span>
          </div>
          <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
            {monthEvents.map(ev => <EventListCard key={ev.id} ev={ev} onOpenEvent={onOpenEvent} canEdit={canEdit} onDelete={onEventDelete}/>)}
          </div>
        </>
      ) : (
        <p className="sbp-body" style={{ textAlign: 'center', color: 'var(--sbp-text-3)', padding: '30px 0' }}>
          Keine Termine in diesem Monat.
        </p>
      )}
    </div>
  );
}

function EventsList({ events, onOpenEvent, canEdit, onEventDelete }) {
  return (
    <div style={{ padding: '14px 20px 0', display: 'flex', flexDirection: 'column', gap: 10 }}>
      {events.map(ev => <EventListCard key={ev.id} ev={ev} onOpenEvent={onOpenEvent} canEdit={canEdit} onDelete={onEventDelete}/>)}
    </div>
  );
}

// ─────────────────── ADD EVENT ───────────────────
function AddEventSheet({ onCancel, onSave, prefill }) {
  const [f, setF] = React.useState({
    title: '', day: prefill?.day ?? '1', month: prefill?.month ?? 'Jän',
    year: prefill?.year ?? new Date().getFullYear(), time: '19:00',
    location: '', kind: 'Lauf', desc: '',
  });
  const [saving, setSaving] = React.useState(false);
  const [error, setError] = React.useState('');
  const set = (k) => (e) => setF(prev => ({ ...prev, [k]: e.target.value }));
  const submit = async () => {
    if (!f.title.trim()) { setError('Titel ist erforderlich.'); return; }
    setSaving(true); setError('');
    try {
      const token = sessionStorage.getItem('sbp_token');
      const newEv = await sbpApi('POST', '/events', {
        ...f, day: parseInt(f.day, 10) || 1, year: parseInt(f.year, 10) || new Date().getFullYear(),
        location: f.location || 'Schafberg',
      }, token);
      onSave(newEv);
    } catch (err) {
      setError(err.message);
      setSaving(false);
    }
  };
  const kinds = ['Lauf','Termin','Treff','Sonstiges'];
  const months = ['Jän','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'];
  return (
    <div onClick={onCancel} style={{
      position: 'absolute', inset: 0, zIndex: 100,
      background: 'rgba(0,0,0,0.6)', backdropFilter: 'blur(4px)',
      display: 'flex', alignItems: 'flex-end', animation: 'sbp-fade-in 0.2s ease'
    }}>
      <div onClick={e => e.stopPropagation()} style={{
        width: '100%', maxHeight: '92%',
        background: 'linear-gradient(180deg, var(--sbp-night-2), var(--sbp-night-1))',
        borderTopLeftRadius: 24, borderTopRightRadius: 24,
        border: '1px solid var(--sbp-border-strong)', borderBottom: 0,
        boxShadow: '0 -20px 60px rgba(0,0,0,0.5), 0 -4px 30px color-mix(in oklab, var(--sbp-accent) 20%, transparent)',
        overflow: 'auto', padding: '8px 22px 28px',
        animation: 'sbp-fade-in 0.3s ease',
      }}>
        <div style={{ width: 40, height: 4, background: 'var(--sbp-fog-500)', borderRadius: 2, margin: '8px auto 18px' }}/>
        <span className="sbp-eyebrow">Neuer Termin</span>
        <h2 className="sbp-h2" style={{ fontFamily: 'var(--sbp-font-rustic)', fontSize: 26, fontWeight: 600, marginTop: 6, marginBottom: 18 }}>Termin eintragen</h2>
        <label className="sbp-label">Titel</label>
        <input className="sbp-input" placeholder="z. B. Maskensegnung" value={f.title} onChange={set('title')}/>
        <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: 8, marginTop: 14 }}>
          <div>
            <label className="sbp-label">Tag</label>
            <input className="sbp-input" value={f.day} onChange={set('day')}/>
          </div>
          <div>
            <label className="sbp-label">Monat</label>
            <select className="sbp-input" value={f.month} onChange={set('month')}>
              {months.map(m => <option key={m} value={m}>{m}</option>)}
            </select>
          </div>
          <div>
            <label className="sbp-label">Jahr</label>
            <input className="sbp-input" value={f.year} onChange={set('year')}/>
          </div>
        </div>
        <label className="sbp-label" style={{ marginTop: 14 }}>Uhrzeit</label>
        <input className="sbp-input" value={f.time} onChange={set('time')}/>
        <label className="sbp-label" style={{ marginTop: 14 }}>Ort</label>
        <input className="sbp-input" placeholder="Ort, Straße …" value={f.location} onChange={set('location')}/>
        <label className="sbp-label" style={{ marginTop: 14 }}>Art</label>
        <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap' }}>
          {kinds.map(k => (
            <button key={k} onClick={() => setF(p => ({ ...p, kind: k }))} className="sbp-chip" style={{
              cursor: 'pointer',
              background: f.kind === k ? 'color-mix(in oklab, var(--sbp-accent) 25%, transparent)' : undefined,
              borderColor: f.kind === k ? 'color-mix(in oklab, var(--sbp-accent) 50%, transparent)' : undefined,
              color: f.kind === k ? 'var(--sbp-ember-100)' : undefined,
            }}>{k}</button>
          ))}
        </div>
        <label className="sbp-label" style={{ marginTop: 14 }}>Beschreibung</label>
        <textarea className="sbp-input" rows={3} value={f.desc} onChange={set('desc')} placeholder="Kurze Beschreibung …"/>
        {error && <p style={{ color: 'var(--sbp-ember-300)', fontSize: 13, marginTop: 10 }}>{error}</p>}
        <div style={{ display: 'flex', gap: 10, marginTop: 22 }}>
          <button onClick={onCancel} className="sbp-btn sbp-btn--ghost" style={{ flex: 1 }}>Abbrechen</button>
          <button onClick={submit} disabled={saving} className="sbp-btn sbp-btn--primary" style={{ flex: 2 }}>
            <IconCheck size={16}/>{saving ? 'Speichern…' : 'Speichern'}
          </button>
        </div>
      </div>
    </div>
  );
}

function EventListCard({ ev, onOpenEvent, canEdit, onDelete }) {
  const handleDelete = async (e) => {
    e.stopPropagation();
    const token = sessionStorage.getItem('sbp_token');
    try {
      await sbpApi('DELETE', `/events/${ev.id}`, null, token);
      onDelete?.(ev.id);
    } catch (_) {}
  };
  return (
    <button onClick={() => onOpenEvent(ev)} className="sbp-card" style={{
      display: 'flex', gap: 14, padding: 14, textAlign: 'left', cursor: 'pointer', color: 'var(--sbp-text)',
      position: 'relative',
    }}>
      <div style={{
        width: 56, minWidth: 56, height: 64, borderRadius: 10,
        border: '1px solid var(--sbp-border-strong)',
        background: 'linear-gradient(180deg, color-mix(in oklab, var(--sbp-accent) 25%, transparent), transparent)',
        display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center',
      }}>
        <span className="sbp-meta" style={{ color: 'var(--sbp-ember-200)' }}>{ev.month}</span>
        <span style={{ fontSize: 24, fontWeight: 700, lineHeight: 1, fontFamily: 'var(--sbp-font-rustic)' }}>{ev.day}</span>
        <span className="sbp-meta" style={{ fontSize: 10 }}>{ev.year}</span>
      </div>
      <div style={{ flex: 1, minWidth: 0 }}>
        <div style={{ display: 'flex', gap: 6, marginBottom: 6 }}>
          <span className="sbp-chip sbp-chip--ember">{ev.kind}</span>
        </div>
        <div className="sbp-h3" style={{ marginBottom: 4 }}>{ev.title}</div>
        <div className="sbp-meta" style={{ display: 'flex', gap: 12 }}>
          <span style={{ display: 'inline-flex', gap: 4, alignItems: 'center' }}><IconClock size={12}/>{ev.time}</span>
          <span style={{ display: 'inline-flex', gap: 4, alignItems: 'center', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}><IconLocation size={12}/>{ev.location}</span>
        </div>
      </div>
      {canEdit && (
        <button onClick={handleDelete} style={{
          position: 'absolute', top: 8, right: 8, width: 28, height: 28, borderRadius: 7,
          background: 'rgba(0,0,0,0.55)', backdropFilter: 'blur(8px)',
          border: '1px solid rgba(255,255,255,0.12)',
          color: 'var(--sbp-text-3)', cursor: 'pointer',
          display: 'flex', alignItems: 'center', justifyContent: 'center',
        }}>
          <IconTrash size={13}/>
        </button>
      )}
    </button>
  );
}

// ─────────────────── ADD NEWS SHEET ───────────────────
function AddNewsSheet({ token, onCancel, onSave }) {
  const [f, setF] = React.useState({ eyebrow: '', title: '', tag: 'News', excerpt: '', body: '' });
  const [saving, setSaving] = React.useState(false);
  const [error, setError] = React.useState('');
  const set = (k) => (e) => setF(prev => ({ ...prev, [k]: e.target.value }));

  const submit = async () => {
    if (!f.title.trim()) { setError('Titel ist erforderlich.'); return; }
    setSaving(true);
    setError('');
    try {
      await sbpApi('POST', '/news', f, token);
      onSave();
    } catch (err) {
      setError(err.message);
      setSaving(false);
    }
  };

  return (
    <div onClick={onCancel} style={{
      position: 'absolute', inset: 0, zIndex: 100,
      background: 'rgba(0,0,0,0.6)', backdropFilter: 'blur(4px)',
      display: 'flex', alignItems: 'flex-end', animation: 'sbp-fade-in 0.2s ease'
    }}>
      <div onClick={e => e.stopPropagation()} style={{
        width: '100%', maxHeight: '92%',
        background: 'linear-gradient(180deg, var(--sbp-night-2), var(--sbp-night-1))',
        borderTopLeftRadius: 24, borderTopRightRadius: 24,
        border: '1px solid var(--sbp-border-strong)', borderBottom: 0,
        boxShadow: '0 -20px 60px rgba(0,0,0,0.5), 0 -4px 30px color-mix(in oklab, var(--sbp-accent) 20%, transparent)',
        overflow: 'auto', padding: '8px 22px 28px',
        animation: 'sbp-fade-in 0.3s ease',
      }}>
        <div style={{ width: 40, height: 4, background: 'var(--sbp-fog-500)', borderRadius: 2, margin: '8px auto 18px' }}/>
        <span className="sbp-eyebrow">Neuer Beitrag</span>
        <h2 className="sbp-h2" style={{ fontFamily: 'var(--sbp-font-rustic)', fontSize: 26, fontWeight: 600, marginTop: 6, marginBottom: 18 }}>Beitrag erstellen</h2>

        {error && (
          <div style={{
            padding: '8px 12px', borderRadius: 8, marginBottom: 14, fontSize: 13,
            background: 'color-mix(in oklab, var(--sbp-blood-500) 25%, transparent)',
            border: '1px solid color-mix(in oklab, var(--sbp-blood-400) 40%, transparent)',
            color: 'var(--sbp-ember-100)',
          }}>{error}</div>
        )}

        <label className="sbp-label">Titel *</label>
        <input className="sbp-input" placeholder="Titel des Beitrags" value={f.title} onChange={set('title')}/>

        <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 10, marginTop: 14 }}>
          <div>
            <label className="sbp-label">Eyebrow</label>
            <input className="sbp-input" placeholder="z. B. Vorstand" value={f.eyebrow} onChange={set('eyebrow')}/>
          </div>
          <div>
            <label className="sbp-label">Tag (Filter)</label>
            <input className="sbp-input" placeholder="z. B. News" value={f.tag} onChange={set('tag')}/>
          </div>
        </div>

        <label className="sbp-label" style={{ marginTop: 14 }}>Kurztext</label>
        <textarea className="sbp-input" rows={2} value={f.excerpt} onChange={set('excerpt')} placeholder="Kurze Beschreibung für die Listenansicht …"/>

        <label className="sbp-label" style={{ marginTop: 14 }}>Volltext</label>
        <textarea className="sbp-input" rows={5} value={f.body} onChange={set('body')} placeholder="Vollständiger Beitragstext …"/>

        <div style={{ display: 'flex', gap: 10, marginTop: 22 }}>
          <button onClick={onCancel} className="sbp-btn sbp-btn--ghost" style={{ flex: 1 }}>Abbrechen</button>
          <button onClick={submit} disabled={saving} className="sbp-btn sbp-btn--primary" style={{ flex: 2 }}>
            <IconCheck size={16}/>{saving ? 'Speichern…' : 'Veröffentlichen'}
          </button>
        </div>
      </div>
    </div>
  );
}

// ─────────────────── EVENT BOTTOM SHEET ───────────────────
function EventSheet({ event, onClose, bookmarks = { news: {}, events: {} }, onBookmarkToggle, role = 'user', onDelete, onUpdate, rsvps = {}, onRsvp }) {
  if (!event) return null;
  const canEdit = role === 'moderator' || role === 'admin';
  const [showDelete, setShowDelete] = React.useState(false);
  const [showEdit, setShowEdit] = React.useState(false);
  const evBookmarked = !!(bookmarks.events?.[String(event.id)]);
  const toggleEvBookmark = () => onBookmarkToggle?.('events', event.id, event);
  const myRsvp = rsvps[String(event.id)] || null;

  const doDelete = async () => {
    const token = sessionStorage.getItem('sbp_token');
    try {
      await sbpApi('DELETE', `/events/${event.id}`, null, token);
      onDelete?.(event.id);
      onClose();
    } catch (_) { setShowDelete(false); }
  };
  return (
    <div onClick={onClose} style={{
      position: 'absolute', inset: 0, zIndex: 100,
      background: 'rgba(0,0,0,0.6)', backdropFilter: 'blur(4px)',
      display: 'flex', alignItems: 'flex-end', animation: 'sbp-fade-in 0.2s ease'
    }}>
      <div onClick={e => e.stopPropagation()} style={{
        width: '100%', maxHeight: '85%',
        background: 'linear-gradient(180deg, var(--sbp-night-2), var(--sbp-night-1))',
        borderTopLeftRadius: 24, borderTopRightRadius: 24,
        border: '1px solid var(--sbp-border-strong)', borderBottom: 0,
        boxShadow: '0 -20px 60px rgba(0,0,0,0.5), 0 -4px 30px color-mix(in oklab, var(--sbp-accent) 20%, transparent)',
        overflow: 'auto', padding: '8px 0 32px',
        animation: 'sbp-fade-in 0.3s ease',
      }}>
        <div style={{ width: 40, height: 4, background: 'var(--sbp-fog-500)', borderRadius: 2, margin: '8px auto 14px' }}/>
        <div style={{ position: 'relative', height: 160, overflow: 'hidden', margin: '0 20px', borderRadius: 14 }}>
          <div className="sbp-img" style={{ position: 'absolute', inset: 0 }}/>
          <div style={{
            position: 'absolute', inset: 0,
            background: 'linear-gradient(180deg, transparent 40%, rgba(10,5,6,0.85) 100%)'
          }}/>
          <div style={{ position: 'absolute', bottom: 12, left: 14 }}>
            <span className="sbp-chip sbp-chip--ember">{event.kind}</span>
          </div>
        </div>
        <div style={{ padding: '18px 22px 0' }}>
          <h2 className="sbp-h2" style={{ fontFamily: 'var(--sbp-font-rustic)', fontSize: 26, fontWeight: 600 }}>{event.title}</h2>
          <div style={{ marginTop: 14, display: 'flex', flexDirection: 'column', gap: 10 }}>
            <div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
              <div className="sbp-icon-btn" style={{ width: 36, height: 36, color: 'var(--sbp-ember-200)' }}><IconClock size={18}/></div>
              <div>
                <div className="sbp-meta">Zeit</div>
                <div className="sbp-body" style={{ fontWeight: 600 }}>{event.day}. {event.month} {event.year} · {event.time}</div>
              </div>
            </div>
            <div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
              <div className="sbp-icon-btn" style={{ width: 36, height: 36, color: 'var(--sbp-ember-200)' }}><IconLocation size={18}/></div>
              <div>
                <div className="sbp-meta">Ort</div>
                <div className="sbp-body" style={{ fontWeight: 600 }}>{event.location}</div>
              </div>
            </div>
          </div>
          <p className="sbp-body" style={{ marginTop: 18, color: 'var(--sbp-text-2)' }}>{event.desc}</p>
          <div style={{ display: 'flex', flexDirection: 'column', gap: 10, marginTop: 22 }}>
            {/* RSVP Buttons */}
            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 10 }}>
              <button onClick={() => onRsvp?.(event.id, 'zusagen')} style={{
                display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,
                padding: '13px 10px', borderRadius: 10, cursor: 'pointer', fontWeight: 700,
                fontFamily: 'var(--sbp-font-display)', fontSize: 12, letterSpacing: '0.14em', textTransform: 'uppercase',
                background: myRsvp === 'zusagen'
                  ? 'color-mix(in oklab, #22c55e 30%, transparent)'
                  : 'rgba(255,255,255,0.04)',
                border: myRsvp === 'zusagen'
                  ? '1px solid color-mix(in oklab, #22c55e 60%, transparent)'
                  : '1px solid var(--sbp-border)',
                color: myRsvp === 'zusagen' ? '#4ade80' : 'var(--sbp-text-2)',
                boxShadow: myRsvp === 'zusagen' ? '0 0 16px color-mix(in oklab, #22c55e 25%, transparent)' : 'none',
                transition: 'all 0.2s ease',
              }}>
                <IconThumbUp size={15}/>Zusagen
              </button>
              <button onClick={() => onRsvp?.(event.id, 'absagen')} style={{
                display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,
                padding: '13px 10px', borderRadius: 10, cursor: 'pointer', fontWeight: 700,
                fontFamily: 'var(--sbp-font-display)', fontSize: 12, letterSpacing: '0.14em', textTransform: 'uppercase',
                background: myRsvp === 'absagen'
                  ? 'color-mix(in oklab, var(--sbp-blood-500) 35%, transparent)'
                  : 'rgba(255,255,255,0.04)',
                border: myRsvp === 'absagen'
                  ? '1px solid color-mix(in oklab, var(--sbp-blood-400) 60%, transparent)'
                  : '1px solid var(--sbp-border)',
                color: myRsvp === 'absagen' ? 'var(--sbp-blood-400)' : 'var(--sbp-text-2)',
                boxShadow: myRsvp === 'absagen' ? '0 0 16px color-mix(in oklab, var(--sbp-blood-500) 30%, transparent)' : 'none',
                transition: 'all 0.2s ease',
              }}>
                <IconThumbDown size={15}/>Absagen
              </button>
            </div>

            {/* Merken-Button */}
            <button onClick={toggleEvBookmark} className="sbp-btn sbp-btn--ghost" style={{
              width: '100%',
              color: evBookmarked ? 'var(--sbp-accent)' : undefined,
              borderColor: evBookmarked ? 'color-mix(in oklab, var(--sbp-accent) 50%, transparent)' : undefined,
            }}>
              <IconHeart size={16} fill={evBookmarked ? 'currentColor' : 'none'}/>
              {evBookmarked ? 'Gemerkt ✓' : 'Merken'}
            </button>
          </div>

          {canEdit && (
            <div style={{ display: 'flex', flexDirection: 'column', gap: 10, marginTop: 22 }}>
              <div style={{ borderTop: '1px solid var(--sbp-border)', paddingTop: 18 }}>
                <div className="sbp-eyebrow" style={{ marginBottom: 12 }}>Verwaltung</div>
                <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
                  <button onClick={() => setShowEdit(true)} className="sbp-btn sbp-btn--ghost" style={{ width: '100%' }}>
                    <IconEdit size={16}/>Termin bearbeiten
                  </button>
                  <button onClick={() => setShowDelete(true)} style={{
                    width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,
                    padding: '12px 16px', borderRadius: 10, cursor: 'pointer',
                    background: 'color-mix(in oklab, var(--sbp-blood-500) 20%, transparent)',
                    border: '1px solid color-mix(in oklab, var(--sbp-blood-400) 40%, transparent)',
                    color: 'var(--sbp-blood-400)',
                    fontFamily: 'var(--sbp-font-display)', fontSize: 12, letterSpacing: '0.16em',
                    textTransform: 'uppercase', fontWeight: 600,
                  }}>
                    <IconTrash size={16}/>Termin löschen
                  </button>
                </div>
              </div>
            </div>
          )}
        </div>
      </div>

      {showDelete && (
        <ConfirmDeleteModal
          message="Wollen Sie diesen Termin wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden."
          onCancel={() => setShowDelete(false)}
          onConfirm={doDelete}
        />
      )}
      {showEdit && (
        <EditEventSheet
          event={event}
          onCancel={() => setShowEdit(false)}
          onSave={(updated) => { onUpdate?.(updated); setShowEdit(false); }}
        />
      )}
    </div>
  );
}

// ─────────────────── EDIT EVENT SHEET ────────────────────────
function EditEventSheet({ event, onCancel, onSave }) {
  const [f, setF] = React.useState({
    title:    event.title    || '',
    day:      String(event.day),
    month:    event.month    || 'Jän',
    year:     event.year     || new Date().getFullYear(),
    time:     event.time     || '19:00',
    location: event.location || '',
    kind:     event.kind     || 'Termin',
    desc:     event.desc     || '',
  });
  const [saving, setSaving] = React.useState(false);
  const [error, setError]   = React.useState('');
  const set = (k) => (e) => setF(prev => ({ ...prev, [k]: e.target.value }));
  const kinds  = ['Lauf','Termin','Treff','Sonstiges'];
  const months = ['Jän','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'];

  const submit = async () => {
    if (!f.title.trim()) { setError('Titel ist erforderlich.'); return; }
    setSaving(true); setError('');
    try {
      const token = sessionStorage.getItem('sbp_token');
      const updated = await sbpApi('PUT', `/events/${event.id}`, {
        ...f, day: parseInt(f.day, 10) || 1, year: parseInt(f.year, 10) || new Date().getFullYear(),
      }, token);
      onSave(updated);
    } catch (err) { setError(err.message); setSaving(false); }
  };

  return (
    <div onClick={onCancel} style={{
      position: 'absolute', inset: 0, zIndex: 200,
      background: 'rgba(0,0,0,0.6)', backdropFilter: 'blur(4px)',
      display: 'flex', alignItems: 'flex-end', animation: 'sbp-fade-in 0.2s ease'
    }}>
      <div onClick={e => e.stopPropagation()} style={{
        width: '100%', maxHeight: '92%',
        background: 'linear-gradient(180deg, var(--sbp-night-2), var(--sbp-night-1))',
        borderTopLeftRadius: 24, borderTopRightRadius: 24,
        border: '1px solid var(--sbp-border-strong)', borderBottom: 0,
        boxShadow: '0 -20px 60px rgba(0,0,0,0.5)',
        overflow: 'auto', padding: '8px 22px 28px',
        animation: 'sbp-fade-in 0.3s ease',
      }}>
        <div style={{ width: 40, height: 4, background: 'var(--sbp-fog-500)', borderRadius: 2, margin: '8px auto 18px' }}/>
        <span className="sbp-eyebrow">Termin bearbeiten</span>
        <h2 className="sbp-h2" style={{ fontFamily: 'var(--sbp-font-rustic)', fontSize: 26, fontWeight: 600, marginTop: 6, marginBottom: 18 }}>Termin ändern</h2>
        <label className="sbp-label">Titel</label>
        <input className="sbp-input" value={f.title} onChange={set('title')}/>
        <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: 8, marginTop: 14 }}>
          <div>
            <label className="sbp-label">Tag</label>
            <input className="sbp-input" value={f.day} onChange={set('day')}/>
          </div>
          <div>
            <label className="sbp-label">Monat</label>
            <select className="sbp-input" value={f.month} onChange={set('month')}>
              {months.map(m => <option key={m} value={m}>{m}</option>)}
            </select>
          </div>
          <div>
            <label className="sbp-label">Jahr</label>
            <input className="sbp-input" value={f.year} onChange={set('year')}/>
          </div>
        </div>
        <label className="sbp-label" style={{ marginTop: 14 }}>Uhrzeit</label>
        <input className="sbp-input" value={f.time} onChange={set('time')}/>
        <label className="sbp-label" style={{ marginTop: 14 }}>Ort</label>
        <input className="sbp-input" value={f.location} onChange={set('location')}/>
        <label className="sbp-label" style={{ marginTop: 14 }}>Art</label>
        <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap' }}>
          {kinds.map(k => (
            <button key={k} onClick={() => setF(p => ({ ...p, kind: k }))} className="sbp-chip" style={{
              cursor: 'pointer',
              background: f.kind === k ? 'color-mix(in oklab, var(--sbp-accent) 25%, transparent)' : undefined,
              borderColor: f.kind === k ? 'color-mix(in oklab, var(--sbp-accent) 50%, transparent)' : undefined,
              color: f.kind === k ? 'var(--sbp-ember-100)' : undefined,
            }}>{k}</button>
          ))}
        </div>
        <label className="sbp-label" style={{ marginTop: 14 }}>Beschreibung</label>
        <textarea className="sbp-input" rows={3} value={f.desc} onChange={set('desc')}/>
        {error && <p style={{ color: 'var(--sbp-ember-300)', fontSize: 13, marginTop: 10 }}>{error}</p>}
        <div style={{ display: 'flex', gap: 10, marginTop: 22 }}>
          <button onClick={onCancel} className="sbp-btn sbp-btn--ghost" style={{ flex: 1 }}>Abbrechen</button>
          <button onClick={submit} disabled={saving} className="sbp-btn sbp-btn--primary" style={{ flex: 2 }}>
            <IconCheck size={16}/>{saving ? 'Speichern…' : 'Speichern'}
          </button>
        </div>
      </div>
    </div>
  );
}

// ─────────────────── NOTIFICATIONS SHEET ─────────────────────
function NotificationsSheet({ notifications, onClose, onMarkAllRead, onDeleteNotification, onNavToNews, onOpenEvent }) {
  React.useEffect(() => {
    if (notifications.some(n => !n.is_read)) onMarkAllRead();
  }, []);

  const fmtAge = (dt) => {
    const diff = (Date.now() - new Date(dt)) / 1000;
    if (diff < 60)    return 'Gerade eben';
    if (diff < 3600)  return `Vor ${Math.floor(diff / 60)} Min.`;
    if (diff < 86400) return `Vor ${Math.floor(diff / 3600)} Std.`;
    const d = new Date(dt);
    return d.toLocaleDateString('de-AT', { day: 'numeric', month: 'short' });
  };

  return (
    <div onClick={onClose} style={{
      position: 'absolute', inset: 0, zIndex: 100,
      background: 'rgba(0,0,0,0.6)', backdropFilter: 'blur(4px)',
      display: 'flex', alignItems: 'flex-end', animation: 'sbp-fade-in 0.2s ease',
    }}>
      <div onClick={e => e.stopPropagation()} style={{
        width: '100%', maxHeight: '80%',
        background: 'linear-gradient(180deg, var(--sbp-night-2), var(--sbp-night-1))',
        borderTopLeftRadius: 24, borderTopRightRadius: 24,
        border: '1px solid var(--sbp-border-strong)', borderBottom: 0,
        boxShadow: '0 -20px 60px rgba(0,0,0,0.5)',
        overflow: 'auto', padding: '8px 0 32px',
        animation: 'sbp-fade-in 0.3s ease',
      }}>
        <div style={{ width: 40, height: 4, background: 'var(--sbp-fog-500)', borderRadius: 2, margin: '8px auto 14px' }}/>
        <div style={{
          padding: '0 20px 14px', display: 'flex', alignItems: 'center', justifyContent: 'space-between',
          borderBottom: '1px solid var(--sbp-border)',
        }}>
          <div className="sbp-display" style={{ fontSize: 13, letterSpacing: '0.22em' }}>Benachrichtigungen</div>
          <button onClick={onClose} className="sbp-icon-btn" style={{ width: 34, height: 34 }}>
            <IconClose size={16}/>
          </button>
        </div>

        {notifications.length === 0 ? (
          <div style={{ padding: '50px 32px', textAlign: 'center' }}>
            <div style={{
              width: 64, height: 64, borderRadius: '50%', margin: '0 auto 16px',
              background: 'color-mix(in oklab, var(--sbp-accent) 10%, transparent)',
              border: '1px solid color-mix(in oklab, var(--sbp-accent) 25%, transparent)',
              display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'var(--sbp-text-3)',
            }}>
              <IconBell size={26}/>
            </div>
            <p className="sbp-body" style={{ color: 'var(--sbp-text-3)' }}>Keine Benachrichtigungen vorhanden.</p>
          </div>
        ) : (
          <div>
            {notifications.map(n => (
              <div key={n.id} style={{
                display: 'flex', alignItems: 'stretch',
                background: n.is_read ? 'transparent' : 'color-mix(in oklab, var(--sbp-accent) 5%, transparent)',
                borderBottom: '1px solid var(--sbp-border)',
              }}>
                {/* Klickbarer Bereich */}
                <button onClick={() => n.type === 'event' ? onOpenEvent(n.item_id) : onNavToNews()} style={{
                  flex: 1, padding: '14px 0 14px 20px',
                  background: 'transparent', border: 0,
                  textAlign: 'left', cursor: 'pointer', color: 'var(--sbp-text)',
                  display: 'flex', gap: 14, alignItems: 'flex-start',
                }}>
                  {/* Typ-Icon */}
                  <div style={{
                    width: 42, height: 42, borderRadius: 12, flexShrink: 0,
                    background: n.type === 'news'
                      ? 'color-mix(in oklab, var(--sbp-accent) 15%, transparent)'
                      : 'color-mix(in oklab, #22c55e 12%, transparent)',
                    border: `1px solid ${n.type === 'news'
                      ? 'color-mix(in oklab, var(--sbp-accent) 35%, transparent)'
                      : 'color-mix(in oklab, #22c55e 30%, transparent)'}`,
                    display: 'flex', alignItems: 'center', justifyContent: 'center',
                    color: n.type === 'news' ? 'var(--sbp-ember-200)' : '#4ade80',
                  }}>
                    {n.type === 'news' ? <IconNews size={18}/> : <IconEvents size={18}/>}
                  </div>
                  {/* Text */}
                  <div style={{ flex: 1, minWidth: 0 }}>
                    <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 8, marginBottom: 3 }}>
                      <span className="sbp-body" style={{ fontWeight: 600, fontSize: 14 }}>{n.title}</span>
                      {!n.is_read && (
                        <span style={{
                          width: 8, height: 8, borderRadius: '50%', flexShrink: 0, marginTop: 5,
                          background: 'var(--sbp-accent)', boxShadow: '0 0 6px var(--sbp-accent)',
                        }}/>
                      )}
                    </div>
                    <div className="sbp-meta" style={{ textTransform: 'none', letterSpacing: 0 }}>
                      {n.type === 'news' ? 'Neuer Beitrag' : 'Neuer Termin'} · {n.category}
                    </div>
                    <div className="sbp-meta" style={{ marginTop: 2, textTransform: 'none', letterSpacing: 0, color: 'var(--sbp-text-3)' }}>
                      {fmtAge(n.created_at)}
                    </div>
                  </div>
                </button>
                {/* Löschen-Button */}
                <button onClick={() => onDeleteNotification(n.id)} style={{
                  padding: '0 16px', background: 'transparent', border: 0,
                  cursor: 'pointer', color: 'var(--sbp-text-3)', flexShrink: 0,
                  display: 'flex', alignItems: 'center', justifyContent: 'center',
                  transition: 'color 0.15s',
                }}
                  onMouseEnter={e => e.currentTarget.style.color = '#f87171'}
                  onMouseLeave={e => e.currentTarget.style.color = 'var(--sbp-text-3)'}
                  title="Löschen"
                >
                  <IconClose size={14}/>
                </button>
              </div>
            ))}
          </div>
        )}
      </div>
    </div>
  );
}

Object.assign(window, { ScreenHome, ScreenNews, ScreenArticle, ScreenEvents, EventSheet, AddNewsSheet, EditNewsSheet, ConfirmDeleteModal, NotificationsSheet });
