feat: roter Vollbreiten-Banner für AUSVERKAUFT auf Cover
- CSS: .story-ausverkauft-badge → Vollbreite (top:0; left:0; right:0)
mit Rot-Gradient, grösserem Text, z-index:7
- Banner ersetzt die Zeit-Leiste bei ausverkauften Karten
- Neues Markup: 🚫 AUSVERKAUFT · Spielname
- Detailseite: eigener .detail-ausverkauft-banner mit border-radius
- Bugfix: lokales 'import re' in api_submit entfernt (UnboundLocalError)
This commit is contained in:
@@ -1821,11 +1821,12 @@ def public_frontend():
|
||||
pass
|
||||
|
||||
text_only_class = " text-only" if not media_first else ""
|
||||
is_ausverkauft = r["category"] == "ausverkauft" and r["spiel_titel"]
|
||||
time_block = ""
|
||||
if time_html:
|
||||
if time_html and not is_ausverkauft:
|
||||
time_overlay = f'<div class="story-time-overlay">{time_html}</div>'
|
||||
time_block = time_overlay # Always overlay now
|
||||
elif not media_first:
|
||||
elif not media_first and not is_ausverkauft:
|
||||
time_block = ''
|
||||
|
||||
if not media_first:
|
||||
@@ -1834,7 +1835,7 @@ def public_frontend():
|
||||
<article class="story-card text-only">
|
||||
""" + time_block + """
|
||||
""" + (f'<div class="story-halle-badge"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2.5" stroke-linecap="round" style="vertical-align:middle;margin-right:2px;"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg> {r["halle"]}</div>' if r["halle"] else '') + """
|
||||
""" + (f'<div class="story-ausverkauft-badge">🚫 AUSVERKAUFT: {r["spiel_titel"]}</div>' if r["category"] == "ausverkauft" and r["spiel_titel"] else '') + """
|
||||
""" + (f'<div class="story-ausverkauft-badge"><span class="badge-icon">🚫</span> AUSVERKAUFT<span class="badge-title"> · {r["spiel_titel"]}</span></div>' if r["category"] == "ausverkauft" and r["spiel_titel"] else '') + """
|
||||
<div class="card-content">
|
||||
<p class="story-preview">""" + preview + """</p>
|
||||
<div class="card-stats">
|
||||
@@ -1853,7 +1854,7 @@ def public_frontend():
|
||||
cards += f"""<article class="story-card">
|
||||
""" + media_first + time_block + """
|
||||
""" + (f'<div class="story-halle-badge"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2.5" stroke-linecap="round" style="vertical-align:middle;margin-right:2px;"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg> {r["halle"]}</div>' if r["halle"] else '') + """
|
||||
""" + (f'<div class="story-ausverkauft-badge">🚫 AUSVERKAUFT: {r["spiel_titel"]}</div>' if r["category"] == "ausverkauft" and r["spiel_titel"] else '') + """
|
||||
""" + (f'<div class="story-ausverkauft-badge"><span class="badge-icon">🚫</span> AUSVERKAUFT<span class="badge-title"> · {r["spiel_titel"]}</span></div>' if r["category"] == "ausverkauft" and r["spiel_titel"] else '') + """
|
||||
<div class="card-content">
|
||||
<p class="story-preview">""" + preview + """</p>
|
||||
<div class="card-stats">
|
||||
@@ -1934,7 +1935,9 @@ def public_frontend():
|
||||
.story-card video { width:100%; height:auto; max-height:600px; object-fit:contain; display:block; background:#000; }
|
||||
.story-card { position:relative; }
|
||||
.story-halle-badge { position:absolute; top:0; right:0; background:#20228a; color:#fff; padding:0.25rem 0.65rem; border-radius:0 0 0 5px; font-size:0.78rem; font-weight:700; letter-spacing:0.03em; z-index:5; box-shadow:0 2px 6px rgba(0,0,0,0.3); }
|
||||
.story-ausverkauft-badge { position:absolute; top:0; left:0; background:#dc3545; color:#fff; padding:0.3rem 0.7rem; border-radius:0 0 5px 0; font-size:0.78rem; font-weight:700; letter-spacing:0.02em; z-index:5; box-shadow:0 2px 6px rgba(0,0,0,0.3); }
|
||||
.story-ausverkauft-badge { position:absolute; top:0; left:0; right:0; z-index:7; background:linear-gradient(180deg,#dc3545 0%,#b02a37 100%); color:#fff; padding:0.5rem 1rem; font-size:0.8rem; font-weight:800; letter-spacing:0.12em; text-align:center; box-shadow:0 2px 12px rgba(220,53,69,0.5); display:flex; align-items:center; justify-content:center; gap:0.5rem; flex-wrap:wrap; }
|
||||
.story-ausverkauft-badge .badge-icon { font-size:0.95rem; }
|
||||
.story-ausverkauft-badge .badge-title { font-weight:500; letter-spacing:0.02em; font-size:0.72rem; opacity:0.9; }
|
||||
.card-content { padding:0.45rem 0.85rem 0.55rem; display:flex; flex-direction:column; gap:0.2rem; }
|
||||
.story-meta { display:flex; align-items:center; gap:0.4rem; flex-wrap:wrap; padding-top:0.3rem; margin-top:0.25rem; border-top:1px solid #f0ede6; }
|
||||
.story-type { font-size:0.8rem; }
|
||||
@@ -3194,7 +3197,9 @@ def public_detail(sub_id: int):
|
||||
.detail-container {{ max-width:720px; margin:2rem auto; padding:0 1.5rem; }}
|
||||
.back-link {{ display:inline-block; color:#20228a; text-decoration:none; font-weight:600; margin-bottom:1.5rem; font-size:0.9rem; }}
|
||||
.back-link:hover {{ text-decoration:underline; }}
|
||||
.detail-card {{ background:#fff; border-radius:16px; padding:2rem; box-shadow:0 4px 20px rgba(0,0,0,0.06); }}
|
||||
.detail-card {{ background:#fff; border-radius:16px; padding:2rem; box-shadow:0 4px 20px rgba(0,0,0,0.06); position:relative; }}
|
||||
.detail-ausverkauft-banner {{ position:absolute; top:0; left:0; right:0; z-index:2; background:linear-gradient(180deg,#dc3545 0%,#b02a37 100%); color:#fff; padding:0.5rem 1rem; font-size:0.8rem; font-weight:800; letter-spacing:0.12em; text-align:center; border-radius:16px 16px 0 0; display:flex; align-items:center; justify-content:center; gap:0.5rem; flex-wrap:wrap; }}
|
||||
.detail-ausverkauft-banner .badge-title {{ font-weight:500; letter-spacing:0.02em; font-size:0.72rem; opacity:0.9; }}
|
||||
.detail-meta {{ display:flex; align-items:center; gap:0.8rem; margin-bottom:1.5rem; flex-wrap:wrap; }}
|
||||
.detail-type {{ font-size:1.5rem; }}
|
||||
.detail-author {{ font-weight:700; color:#20228a; font-size:1rem; }}
|
||||
@@ -3223,7 +3228,7 @@ def public_detail(sub_id: int):
|
||||
<main class="detail-container">
|
||||
<a href="/" class="back-link">← Zurück zur Übersicht</a>
|
||||
<article class="detail-card">
|
||||
{"".join([f'<div class="detail-halle"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2.5" stroke-linecap="round" style="vertical-align:middle;margin-right:2px;"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg> {row["halle"]}</div>' if row["halle"] else '', f'<div style="background:#dc3545;color:#fff;padding:0.35rem 0.8rem;border-radius:6px;font-size:0.85rem;font-weight:700;margin-bottom:1rem;margin-left:0.5rem;">🚫 AUSVERKAUFT: {row["spiel_titel"]}</div>' if row["category"] == "ausverkauft" and row["spiel_titel"] else ''])}
|
||||
{"".join([f'<div class="detail-halle"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2.5" stroke-linecap="round" style="vertical-align:middle;margin-right:2px;"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg> {row["halle"]}</div>' if row["halle"] else '', f'<div class="detail-ausverkauft-banner"><span class="badge-icon">🚫</span> AUSVERKAUFT<span class="badge-title"> · {row["spiel_titel"]}</span></div>' if row["category"] == "ausverkauft" and row["spiel_titel"] else ''])}
|
||||
<div class="detail-meta">
|
||||
<span class="detail-type">{type_emoji}</span>
|
||||
<span class="detail-author">{name}</span>
|
||||
|
||||
Reference in New Issue
Block a user