Website fertig: lokale Bilder und Schrift, Über mich, Datenschutz, 404, SEO
- Logo, Fotos und Questrial liegen lokal (WebP, zwei Größen) – keine Drittanbieter mehr - Neue Seiten: Über mich (Aus- und Weiterbildungen), Datenschutz, 404 - Impressum nach DDG mit Aufsichtsbehörde (§ 11 TierSchG) - Favicon, Apple-Icon, Vorschaubild, Canonical/Open Graph, robots.txt, sitemap.xml, .htaccess - tools/optimize_images.py erzeugt die Web-Bilder aus tools/originals/ Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
2a751eeac9
commit
e368a0b2cc
47 files changed
+803
-170
No files matched your search
+196
-62
@@ -1,19 +1,28 @@
|
||||
"""Quelle aller Seiten. Inhalte hier ändern, dann:
|
||||
|
||||
python3 tools/build_pages.py
|
||||
"""
|
||||
import hashlib, os
|
||||
from PIL import Image
|
||||
|
||||
OUT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
SITE = "https://schmacko-napf.de"
|
||||
|
||||
def version(path):
|
||||
# Prüfsumme als ?v=… – Browser laden CSS/JS nach jeder Änderung neu statt aus dem Cache
|
||||
return hashlib.md5(open(os.path.join(OUT, path), "rb").read()).hexdigest()[:8]
|
||||
CSS_V, JS_V = version("assets/site.css"), version("assets/site.js")
|
||||
|
||||
WP = "https://schmacko-napf.de/wp-content/uploads/"
|
||||
LOGO = WP + "2024/12/Logo-Transparent-Rechnung.png"
|
||||
KK = {n: f"{WP}2025/01/KK-Fotografie-{n}.jpg" for n in (35, 46, 51, 66)}
|
||||
BARF = WP + "2023/06/Barf.png"
|
||||
def U(pid, w=1600): return f"https://images.unsplash.com/photo-{pid}?auto=format&fit=crop&w={w}&q=80"
|
||||
IMG_FOOD = "1714068691210-073dc52c6c1d"
|
||||
IMG_SHOP = "1733451629760-d5fc1c818698"
|
||||
IMG_CAR = "1771777400696-3af9b6470ff8"
|
||||
LOGO = "assets/img/logo.webp"
|
||||
BARF = "assets/img/barf-teller.webp"
|
||||
|
||||
def img(name, alt, sizes="(max-width: 980px) 100vw, 55vw", lazy=True):
|
||||
"""Foto aus assets/img mit kleiner (-900) und großer Variante."""
|
||||
big, small = f"assets/img/{name}.webp", f"assets/img/{name}-900.webp"
|
||||
wb = Image.open(os.path.join(OUT, big)).width
|
||||
ws = Image.open(os.path.join(OUT, small)).width
|
||||
load = ' loading="lazy"' if lazy else ""
|
||||
return f'<img src="{big}" srcset="{small} {ws}w, {big} {wb}w" sizes="{sizes}" alt="{alt}"{load}>'
|
||||
|
||||
PHONE, PHONE_HREF = "+49 176 569 329 42", "tel:+4917656932942"
|
||||
MAIL = "info@schmacko-napf.de"
|
||||
@@ -38,21 +47,30 @@ I = {
|
||||
ARROW_BADGE = f'<span class="panel-arrow">{I["arrow"]}</span>'
|
||||
|
||||
NAV = [("hundeschule.html", "Hundetraining"), ("ernaehrung.html", "Ernährung"), ("shop.html", "Shop"),
|
||||
("transportboxen.html", "Transportboxen"), ("index.html#kontakt", "Kontakt")]
|
||||
("transportboxen.html", "Transportboxen"), ("ueber-mich.html", "Über mich"), ("index.html#kontakt", "Kontakt")]
|
||||
|
||||
def head(title, desc):
|
||||
def head(title, desc, path, robots=""):
|
||||
url = f"{SITE}/{'' if path == 'index.html' else path}"
|
||||
meta_robots = f'\n <meta name="robots" content="{robots}">' if robots else ""
|
||||
return f'''<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{title}</title>
|
||||
<meta name="description" content="{desc}">
|
||||
<meta name="description" content="{desc}">{meta_robots}
|
||||
<link rel="canonical" href="{url}">
|
||||
<meta name="theme-color" content="#fcfaf4">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='12' fill='%23194242'/%3E%3C/svg%3E">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Questrial&display=swap" rel="stylesheet">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:locale" content="de_DE">
|
||||
<meta property="og:site_name" content="Schmacko Napf & Hundetraining by Katha">
|
||||
<meta property="og:title" content="{title}">
|
||||
<meta property="og:description" content="{desc}">
|
||||
<meta property="og:url" content="{url}">
|
||||
<meta property="og:image" content="{SITE}/assets/img/vorschau.jpg">
|
||||
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
|
||||
<link rel="apple-touch-icon" href="apple-touch-icon.png">
|
||||
<link rel="preload" href="assets/fonts/questrial-latin.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="stylesheet" href="assets/site.css?v={CSS_V}">
|
||||
</head>
|
||||
'''
|
||||
@@ -60,9 +78,10 @@ def head(title, desc):
|
||||
def header(current=None):
|
||||
cur = ' aria-current="page"'
|
||||
links = "\n".join(f' <a href="{h}"{cur if h == current else ""}>{t}</a>' for h, t in NAV)
|
||||
return f''' <header class="site-header">
|
||||
return f''' <a class="skip" href="#inhalt">Zum Inhalt springen</a>
|
||||
<header class="site-header">
|
||||
<div class="header-inner">
|
||||
<a class="brand" href="index.html" aria-label="Schmacko Napf – Startseite"><img src="{LOGO}" alt="Schmacko Napf & Hundetraining by Katha"></a>
|
||||
<a class="brand" href="index.html" aria-label="Schmacko Napf – Startseite"><img src="{LOGO}" alt="Schmacko Napf & Hundetraining by Katha" width="68" height="68"></a>
|
||||
<nav class="nav" aria-label="Hauptmenü">
|
||||
{links}
|
||||
</nav>
|
||||
@@ -71,7 +90,7 @@ def header(current=None):
|
||||
</header>
|
||||
'''
|
||||
|
||||
def contact(photo=KK[46], alt="Schwarze Schäferhündin steht aufmerksam im Wald"):
|
||||
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">
|
||||
<div class="panel panel--ink reveal">
|
||||
@@ -83,14 +102,14 @@ def contact(photo=KK[46], alt="Schwarze Schäferhündin steht aufmerksam im Wald
|
||||
<a href="mailto:{MAIL}">{I["mail"]}<span>{MAIL}</span>{go}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel panel--photo plain reveal d1"><img src="{photo}" alt="{alt}" loading="lazy"></div>
|
||||
<div class="panel panel--photo plain reveal d1">{img(photo, alt, "(max-width: 980px) 100vw, 45vw")}</div>
|
||||
</div>
|
||||
'''
|
||||
|
||||
def footer():
|
||||
return f''' <footer class="site-footer">
|
||||
<div class="footer-brand">
|
||||
<a class="footer-logo" href="index.html"><img src="{LOGO}" alt="Schmacko Napf & Hundetraining by Katha"></a>
|
||||
<a class="footer-logo" href="index.html"><img src="{LOGO}" alt="Schmacko Napf & Hundetraining by Katha" width="88" height="88" loading="lazy"></a>
|
||||
<span>Ernährung, Gesundheit und Training –<br>mit Herz und Verstand.</span>
|
||||
</div>
|
||||
<nav class="footer-links" aria-label="Footer">
|
||||
@@ -98,10 +117,11 @@ def footer():
|
||||
<a href="ernaehrung.html">Ernährung</a>
|
||||
<a href="shop.html">Shop</a>
|
||||
<a href="transportboxen.html">Transportboxen</a>
|
||||
<a href="ueber-mich.html">Über mich</a>
|
||||
<a href="impressum.html">Impressum</a>
|
||||
<a href="#">Datenschutz</a>
|
||||
<a href="datenschutz.html">Datenschutz</a>
|
||||
</nav>
|
||||
<div class="footer-meta"><span>© 2026 Schmacko Napf & Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie</span></div>
|
||||
<div class="footer-meta"><span>© 2026 Schmacko Napf & Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div>
|
||||
</footer>
|
||||
</main>
|
||||
<script src="assets/site.js?v={JS_V}"></script>
|
||||
@@ -109,34 +129,35 @@ def footer():
|
||||
</html>
|
||||
'''
|
||||
|
||||
def page_hero(img, kicker, title, text, alt):
|
||||
def page_hero(photo, kicker, title, text, alt):
|
||||
return f''' <section class="panel panel--photo page-hero">
|
||||
<img src="{img}" alt="{alt}">
|
||||
{img(photo, alt, "100vw", lazy=False)}
|
||||
<span class="kicker">{kicker}</span>
|
||||
<h1>{title}</h1>
|
||||
<p class="big">{text}</p>
|
||||
</section>
|
||||
'''
|
||||
|
||||
def page(name, title, desc, current, body):
|
||||
write(name, head(title, desc) + "<body>\n" + header(current) + ' <main class="mosaic">\n' + body + footer())
|
||||
def page(name, title, desc, current, body, robots=""):
|
||||
write(name, head(title, desc, name, robots) + "<body>\n" + header(current) + ' <main class="mosaic" id="inhalt">\n' + body + footer())
|
||||
|
||||
def write(name, html):
|
||||
open(os.path.join(OUT, name), "w").write(html)
|
||||
|
||||
PAGES = [] # für die Sitemap
|
||||
|
||||
# ================================================================ Startseite
|
||||
tiles = [
|
||||
("hundeschule.html", "Hundeschule", "", KK[66], "Katha mit ihrem Hund auf einer Wiese im Abendlicht", None),
|
||||
("ernaehrung.html", "Ernährungsberatung", "", U(IMG_FOOD, 1400), "Hund schnuppert an einem Napf mit Trockenfutter", IMG_FOOD),
|
||||
("shop.html", "Shop", "", U(IMG_SHOP, 1400), "Hund in einem Laden mit Hundezubehör", IMG_SHOP),
|
||||
("transportboxen.html", "Transportboxen", "Maßanfertigung fürs Auto", U(IMG_CAR, 1400), "Hund sitzt im offenen Kofferraum hinter einem Trenngitter", IMG_CAR),
|
||||
("hundeschule.html", "Hundeschule", "", "katha-abendlicht", "Katha mit ihrem Hund auf einer Wiese im Abendlicht"),
|
||||
("ernaehrung.html", "Ernährungsberatung", "", "futternapf", "Hund schnuppert an einem Napf mit Trockenfutter"),
|
||||
("shop.html", "Shop", "", "laden", "Hund in einem Laden mit Hundezubehör"),
|
||||
("transportboxen.html", "Transportboxen", "Maßanfertigung fürs Auto", "kofferraum", "Hund sitzt im offenen Kofferraum hinter einem Trenngitter"),
|
||||
]
|
||||
tile_html = ""
|
||||
for href, name, sub, src, alt, pid in tiles:
|
||||
for href, name, sub, photo, alt in tiles:
|
||||
small = f"<small>{sub}</small>" if sub else ""
|
||||
srcset = f' srcset="{U(pid,800)} 800w, {U(pid,1400)} 1400w, {U(pid,2000)} 2000w" sizes="(max-width: 767px) 100vw, 50vw"' if pid else ""
|
||||
tile_html += f''' <a class="tile" href="{href}">
|
||||
<img src="{src}"{srcset} alt="{alt}">
|
||||
{img(photo, alt, "(max-width: 767px) 100vw, 50vw", lazy=False)}
|
||||
<span class="tile-foot">
|
||||
<span class="tile-label">{name}{small}</span>
|
||||
<span class="tile-arrow">{I["arrow"]}</span>
|
||||
@@ -144,17 +165,20 @@ for href, name, sub, src, alt, pid in tiles:
|
||||
</a>
|
||||
'''
|
||||
|
||||
index = head("Schmacko Napf & Hundetraining by Katha", "Hundetraining, Ernährungs- und Gesundheitsberatung, Shop und maßgefertigte Transportboxen – Schmacko Napf by Katha.") + '<body class="is-home">\n' + header() + f''' <section class="hero">
|
||||
index = head("Schmacko Napf & Hundetraining by Katha",
|
||||
"Hundetraining, Ernährungs- und Gesundheitsberatung, Shop und maßgefertigte Transportboxen – Schmacko Napf by Katha in Wörth a.d. Isar.",
|
||||
"index.html") + '<body class="is-home">\n' + header() + f''' <section class="hero">
|
||||
<nav class="tiles" aria-label="Bereiche">
|
||||
<svg class="seal-joint" aria-hidden="true"><path/></svg>
|
||||
<h1 class="seal"><img src="{LOGO}" alt="Schmacko Napf & Hundetraining by Katha"></h1>
|
||||
{tile_html} <a class="scroll-hint" href="#ueber-mich" aria-label="Weiter nach unten">{I["down"]}</a>
|
||||
<h1 class="seal"><img src="{LOGO}" alt="Schmacko Napf & Hundetraining by Katha" width="300" height="300"></h1>
|
||||
{tile_html} <a class="scroll-hint" href="#inhalt" aria-label="Weiter nach unten">{I["down"]}</a>
|
||||
</nav>
|
||||
</section>
|
||||
|
||||
<main class="mosaic">
|
||||
<div class="row row--wide-r" id="ueber-mich">
|
||||
<div class="panel panel--cream reveal">
|
||||
<main class="mosaic" id="inhalt">
|
||||
<div class="row row--wide-r">
|
||||
<a class="panel panel--cream reveal" href="ueber-mich.html">
|
||||
<span class="panel-arrow panel-arrow--ink">{I["arrow"]}</span>
|
||||
<span class="kicker">Über mich</span>
|
||||
<h2 class="display">Hallo,<br>ich bin Katha.</h2>
|
||||
<p class="big">Hundetrainerin und Ernährungsberaterin – mit Herz und Verstand. Für beide Seiten der Leine.</p>
|
||||
@@ -162,12 +186,12 @@ index = head("Schmacko Napf & Hundetraining by Katha", "Hundetraining, Ernährun
|
||||
<span class="fact">§ 11 TierSchG zertifiziert</span>
|
||||
<span class="fact">Ernährungs- & Gesundheitsberaterin</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel panel--photo plain reveal d1"><img src="{KK[35]}" alt="Katha sitzt mit ihrer Schäferhündin Elina im Grünen" loading="lazy"></div>
|
||||
</a>
|
||||
<div class="panel panel--photo plain reveal d1">{img("katha-heide", "Katha sitzt mit ihrer Schäferhündin im Grünen")}</div>
|
||||
</div>
|
||||
|
||||
<a class="panel panel--photo tall reveal" href="hundeschule.html">
|
||||
<img src="{KK[51]}" alt="Schwarzer Schäferhund rennt freudig über einen Feldweg" loading="lazy">
|
||||
{img("hund-rennt", "Schwarzer Schäferhund rennt freudig über einen Feldweg", "100vw")}
|
||||
{ARROW_BADGE}
|
||||
<span class="kicker">Hundetraining</span>
|
||||
<h2 class="display">Entspannt durch<br>den Alltag.</h2>
|
||||
@@ -180,9 +204,9 @@ index = head("Schmacko Napf & Hundetraining by Katha", "Hundetraining, Ernährun
|
||||
</a>
|
||||
|
||||
<div class="row">
|
||||
<div class="panel panel--sage plate-panel reveal"><img src="{BARF}" alt="Teller mit frischem Fleisch, Gemüse und Obst für die Rohfütterung" loading="lazy"></div>
|
||||
<div class="panel panel--sage plate-panel reveal"><img src="{BARF}" alt="Teller mit frischem Fleisch, Gemüse und Obst für die Rohfütterung" width="900" height="900" loading="lazy"></div>
|
||||
<a class="panel panel--cream reveal d1" href="ernaehrung.html">
|
||||
<span class="panel-arrow" style="background:var(--ink);border-color:var(--ink)">{I["arrow"]}</span>
|
||||
<span class="panel-arrow panel-arrow--ink">{I["arrow"]}</span>
|
||||
<span class="kicker">Ernährungsberatung</span>
|
||||
<h2 class="display">Gesund<br>gefüttert.</h2>
|
||||
<p class="big">Individuelle Futterpläne – für jedes Alter, auch bei Magen-Darm- oder Pankreas-Problemen.</p>
|
||||
@@ -208,27 +232,28 @@ index = head("Schmacko Napf & Hundetraining by Katha", "Hundetraining, Ernährun
|
||||
|
||||
<div class="row">
|
||||
<a class="panel panel--photo reveal" href="shop.html">
|
||||
<img src="{U(IMG_SHOP)}" alt="Hund in einem Laden mit Hundezubehör" loading="lazy">
|
||||
{img("laden", "Hund in einem Laden mit Hundezubehör", "(max-width: 980px) 100vw, 50vw")}
|
||||
{ARROW_BADGE}
|
||||
<span class="kicker">Shop</span>
|
||||
<h2 class="title">Futter, Snacks<br>& Zubehör.</h2>
|
||||
</a>
|
||||
<a class="panel panel--photo reveal d1" href="transportboxen.html">
|
||||
<img src="{U(IMG_CAR)}" alt="Hund sitzt im Kofferraum hinter einem Trenngitter" loading="lazy">
|
||||
{img("kofferraum", "Hund sitzt im Kofferraum hinter einem Trenngitter", "(max-width: 980px) 100vw, 50vw")}
|
||||
{ARROW_BADGE}
|
||||
<span class="kicker">Maßanfertigung</span>
|
||||
<h2 class="title">Transportboxen<br>fürs Auto.</h2>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{contact()}''' + footer().replace(" </main>\n", " </main>\n", 1)
|
||||
{contact()}''' + footer()
|
||||
write("index.html", index)
|
||||
PAGES.append("index.html")
|
||||
|
||||
# ================================================================ Hundetraining
|
||||
page("hundeschule.html", "Hundetraining – Schmacko Napf",
|
||||
"Einzeltraining, Hausbesuche und Gruppentraining im Außenbereich mit Katha, zertifizierte Hundetrainerin nach § 11 TierSchG.",
|
||||
"hundeschule.html",
|
||||
page_hero(KK[66], "Hundetraining", "Für beide Seiten<br>der Leine.",
|
||||
page_hero("katha-abendlicht", "Hundetraining", "Für beide Seiten<br>der Leine.",
|
||||
"Vertrauen, klare Kommunikation und Training, das im Alltag funktioniert.",
|
||||
"Katha mit ihrem Hund auf einer Wiese im Abendlicht") + f'''
|
||||
<div class="row row--wide-r">
|
||||
@@ -238,11 +263,11 @@ page("hundeschule.html", "Hundetraining – Schmacko Napf",
|
||||
<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>
|
||||
<div class="panel panel--photo plain reveal d1"><img src="{KK[46]}" alt="Schwarze Schäferhündin steht aufmerksam im Wald" loading="lazy"></div>
|
||||
<div class="panel panel--photo plain reveal d1">{img("hund-wald", "Schwarze Schäferhündin steht aufmerksam im Wald")}</div>
|
||||
</div>
|
||||
|
||||
<div class="row row--wide">
|
||||
<div class="panel panel--photo plain reveal"><img src="{KK[51]}" alt="Schwarzer Schäferhund rennt über einen Feldweg" loading="lazy"></div>
|
||||
<div class="panel panel--photo plain reveal">{img("hund-rennt", "Schwarzer Schäferhund rennt über einen Feldweg")}</div>
|
||||
<div class="panel panel--ink reveal d1">
|
||||
<span class="kicker">Gruppe & Außentraining</span>
|
||||
<h2 class="title">Training da, wo<br>das Leben ist.</h2>
|
||||
@@ -268,18 +293,19 @@ page("hundeschule.html", "Hundetraining – Schmacko Napf",
|
||||
<div class="price-rows">
|
||||
<div><span>Erstgespräch Einzeltraining<small>ca. 2 Stunden · zzgl. 0,30 € / km</small></span><strong>120 €</strong></div>
|
||||
<div><span>Einzeltraining<small>pro Stunde · zzgl. 0,30 € / km</small></span><strong>60 €</strong></div>
|
||||
<div><span>Gruppentraining<small>pro Mensch-Hund-Team</small></span><strong>18 €</strong></div>
|
||||
<div><span>Gruppentraining<small>pro Mensch-Hund-Team · max. 2 Hunde pro Halter</small></span><strong>18 €</strong></div>
|
||||
<div><span>10er-Karte<small>Gruppe & Einzel frei kombinierbar</small></span><strong>165 €</strong></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{contact(KK[35], "Katha sitzt mit ihrer Schäferhündin im Grünen")}''')
|
||||
{contact("katha-heide", "Katha sitzt mit ihrer Schäferhündin im Grünen")}''')
|
||||
PAGES.append("hundeschule.html")
|
||||
|
||||
# ================================================================ Ernährung
|
||||
page("ernaehrung.html", "Ernährungsberatung – Schmacko Napf",
|
||||
"Individuelle Futterpläne und Gesundheitsberatung für Hunde jeden Alters – BARF, Koch-BARF, Nass- und Trockenfutter.",
|
||||
"ernaehrung.html",
|
||||
page_hero(U(IMG_FOOD, 2000), "Ernährungs- & Gesundheitsberatung", "Fürsorge<br>in Napfform.",
|
||||
page_hero("futternapf", "Ernährungs- & Gesundheitsberatung", "Fürsorge<br>in Napfform.",
|
||||
"Individuelle Futterpläne – gesund, sensibel oder mit Diagnose.",
|
||||
"Hund schnuppert an einem Napf mit Trockenfutter") + f'''
|
||||
<div class="row">
|
||||
@@ -289,7 +315,7 @@ page("ernaehrung.html", "Ernährungsberatung – Schmacko Napf",
|
||||
<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>
|
||||
</div>
|
||||
<div class="panel panel--sage plate-panel reveal d1"><img src="{BARF}" alt="Teller mit frischem Fleisch, Gemüse und Obst" 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>
|
||||
|
||||
<div class="panel panel--ink panel--auto reveal">
|
||||
@@ -322,10 +348,11 @@ page("ernaehrung.html", "Ernährungsberatung – Schmacko Napf",
|
||||
</div>
|
||||
|
||||
{contact()}''')
|
||||
PAGES.append("ernaehrung.html")
|
||||
|
||||
# ================================================================ Shop
|
||||
page("shop.html", "Shop – Schmacko Napf", "Ausgewähltes Futter, Snacks und Zubehör für deinen Hund.", "shop.html",
|
||||
page_hero(U(IMG_SHOP, 2000), "Shop", "Ausgewählt<br>mit Herz.",
|
||||
page_hero("laden", "Shop", "Ausgewählt<br>mit Herz.",
|
||||
"Futter, Snacks und Zubehör, hinter denen ich stehe.",
|
||||
"Hund in einem Laden mit Hundezubehör") + f'''
|
||||
<div class="row row--3">
|
||||
@@ -339,11 +366,12 @@ page("shop.html", "Shop – Schmacko Napf", "Ausgewähltes Futter, Snacks und Zu
|
||||
</div>
|
||||
|
||||
{contact()}''')
|
||||
PAGES.append("shop.html")
|
||||
|
||||
# ================================================================ Transportboxen
|
||||
page("transportboxen.html", "Transportboxen nach Maß – Schmacko Napf",
|
||||
"Maßgefertigte Hunde-Transportboxen fürs Auto – passgenau für Fahrzeug und Hund.", "transportboxen.html",
|
||||
page_hero(U(IMG_CAR, 2000), "Maßanfertigung", "Transportboxen<br>fürs Auto.",
|
||||
page_hero("kofferraum", "Maßanfertigung", "Transportboxen<br>fürs Auto.",
|
||||
"Passgenau für dein Fahrzeug und deinen Hund.",
|
||||
"Hund sitzt im offenen Kofferraum hinter einem Trenngitter") + f'''
|
||||
<div class="row row--3">
|
||||
@@ -364,17 +392,123 @@ page("transportboxen.html", "Transportboxen nach Maß – Schmacko Napf",
|
||||
</div>
|
||||
|
||||
{contact()}''')
|
||||
PAGES.append("transportboxen.html")
|
||||
|
||||
# ================================================================ Über mich
|
||||
page("ueber-mich.html", "Über mich – Schmacko Napf",
|
||||
"Katha – zertifizierte Hundetrainerin nach § 11 TierSchG sowie Hunde-Ernährungs- und Gesundheitsberaterin. Ausbildungen und Weiterbildungen.",
|
||||
"ueber-mich.html",
|
||||
page_hero("katha-heide", "Über mich", "Hallo,<br>ich bin Katha.",
|
||||
"Mein Herz gehört den Tieren – an meiner Seite meine Holländische Schäferhündin Elina.",
|
||||
"Katha sitzt mit ihrer Schäferhündin im Grünen") + f'''
|
||||
<div class="row row--wide-r">
|
||||
<div class="panel panel--cream reveal">
|
||||
<span class="kicker">Warum ich das mache</span>
|
||||
<h2 class="title">Tiere sind die<br>ehrlichsten Wesen.</h2>
|
||||
<p class="big">Und trotzdem werden sie oft missverstanden. Ich möchte meine Erfahrung teilen und ihre Welt ein Stück besser machen.</p>
|
||||
</div>
|
||||
<div class="panel panel--photo plain reveal d1">{img("hund-wald", "Schwarze Schäferhündin steht aufmerksam im Wald")}</div>
|
||||
</div>
|
||||
|
||||
<div class="row row--wide">
|
||||
<div class="panel panel--photo plain reveal">{img("hund-rennt", "Schwarzer Schäferhund rennt über einen Feldweg")}</div>
|
||||
<div class="panel panel--sage reveal d1">
|
||||
<span class="kicker">Wie alles begann</span>
|
||||
<h2 class="title">Mit der Frage nach<br>dem richtigen Futter.</h2>
|
||||
<p class="big">Für meine eigene Hündin suchte ich die beste Ernährung – daraus wurde eine Leidenschaft und schließlich mein Beruf.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel panel--ink panel--auto reveal">
|
||||
<span class="kicker">Ausbildungen</span>
|
||||
<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&H Tierernährung</span></li>
|
||||
<li><small>2024</small><strong>Hunde-Gesundheitsberaterin</strong><span>G&H Tierernährung</span></li>
|
||||
<li><small>Okt. 2024</small><strong>Erlaubnis nach § 11 TierSchG</strong><span>Veterinäramt Landshut</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="panel panel--cream panel--auto reveal">
|
||||
<span class="kicker">Weiterbildungen</span>
|
||||
<ul class="list-big">
|
||||
<li><small>2025</small>Webinar „Pankreas – ein Drüsenorgan mit vielen Aufgaben“</li>
|
||||
<li><small>2025</small>Roundtable der BIG FIVE – Problemverhalten richtig einschätzen</li>
|
||||
<li><small>2024</small>Workshop „Einschätzen von 8 Malinois“</li>
|
||||
<li><small>2024</small>Workshop „Arbeiten mit schwierigen Hunden & Selbstschutz“</li>
|
||||
<li><small>2023</small>Blutbilder verstehen · Äußere Anzeichen – innere Organe</li>
|
||||
<li><small>2023</small>Blickschulung – Hunde ganzheitlich betrachtet</li>
|
||||
<li><small>2023</small>Zusatzqualifikation Katzen-Ernährungsberaterin</li>
|
||||
<li><small>2021</small>D.O.Q.-Test 2.0 (Hundeführerschein)</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{contact("katha-abendlicht", "Katha mit ihrem Hund auf einer Wiese im Abendlicht")}''')
|
||||
PAGES.append("ueber-mich.html")
|
||||
|
||||
# ================================================================ Impressum
|
||||
page("impressum.html", "Impressum – Schmacko Napf", "Impressum von Schmacko Napf & Hundetraining by Katha.", None, f''' <div class="panel panel--cream panel--auto">
|
||||
<span class="kicker">Rechtliches</span>
|
||||
<h1 class="display">Impressum</h1>
|
||||
<div class="legal" style="margin-top:48px">
|
||||
<p><b>Angaben gemäß § 5 TMG</b>Katharina Schulz<br>Seewiese 19<br>84109 Wörth a.d. Isar</p>
|
||||
<p><b>Kontakt</b>Telefon: {PHONE}<br>E-Mail: {MAIL}</p>
|
||||
<p><b>Verantwortlich gemäß § 18 Abs. 2 MStV</b>Katharina Schulz, Anschrift wie oben</p>
|
||||
<p><b>Fotos</b>Steffi Biller, KK-Fotografie · weitere Bilder: Unsplash</p>
|
||||
<div class="legal">
|
||||
<p><b>Angaben gemäß § 5 DDG</b>Katharina Schulz<br>Schmacko Napf & Hundetraining by Katha<br>Seewiese 19<br>84109 Wörth a.d. Isar</p>
|
||||
<p><b>Kontakt</b>Telefon: <a href="{PHONE_HREF}">{PHONE}</a><br>E-Mail: <a href="mailto:{MAIL}">{MAIL}</a></p>
|
||||
<p><b>Erlaubnis und Aufsichtsbehörde</b>Erlaubnis zur gewerbsmäßigen Ausbildung von Hunden für Dritte nach § 11 Abs. 1 Nr. 8 f TierSchG, erteilt im Oktober 2024 durch das Veterinäramt Landshut.</p>
|
||||
<p><b>Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV</b>Katharina Schulz, Anschrift wie oben</p>
|
||||
<p><b>Verbraucherstreitbeilegung</b>Ich bin nicht bereit und nicht verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.</p>
|
||||
<p><b>Bildnachweis</b>Fotos von Katha und ihren Hunden: Steffi Biller, KK-Fotografie. Weitere Bilder: Unsplash.</p>
|
||||
</div>
|
||||
</div>
|
||||
''')
|
||||
''', robots="noindex")
|
||||
PAGES.append("impressum.html")
|
||||
|
||||
# ================================================================ Datenschutz
|
||||
page("datenschutz.html", "Datenschutz – Schmacko Napf", "Datenschutzerklärung von Schmacko Napf & Hundetraining by Katha.", None, f''' <div class="panel panel--cream panel--auto">
|
||||
<span class="kicker">Rechtliches</span>
|
||||
<h1 class="display">Datenschutz</h1>
|
||||
<div class="legal">
|
||||
<p>Der Schutz deiner Daten ist mir wichtig. Diese Website kommt ohne Cookies, ohne Tracking und ohne Inhalte von Drittanbietern aus. Schriften und Bilder liegen auf dem eigenen Server.</p>
|
||||
|
||||
<h2>1. Verantwortliche</h2>
|
||||
<p>Katharina Schulz<br>Seewiese 19<br>84109 Wörth a.d. Isar<br>E-Mail: <a href="mailto:{MAIL}">{MAIL}</a><br>Telefon: <a href="{PHONE_HREF}">{PHONE}</a></p>
|
||||
|
||||
<h2>2. Aufruf der Website (Server-Logfiles)</h2>
|
||||
<p>Beim Aufruf dieser Website verarbeitet der Hosting-Anbieter automatisch technische Daten, die dein Browser übermittelt: IP-Adresse, Datum und Uhrzeit, aufgerufene Seite, Referrer-URL, Browsertyp und Betriebssystem. Das ist nötig, um die Website sicher und stabil auszuliefern (Art. 6 Abs. 1 lit. f DSGVO). Die Daten werden nicht mit anderen Daten zusammengeführt und nach kurzer Zeit gelöscht. Mit dem Hosting-Anbieter besteht ein Vertrag zur Auftragsverarbeitung.</p>
|
||||
|
||||
<h2>3. Verschlüsselung</h2>
|
||||
<p>Die Website wird über eine verschlüsselte Verbindung (HTTPS/TLS) ausgeliefert. Du erkennst das am Schloss-Symbol in der Adresszeile deines Browsers.</p>
|
||||
|
||||
<h2>4. Kontakt per E-Mail, Telefon oder WhatsApp</h2>
|
||||
<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>
|
||||
<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>
|
||||
<p>Oktober 2026</p>
|
||||
</div>
|
||||
</div>
|
||||
''', robots="noindex")
|
||||
PAGES.append("datenschutz.html")
|
||||
|
||||
# ================================================================ 404
|
||||
page("404.html", "Seite nicht gefunden – Schmacko Napf", "Diese Seite gibt es leider nicht.", None, f''' <div class="panel panel--ink panel--mid panel--center">
|
||||
<span class="kicker">Fehler 404</span>
|
||||
<h1 class="display">Hier ist leider<br>nichts zu finden.</h1>
|
||||
<p class="big">Vielleicht hat ein Hund die Seite vergraben. Über die Startseite findest du alles wieder.</p>
|
||||
<div class="btn-row"><a class="btn btn--sage" href="index.html">Zur Startseite {I["arrow"]}</a></div>
|
||||
</div>
|
||||
''', robots="noindex")
|
||||
|
||||
# 404 wird vom Server unter beliebigen Pfaden ausgeliefert – Links und Bilder relativ zur Wurzel auflösen
|
||||
p404 = os.path.join(OUT, "404.html")
|
||||
html404 = open(p404).read().replace("<head>", '<head>\n <base href="/">', 1)
|
||||
open(p404, "w").write(html404)
|
||||
|
||||
# ================================================================ robots.txt & sitemap.xml
|
||||
write("robots.txt", f"User-agent: *\nAllow: /\n\nSitemap: {SITE}/sitemap.xml\n")
|
||||
urls = "\n".join(f" <url><loc>{SITE}/{'' if p == 'index.html' else p}</loc></url>" for p in PAGES if p not in ("impressum.html", "datenschutz.html"))
|
||||
write("sitemap.xml", f'<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n{urls}\n</urlset>\n')
|
||||
print("ok")
|
||||
Reference in new issue
Block a user