Terminbuchung über PetWorkers und G&H-Zertifikat eingebaut

- "Termin buchen" in der Kopfleiste, im Kontakt und als Buchungs-Fläche mit allen Angeboten
- Direkte Buchen-Knöpfe für Einzelcoaching, Gruppenstunden und Stundenplan
- G&H-Siegel im Footer, auf Ernährung und bei den Ausbildungen
- Datenschutz um die Online-Terminbuchung ergänzt
- tools/make_zip.sh baut das Übergabe-Paket

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
NotPika69andClaude Opus 5.5 committed 2026-10-04 11:01:49 +02:00
1 parent e368a0b2cc
commit d154ea13c2
16 files changed
+243 -19

No files matched your search

+52 -6
View File
@@ -14,6 +14,20 @@ def version(path):
CSS_V, JS_V = version("assets/site.css"), version("assets/site.js")
LOGO = "assets/img/logo.webp"
CERT = "assets/img/gh-siegel.webp"
CERT_ALT = "Zertifiziert nach G&amp;H Tierernährung – Gesund gefüttert Heidi Herrmann"
# Buchungsportal (PetWorkers) – & als &amp; für HTML-Attribute
PW = "https://schmacko-napf.petworkers.app/"
BOOK = {
"coach": ("Einzelcoaching", PW + "seite.php?name=einzelcoaching&amp;id=11&amp;sysname=coaching"),
"groups": ("Gruppenstunden", PW + "seite.php?name=gruppenstunden&amp;id=12&amp;sysname=groups"),
"courses": ("Kurse &amp; Workshops", PW + "index.php?id=13"),
"food": ("Ernährungsberatung", PW + "seite.php?name=ernaehrungsberatung"),
"buy": ("Kaufberatung", PW + "seite.php?name=kaufberatung"),
"cal": ("Stundenplan", PW + "index.php?view=kalender"),
}
EXT = ' target="_blank" rel="noopener"'
BARF = "assets/img/barf-teller.webp"
def img(name, alt, sizes="(max-width: 980px) 100vw, 55vw", lazy=True):
@@ -43,6 +57,8 @@ I = {
"car": ic('<path d="M5 16V11l2-5h10l2 5v5"/><path d="M3 16h18v3H3z"/><circle cx="7.5" cy="13" r="1"/><circle cx="16.5" cy="13" r="1"/>'),
"shield": ic('<path d="M12 3 5 6v6c0 4.5 3 7.5 7 9 4-1.5 7-4.5 7-9V6z"/><path d="m9 12 2 2 4-4"/>'),
"wind": ic('<path d="M3 9h11a3 3 0 1 0-3-3M3 15h15a3 3 0 1 1-3 3M3 12h8"/>'),
"ext": ic('<path d="M7 17 17 7M9 7h8v8"/>', "2"),
"cal": ic('<rect x="3.5" y="5" width="17" height="15" rx="2.5"/><path d="M3.5 10h17M8 3v4M16 3v4"/>'),
}
ARROW_BADGE = f'<span class="panel-arrow">{I["arrow"]}</span>'
@@ -85,11 +101,27 @@ def header(current=None):
<nav class="nav" aria-label="Hauptmenü">
{links}
</nav>
<a class="book-btn" href="{PW}"{EXT}>{I["cal"]}<span class="book-long">Termin buchen</span><span class="book-short" aria-hidden="true">Buchen</span></a>
<button class="burger" type="button" aria-label="Menü öffnen" aria-expanded="false">{I["menu"]}</button>
</div>
</header>
'''
def booking(keys, title="Termin buchen.", text="Freie Termine, Kurse und der Stundenplan – direkt in meinem Buchungsportal."):
links = "\n".join(f' <a href="{BOOK[k][1]}"{EXT}><span>{BOOK[k][0]}</span>{I["ext"]}</a>' for k in keys)
return f''' <div class="panel panel--sage panel--auto booking reveal" id="buchen">
<div class="booking-head">
<span class="kicker">Online buchen</span>
<h2 class="display">{title}</h2>
<p class="big">{text}</p>
</div>
<div class="book-links">
{links}
</div>
</div>
'''
def contact(photo="hund-wald", alt="Schwarze Schäferhündin steht aufmerksam im Wald"):
go = f'<span>{I["arrow"]}</span>'
return f''' <div class="row row--wide" id="kontakt">
@@ -97,6 +129,7 @@ def contact(photo="hund-wald", alt="Schwarze Schäferhündin steht aufmerksam im
<span class="kicker">Kontakt</span>
<h2 class="display">Lass uns<br>sprechen.</h2>
<div class="contact-links">
<a class="contact-book" href="{PW}"{EXT}>{I["cal"]}<span>Termin online buchen</span>{go}</a>
<a href="{WA}" target="_blank" rel="noopener">{I["chat"]}<span>WhatsApp</span>{go}</a>
<a href="{PHONE_HREF}">{I["phone"]}<span>{PHONE}</span>{go}</a>
<a href="mailto:{MAIL}">{I["mail"]}<span>{MAIL}</span>{go}</a>
@@ -111,6 +144,7 @@ def footer():
<div class="footer-brand">
<a class="footer-logo" href="index.html"><img src="{LOGO}" alt="Schmacko Napf &amp; Hundetraining by Katha" width="88" height="88" loading="lazy"></a>
<span>Ernährung, Gesundheit und Training –<br>mit Herz und Verstand.</span>
<img class="footer-cert" src="{CERT}" alt="{CERT_ALT}" width="480" height="329" loading="lazy">
</div>
<nav class="footer-links" aria-label="Footer">
<a href="hundeschule.html">Hundetraining</a>
@@ -245,7 +279,7 @@ index = head("Schmacko Napf & Hundetraining by Katha",
</a>
</div>
{contact()}''' + footer()
{booking(["coach", "groups", "courses", "food", "buy", "cal"])}{contact()}''' + footer()
write("index.html", index)
PAGES.append("index.html")
@@ -262,6 +296,7 @@ page("hundeschule.html", "Hundetraining – Schmacko Napf",
<h2 class="title">Individuell.<br>Bei dir zu Hause.</h2>
<p class="big">Für Grundgehorsam, Unsicherheit, Leinenführigkeit oder einen neuen Hund im Haus.</p>
<div class="price-big"><strong>60 €</strong><span>pro Stunde · nach dem Erstgespräch (120 €, ca. 2 Std.)</span></div>
<div class="btn-row"><a class="btn btn--ink" href="{BOOK['coach'][1]}"{EXT}>Einzelcoaching buchen {I["ext"]}</a></div>
</div>
<div class="panel panel--photo plain reveal d1">{img("hund-wald", "Schwarze Schäferhündin steht aufmerksam im Wald")}</div>
</div>
@@ -273,6 +308,10 @@ page("hundeschule.html", "Hundetraining – Schmacko Napf",
<h2 class="title">Training da, wo<br>das Leben ist.</h2>
<p class="big">In der Stadt, im Grünen, in Geschäften – mit max. 6 Mensch-Hund-Teams.</p>
<div class="price-big"><strong>18 €</strong><span>pro Mensch-Hund-Team</span></div>
<div class="btn-row">
<a class="btn btn--sage" href="{BOOK['groups'][1]}"{EXT}>Gruppenstunde buchen {I["ext"]}</a>
<a class="btn btn--line" href="{BOOK['cal'][1]}"{EXT}>Stundenplan {I["ext"]}</a>
</div>
</div>
</div>
@@ -298,7 +337,7 @@ page("hundeschule.html", "Hundetraining – Schmacko Napf",
</div>
</div>
{contact("katha-heide", "Katha sitzt mit ihrer Schäferhündin im Grünen")}''')
{booking(["coach", "groups", "courses", "buy", "cal"])}{contact("katha-heide", "Katha sitzt mit ihrer Schäferhündin im Grünen")}''')
PAGES.append("hundeschule.html")
# ================================================================ Ernährung
@@ -314,6 +353,7 @@ page("ernaehrung.html", "Ernährungsberatung – Schmacko Napf",
<h2 class="title">Jeder sagt<br>etwas anderes.</h2>
<p class="big">Ich bringe Klarheit in die Futter-Frage – und erstelle einen Plan, der zu deinem Hund passt.</p>
<div class="facts"><span class="fact">BARF</span><span class="fact">Teil-BARF</span><span class="fact">Koch-BARF</span><span class="fact">Nassfutter</span><span class="fact">Trockenfutter</span></div>
<img class="cert" src="{CERT}" alt="{CERT_ALT}" width="480" height="329" loading="lazy">
</div>
<div class="panel panel--sage plate-panel reveal d1"><img src="{BARF}" alt="Teller mit frischem Fleisch, Gemüse und Obst" width="900" height="900" loading="lazy"></div>
</div>
@@ -347,7 +387,7 @@ page("ernaehrung.html", "Ernährungsberatung – Schmacko Napf",
</div>
</div>
{contact()}''')
{booking(["food"], "Beratung buchen.", "Erstgespräch und Futterplan direkt online buchen – vor Ort, am Telefon oder online.")}{contact()}''')
PAGES.append("ernaehrung.html")
# ================================================================ Shop
@@ -420,7 +460,10 @@ page("ueber-mich.html", "Über mich – Schmacko Napf",
</div>
<div class="panel panel--ink panel--auto reveal">
<span class="kicker">Ausbildungen</span>
<div class="quals-head">
<span class="kicker">Ausbildungen</span>
<img class="cert" src="{CERT}" alt="{CERT_ALT}" width="480" height="329" loading="lazy">
</div>
<ul class="quals">
<li><small>2021 – 2023</small><strong>Hundetrainerin</strong><span>Diane Bartlog, Hundeschule Mengkofen</span></li>
<li><small>2022 – 2023</small><strong>Hunde-Ernährungsberaterin</strong><span>Heidi Herrmann, G&amp;H Tierernährung</span></li>
@@ -482,11 +525,14 @@ page("datenschutz.html", "Datenschutz – Schmacko Napf", "Datenschutzerklärung
<p>Wenn du mich kontaktierst, verarbeite ich deine Angaben (z. B. Name, Kontaktdaten, Informationen zu deinem Hund), um deine Anfrage zu beantworten und gegebenenfalls einen Termin oder Vertrag durchzuführen (Art. 6 Abs. 1 lit. b DSGVO). Die Daten werden gelöscht, sobald sie nicht mehr erforderlich sind und keine gesetzlichen Aufbewahrungspflichten bestehen.</p>
<p>Der WhatsApp-Link öffnet erst nach deinem Klick die App bzw. Website von WhatsApp (WhatsApp Ireland Ltd.). Dabei gelten die Datenschutzbestimmungen von WhatsApp. Wenn du das nicht möchtest, schreib mir gern per E-Mail oder ruf an.</p>
<h2>5. Deine Rechte</h2>
<h2>5. Online-Terminbuchung</h2>
<p>Für Terminbuchungen nutze ich das Buchungsportal PetWorkers (schmacko-napf.petworkers.app). Erst wenn du auf „Termin buchen“ klickst, wirst du dorthin weitergeleitet. Die Daten, die du bei der Buchung angibst, verarbeite ich zur Durchführung deines Termins (Art. 6 Abs. 1 lit. b DSGVO). Für die Verarbeitung auf dem Portal gelten ergänzend die Datenschutzhinweise von PetWorkers.</p>
<h2>6. Deine Rechte</h2>
<p>Du hast das Recht auf Auskunft (Art. 15 DSGVO), Berichtigung (Art. 16), Löschung (Art. 17), Einschränkung der Verarbeitung (Art. 18), Datenübertragbarkeit (Art. 20) und Widerspruch gegen Verarbeitungen auf Grundlage berechtigter Interessen (Art. 21). Eine Einwilligung kannst du jederzeit für die Zukunft widerrufen. Eine formlose Nachricht an die oben genannte Adresse genügt.</p>
<p>Außerdem kannst du dich bei einer Datenschutz-Aufsichtsbehörde beschweren, zum Beispiel beim Bayerischen Landesamt für Datenschutzaufsicht (BayLDA), Promenade 18, 91522 Ansbach.</p>
<h2>6. Stand</h2>
<h2>7. Stand</h2>
<p>Oktober 2026</p>
</div>
</div>
+35
View File
@@ -0,0 +1,35 @@
#!/bin/sh
# Baut das Übergabe-Paket Schmacko-Napf-Website.zip (nur die Website-Dateien + LIESMICH.txt)
set -e
cd "$(dirname "$0")/.."
TMP=$(mktemp -d)
DIR="$TMP/Schmacko-Napf-Website"
mkdir -p "$DIR"
rsync -a --exclude tools --exclude README.md --exclude .git --exclude .claude --exclude .gitignore --exclude '*.zip' --exclude .DS_Store ./ "$DIR/"
cat > "$DIR/LIESMICH.txt" <<'TXT'
Schmacko Napf & Hundetraining by Katha – Website
=================================================
Ansehen:
index.html per Doppelklick im Browser öffnen.
Veröffentlichen:
Den kompletten Inhalt dieses Ordners (inkl. der versteckten Datei .htaccess)
per FTP in das Hauptverzeichnis des Webspace laden. Fertig.
Terminbuchung:
Alle "Termin buchen"-Knöpfe führen zum Buchungsportal
https://schmacko-napf.petworkers.app
Die Seite setzt keine Cookies, nutzt kein Tracking und lädt nichts von fremden
Servern (Schrift und Bilder liegen im Ordner assets). Ein Cookie-Banner ist
deshalb nicht nötig.
Bildnachweis: Fotos von Katha und ihren Hunden – Steffi Biller, KK-Fotografie.
Weitere Bilder: Unsplash. Schrift: Questrial (SIL Open Font License).
G&H-Siegel: G&H Tierernährung, Heidi Herrmann.
TXT
rm -f Schmacko-Napf-Website.zip
(cd "$TMP" && zip -qr - Schmacko-Napf-Website) > Schmacko-Napf-Website.zip
rm -rf "$TMP"
echo "Schmacko-Napf-Website.zip erstellt ($(du -h Schmacko-Napf-Website.zip | cut -f1))"
+5
View File
@@ -38,6 +38,11 @@ save_webp(fit(logo, 640), "logo.webp", quality=90)
plate = Image.open(os.path.join(SRC, "barf-teller.png")).convert("RGBA")
save_webp(fit(plate, 900), "barf-teller.webp", quality=82)
# G&H-Zertifikatssiegel: transparenten Rand abschneiden
cert = Image.open(os.path.join(SRC, "gh-siegel.png")).convert("RGBA")
cert = cert.crop(cert.getchannel("A").getbbox())
save_webp(fit(cert, 480), "gh-siegel.webp", quality=90)
# Apple-Touch-Icon: Logo auf Creme
icon = Image.new("RGB", (180, 180), CREAM)
small = fit(logo, 172)
Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB