From b0e6b1b9f2ef4b4ce2340ec049bade012b8e8d85 Mon Sep 17 00:00:00 2001 From: Erik Thiele Date: Tue, 8 Sep 2026 14:25:52 +0200 Subject: [PATCH] JET-Design-Wortmarke im Kopf und auf der Rechnung Die Logos stammen aus der Shop-Webseite (assets/img/logo). Im Seitenkopf stehen beide SVG-Varianten im Markup, CSS blendet die zum Theme passende ein -- der Dark-Mode-Schalter laedt die Seite nicht neu. Fuer den Rechnungsdruck liegt die Wortmarke zusaetzlich als JPEG bei, weil fpdf2 kein SVG setzen kann. logo_datei() waehlt aus: hochgeladenes Logo vor mitgelieferter Marke, Textkopf nur noch als Notnagel. Co-Authored-By: Claude Opus 5 --- AGENTS.md | 12 ++++++++++++ README.md | 5 ++++- app.py | 26 +++++++++++++++++++++++--- static/img/logo/jet-design-weiss.svg | 7 +++++++ static/img/logo/jet-design.jpg | Bin 0 -> 36141 bytes static/img/logo/jet-design.svg | 7 +++++++ static/style.css | 22 ++++++++++++++++++++++ templates/index.html | 5 +++-- templates/invoice.html | 5 +++-- templates/settings.html | 15 ++++++++++----- 10 files changed, 91 insertions(+), 13 deletions(-) create mode 100644 static/img/logo/jet-design-weiss.svg create mode 100644 static/img/logo/jet-design.jpg create mode 100644 static/img/logo/jet-design.svg diff --git a/AGENTS.md b/AGENTS.md index 2b1b324..4ef8496 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,6 +8,8 @@ - `templates/settings.html` — Einstellungsseite (Druckerabschreibung, Arbeitskosten, Marge, MwSt., Firmendaten, Logo) - `static/style.css` — Light-/Dark-Mode-Theming - `static/script.js` — Live-Berechnung + Auto-Save beim Tippen +- `static/img/logo/` — JET-Design-Wortmarke: `jet-design.svg` (dunkle Schrift), + `jet-design-weiss.svg` (Dark Mode), `jet-design.jpg` (Rechnungs-PDF) - `druckkalkulation_config.yaml` — auto-created/auto-saved state (in .gitignore) - `proxmox-setup.sh` — Proxmox LXC-Ersteinrichtung - `proxmox-update.sh` — Proxmox LXC-Update @@ -100,4 +102,14 @@ Kein Test, Lint, Typecheck oder CI vorhanden. README.md und AGENTS.md enthalten `_migriere()` in eine einzelne Position und entfernt die Altfelder. - **Saeamtliche UI-Texte sind Deutsch** — Labels, Fehlermeldungen, Rechnungsinhalte. - Nur `.venv/`, `druckkalkulation_config.yaml` und `static/logo.*` werden ignoriert. + `static/img/logo/` ist davon nicht betroffen und wird versioniert. +- Das Rechnungslogo liefert `logo_datei()`: hochgeladenes Logo vor + `STANDARD_LOGO`, und erst wenn beide Dateien fehlen, setzt der PDF-Kopf + den Namen als Text. Nie direkt `config['logo']` fuer die Ausgabe lesen. +- Die Wortmarke ist im SVG fest eingefaerbt. Deshalb stehen im Kopf beide + Varianten im Markup und `static/style.css` blendet ueber + `[data-bs-theme="dark"]` die passende ein -- `toggleDarkMode()` laedt die + Seite nicht neu, eine serverseitige Auswahl waere danach falsch. Am + `navbar-brand` darf `navbar-brand-autodark` nicht stehen: Tabler invertiert + damit Bilder im Dark Mode und wuerde die weisse Variante schwarz faerben. - `3dDruckKalkulator.py` ist die alte Tkinter-Version und wird nicht mehr verwendet (nicht im Tracking). diff --git a/README.md b/README.md index f879915..5e0b9ae 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,8 @@ sich ueber `HOST` und `PORT` ueberschreiben. - *Regelbesteuert* — MwSt. mit 19 % oder 7 % - **Rechnungspflichtangaben** nach §14 UStG (Steuernummer/USt-IdNr., Leistungsdatum) — nur in den beiden Unternehmer-Modi -- **Logo-Upload** (PNG/JPEG/WebP) für die Rechnung +- **JET-Design-Wortmarke** im Seitenkopf (SVG, hell/dunkel) und auf der + Rechnung (JPEG). Ein eigenes **Logo-Upload** (PNG/JPEG/WebP) ersetzt sie. ## Installation auf Proxmox (LXC-Container) @@ -151,3 +152,5 @@ druckkalkulation_projekte.yaml # Gespeicherte Projekte (ignoriert) - Alle UI-Texte sind Deutsch - Die YAML-Config wird automatisch erstellt und bei jedem Tastendruck gespeichert - `druckkalkulation_config.yaml` und `static/logo.*` sind in `.gitignore` ausgeschlossen +- `static/img/logo/` gehört dagegen ins Repo: die beiden SVG-Varianten für den + Seitenkopf und `jet-design.jpg` für den Rechnungsdruck (fpdf2 setzt nur Pixelbilder) diff --git a/app.py b/app.py index c79bb95..b3e1bc4 100644 --- a/app.py +++ b/app.py @@ -118,6 +118,20 @@ def as_stueckzahl(value): return max(1, zahl) + +def logo_datei(config): + """Pfad des Rechnungslogos relativ zu static/. + + Ein hochgeladenes Logo hat Vorrang, sonst greift die mitgelieferte + Wortmarke. Fehlen beide Dateien, kommt '' zurueck und der PDF-Kopf + setzt den Firmennamen als Text. + """ + for name in (config.get('logo', ''), STANDARD_LOGO): + if name and os.path.exists(os.path.join('static', name)): + return name + return '' + + def pdf_text(value): """Macht beliebigen Text fuer die latin-1-Kernfonts von fpdf sicher. @@ -147,6 +161,11 @@ MAX_PROJEKTE = 500 LOGO_EXTS = ('png', 'jpg', 'webp') +# Mitgelieferte JET-Design-Wortmarke fuer den Rechnungskopf. Aus der +# SVG-Vorlage des Shops gerastert, weil fpdf2 nur Pixelbilder setzt. +# Greift, solange kein eigenes Logo hochgeladen wurde. +STANDARD_LOGO = 'img/logo/jet-design.jpg' + # Obergrenze, damit ein fehlerhafter Client die Config nicht aufblaeht. MAX_POSITIONEN = 50 @@ -589,7 +608,8 @@ def index(): def settings(): """Einstellungsseite fuer Druckerabschreibung, Arbeitskosten und Marge.""" config = load_config() - return render_template('settings.html', config=config) + return render_template('settings.html', config=config, + logo_anzeige=logo_datei(config)) @app.route('/calculate', methods=['POST']) @@ -843,9 +863,9 @@ def invoice_pdf(): col_w = 45 # Logo rechts oben - logo_name = config.get('logo', '') + logo_name = logo_datei(config) logo_path = os.path.join('static', logo_name) if logo_name else '' - if logo_name and os.path.exists(logo_path): + if logo_name: pdf.image(logo_path, x=175, y=12, w=20) img_w, img_h = image_dimensions(logo_path) if img_w and img_h: diff --git a/static/img/logo/jet-design-weiss.svg b/static/img/logo/jet-design-weiss.svg new file mode 100644 index 0000000..1a44c71 --- /dev/null +++ b/static/img/logo/jet-design-weiss.svg @@ -0,0 +1,7 @@ + + Jet-Design + + + diff --git a/static/img/logo/jet-design.jpg b/static/img/logo/jet-design.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c2d602a952c13004d3b955d48fee839dd6c2fe8 GIT binary patch literal 36141 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 + Jet-Design + + + diff --git a/static/style.css b/static/style.css index b5de207..8614fef 100644 --- a/static/style.css +++ b/static/style.css @@ -11,3 +11,25 @@ white-space: pre; overflow-x: auto; } + +/* Wortmarke im Kopf. Die Schrift ist im SVG fest eingefaerbt, deshalb + liegen beide Varianten im Markup und die zum Theme passende wird + eingeblendet -- der Dark-Mode-Schalter tauscht nur das Attribut am + , ohne die Seite neu zu laden. */ +.marke { + height: 40px; + width: auto; + display: block; +} + +.marke-dunkel { + display: none; +} + +[data-bs-theme="dark"] .marke-hell { + display: none; +} + +[data-bs-theme="dark"] .marke-dunkel { + display: block; +} diff --git a/templates/index.html b/templates/index.html index c7c1b34..08a8149 100644 --- a/templates/index.html +++ b/templates/index.html @@ -16,8 +16,9 @@