From 1bcc3d0f57322f31a5aac3f838fa2da39b9b17a7 Mon Sep 17 00:00:00 2001 From: dfuhrmann3 Date: Wed, 15 Jul 2026 13:49:17 +0200 Subject: [PATCH] feat(v3): eigenes Tab-Icon (Beleg-Motiv, schwarz/orange) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Custom-Favicon assets/favicon.png (256px, schwarzer abgerundeter Hintergrund, oranger Beleg mit Sägezahn-Unterkante) statt Emoji. page_icon lädt die Datei über absoluten Pfad, mit Fallback auf 🧾, falls sie fehlt. Co-Authored-By: Claude Opus 4.8 --- assets/favicon.png | Bin 0 -> 7280 bytes main.py | 8 +++++++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 assets/favicon.png diff --git a/assets/favicon.png b/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..a959bb81c9fe3fb0b0b23fa63780b55bc5742e40 GIT binary patch literal 7280 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 bytes: # ========================================== # 5. STREAMLIT FRONTEND # ========================================== -st.set_page_config(page_title="PDF zu E-Rechnung", page_icon="🧾", layout="wide") +# Eigenes Tab-Icon (Beleg-Motiv, schwarz/orange). Faellt auf das Emoji zurueck, falls die +# Datei fehlt. Absoluter Pfad, damit es unabhaengig vom Arbeitsverzeichnis gefunden wird. +_FAVICON_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "favicon.png") +_page_icon = Image.open(_FAVICON_PATH) if os.path.exists(_FAVICON_PATH) else "🧾" +st.set_page_config(page_title="PDF zu E-Rechnung", page_icon=_page_icon, layout="wide") st.title("📄 PDF zu E-Rechnung Konverter") col1, col2 = st.columns(2)