From a94dbe26597033bbb129ef9ca2677198227cac9c Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Thu, 25 Jun 2026 09:34:39 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Sleek=20Frontend-Redesign=20=E2=80=94?= =?UTF-8?q?=20Anthrazit,=20Off-White,=20Avatar-Initialen,=20entf=C3=A4rbte?= =?UTF-8?q?=20Badges,=20Mobile-First?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 417 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 211 insertions(+), 206 deletions(-) diff --git a/app.py b/app.py index 735f013..0509073 100644 --- a/app.py +++ b/app.py @@ -2758,8 +2758,8 @@ def public_frontend(): filter_html += f'' filter_html += ' ' if halle_filter or cat_filter or sort != "neu": @@ -2843,6 +2843,10 @@ def public_frontend(): if not name or name.lower() in ("unknown", "anonym"): name = "Anonym" + # Avatar: Initialen im Kreis + initials = "".join(w[0].upper() for w in name.split() if w)[:2] or "?" + avatar_html = f'{initials}' + summary_text = (r["display_text"] or r["summary"] or r["content"] or "") # Kurzer Teaser: ersten Satz oder max 80 Zeichen first_sentence = summary_text.split(".")[0].strip() @@ -2852,7 +2856,7 @@ def public_frontend(): first_sentence += "." preview = first_sentence date_str = (r["published_at"] or r["created_at"] or "") - # Format with relative + absolute time + # Zeitformat: dezent, dimmed gray time_html = "" try: from datetime import datetime @@ -2861,66 +2865,58 @@ def public_frontend(): diff = now - dt if diff.days == 0: if diff.seconds < 3600: - time_html = f'vor {diff.seconds // 60} Min.' + time_html = f'vor {diff.seconds // 60} Min.' else: - time_html = f'heute {dt.strftime("%H:%M")} Uhr' + time_html = f'heute {dt.strftime("%H:%M")}' elif diff.days == 1: - time_html = f'gestern {dt.strftime("%H:%M")} Uhr' + time_html = f'gestern {dt.strftime("%H:%M")}' elif diff.days < 7: - time_html = f'vor {diff.days} Tagen {dt.strftime("%H:%M")}' + time_html = f'vor {diff.days} Tagen' else: - time_html = dt.strftime("%d.%m.%y %H:%M") + " Uhr" - date_str = dt.strftime("%d. %B %Y") + time_html = dt.strftime("%d.%m.%y %H:%M") except: 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 and not is_ausverkauft: - time_overlay = f'
{time_html}
' - time_block = time_overlay # Always overlay now - elif not media_first and not is_ausverkauft: - time_block = '' + # Metadata-Leiste: Avatar + Autor · Views · Comments · Like + meta_html = f"""
+
{avatar_html} {name}
+
+ {r['views'] or 0} + {r['comment_count'] or 0} + +
""" + is_ausverkauft = r["category"] == "ausverkauft" and r["spiel_titel"] + + # Zeit-Block oben (für Text-only Karten) + time_top = f'
{time_html}
' if time_html else '' + + # Badge-Titel vorbereiten (vermeidet Escaping-Probleme) + badge_title = f' · {r["spiel_titel"]}' if r["spiel_titel"] else "" + if not media_first: - # Text-only card: link-wrapped, time overlay at top (same as media cards) + # Text-only card cards += f"""
- """ + time_block + """ - """ + (f'
{r["halle"]}
' if r["halle"] else '') + """ - """ + (f'
🚫 AUSVERKAUFT{(" · " + r["spiel_titel"] + "") if r["spiel_titel"] else ""}
' if r["category"] == "ausverkauft" else '') + """ + {time_top} + {f'
{r["halle"]}
' if r["halle"] else ''} + {f'
🚫 AUSVERKAUFT{badge_title}
' if r["category"] == "ausverkauft" else ''}
-

""" + preview + """

-
- """ + str(r['views'] or 0) + """ - """ + str(r['comment_count'] or 0) + """ - -
- +

{preview}

+ {meta_html}
""" else: - # Media card: author at bottom (same as text-only) + # Media card cards += f"""
- """ + media_first + time_block + """ - """ + (f'
{r["halle"]}
' if r["halle"] else '') + """ - """ + (f'
🚫 AUSVERKAUFT{(" · " + r["spiel_titel"] + "") if r["spiel_titel"] else ""}
' if r["category"] == "ausverkauft" else '') + """ + {media_first} + {f'
{time_html}
' if time_html else ''} + {f'
{r["halle"]}
' if r["halle"] else ''} + {f'
🚫 AUSVERKAUFT{badge_title}
' if r["category"] == "ausverkauft" else ''}
-

""" + preview + """

-
- """ + str(r['views'] or 0) + """ - """ + str(r['comment_count'] or 0) + """ - -
- +

{preview}

+ {meta_html}
""" @@ -2934,271 +2930,280 @@ def public_frontend():