diff --git a/.gitignore b/.gitignore index c12ea99..d457fff 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,6 @@ __pycache__/ *.log node_modules/ + +# Übergabe-Paket +*.zip diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..1901a25 --- /dev/null +++ b/.htaccess @@ -0,0 +1,18 @@ +# Für Apache-Webspace (z. B. IONOS, Strato, All-Inkl). Auf anderen Servern wird die Datei ignoriert. +ErrorDocument 404 /404.html + + + AddOutputFilterByType DEFLATE text/html text/css application/javascript image/svg+xml + + + + ExpiresActive On + ExpiresByType text/html "access plus 0 seconds" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + diff --git a/404.html b/404.html new file mode 100644 index 0000000..394e152 --- /dev/null +++ b/404.html @@ -0,0 +1,66 @@ + + + + + + + Seite nicht gefunden – Schmacko Napf + + + + + + + + + + + + + + + + + + + +
+
+ Fehler 404 +

Hier ist leider
nichts zu finden.

+

Vielleicht hat ein Hund die Seite vergraben. Über die Startseite findest du alles wieder.

+ +
+ +
+ + + diff --git a/README.md b/README.md index b978267..2d7b826 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,23 @@ # Schmacko Napf & Hundetraining by Katha — Website -Neuer Entwurf für die Website von Katha (bisher WordPress: `schmacko-napf.de`). Statisches HTML/CSS/JS. +Neue Website für Katha (bisher WordPress auf `schmacko-napf.de`). Statisches HTML/CSS/JS, keine Cookies, kein Tracking, keine Drittanbieter – Schrift und Bilder liegen lokal. Deshalb ist kein Cookie-Banner nötig. | Datei | Seite | |---|---| | `index.html` | Start: 4 Kacheln mit Logo-Siegel, darunter Über mich, Training, Ernährung, 5 Säulen, Shop/Transportboxen, Kontakt | | `hundeschule.html` | Einzeltraining, Außentraining, 5 Säulen, Preise | | `ernaehrung.html` | Futterarten, Ablauf, Preise | -| `shop.html` | Sortiment (Platzhaltertext, Shop im Aufbau) | -| `transportboxen.html` | Maßanfertigung fürs Auto (Platzhaltertext) | -| `impressum.html` | Impressum | -| `assets/site.css` | Farben (oben als Variablen) und alle Komponenten | -| `assets/site.js` | Menü, Header nach dem Hero, Einblend-Animationen | +| `shop.html` | Sortiment (Shop im Aufbau) | +| `transportboxen.html` | Maßanfertigung fürs Auto | +| `ueber-mich.html` | Katha, Ausbildungen, Weiterbildungen | +| `impressum.html`, `datenschutz.html` | Rechtstexte | +| `404.html` | Fehlerseite (per `.htaccess` auf Apache-Servern aktiv) | +| `assets/site.css` | Farben (oben als Variablen), Schrift, alle Komponenten | +| `assets/site.js` | Menü, Header nach dem Hero, Logo-Ring, Einblend-Animationen | +| `assets/img/` | Web-Bilder (WebP), erzeugt aus `tools/originals/` | +| `assets/fonts/` | Questrial (SIL Open Font License) | | `tools/build_pages.py` | **Quelle der Seiten** — Inhalte hier ändern, dann neu erzeugen | +| `tools/optimize_images.py` | erzeugt `assets/img/`, Apple-Icon und Vorschaubild aus `tools/originals/` | ## Lokal ansehen @@ -20,16 +25,23 @@ Neuer Entwurf für die Website von Katha (bisher WordPress: `schmacko-napf.de`). python3 -m http.server 4175 ``` -Dann http://localhost:4175 öffnen. +Dann http://localhost:4175 öffnen. `index.html` lässt sich auch direkt per Doppelklick öffnen. -## Seiten ändern +## Ändern ```bash -python3 tools/build_pages.py +python3 tools/build_pages.py # nach Text-/Strukturänderungen +python3 tools/optimize_images.py # nach neuen Bildern in tools/originals/ ``` -## Offen +`build_pages.py` braucht Pillow (`pip install pillow`). -- Logo und Fotos (KK-Fotografie) werden noch direkt von `schmacko-napf.de` geladen, die übrigen Bilder von Unsplash — vor dem Livegang lokal in `assets/img/` ablegen. -- Texte für Shop und Transportboxen sind Platzhalter. -- Datenschutzerklärung fehlt noch. +## Veröffentlichen + +Alles außer `tools/`, `README.md` und `.git` in das Hauptverzeichnis des Webspace laden. Die Seite geht von der Domain `https://schmacko-napf.de` aus (Canonical, Sitemap, Vorschaubild) – bei anderer Domain `SITE` in `tools/build_pages.py` ändern und neu erzeugen. + +## Vor dem Livegang prüfen + +- Texte für Shop und Transportboxen mit Katha abstimmen (aktuell allgemein formuliert). +- Impressum und Datenschutz rechtlich prüfen lassen; im Datenschutz ggf. den Hosting-Anbieter namentlich nennen. +- Nutzungsrecht der Fotos von KK-Fotografie (Steffi Biller) für die neue Seite bestätigen. diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000..0efac63 Binary files /dev/null and b/apple-touch-icon.png differ diff --git a/assets/favicon.svg b/assets/favicon.svg new file mode 100644 index 0000000..ea5852c --- /dev/null +++ b/assets/favicon.svg @@ -0,0 +1 @@ + diff --git a/assets/fonts/questrial-latin-ext.woff2 b/assets/fonts/questrial-latin-ext.woff2 new file mode 100644 index 0000000..64feca3 Binary files /dev/null and b/assets/fonts/questrial-latin-ext.woff2 differ diff --git a/assets/fonts/questrial-latin.woff2 b/assets/fonts/questrial-latin.woff2 new file mode 100644 index 0000000..c70a084 Binary files /dev/null and b/assets/fonts/questrial-latin.woff2 differ diff --git a/assets/img/barf-teller.webp b/assets/img/barf-teller.webp new file mode 100644 index 0000000..c52d932 Binary files /dev/null and b/assets/img/barf-teller.webp differ diff --git a/assets/img/futternapf-900.webp b/assets/img/futternapf-900.webp new file mode 100644 index 0000000..00df6c3 Binary files /dev/null and b/assets/img/futternapf-900.webp differ diff --git a/assets/img/futternapf.webp b/assets/img/futternapf.webp new file mode 100644 index 0000000..e1f0816 Binary files /dev/null and b/assets/img/futternapf.webp differ diff --git a/assets/img/hund-rennt-900.webp b/assets/img/hund-rennt-900.webp new file mode 100644 index 0000000..df529af Binary files /dev/null and b/assets/img/hund-rennt-900.webp differ diff --git a/assets/img/hund-rennt.webp b/assets/img/hund-rennt.webp new file mode 100644 index 0000000..5e83569 Binary files /dev/null and b/assets/img/hund-rennt.webp differ diff --git a/assets/img/hund-wald-900.webp b/assets/img/hund-wald-900.webp new file mode 100644 index 0000000..2192c6c Binary files /dev/null and b/assets/img/hund-wald-900.webp differ diff --git a/assets/img/hund-wald.webp b/assets/img/hund-wald.webp new file mode 100644 index 0000000..963e93d Binary files /dev/null and b/assets/img/hund-wald.webp differ diff --git a/assets/img/katha-abendlicht-900.webp b/assets/img/katha-abendlicht-900.webp new file mode 100644 index 0000000..27b7ca6 Binary files /dev/null and b/assets/img/katha-abendlicht-900.webp differ diff --git a/assets/img/katha-abendlicht.webp b/assets/img/katha-abendlicht.webp new file mode 100644 index 0000000..39eb417 Binary files /dev/null and b/assets/img/katha-abendlicht.webp differ diff --git a/assets/img/katha-heide-900.webp b/assets/img/katha-heide-900.webp new file mode 100644 index 0000000..2ef3b5b Binary files /dev/null and b/assets/img/katha-heide-900.webp differ diff --git a/assets/img/katha-heide.webp b/assets/img/katha-heide.webp new file mode 100644 index 0000000..c15951e Binary files /dev/null and b/assets/img/katha-heide.webp differ diff --git a/assets/img/kofferraum-900.webp b/assets/img/kofferraum-900.webp new file mode 100644 index 0000000..e93246b Binary files /dev/null and b/assets/img/kofferraum-900.webp differ diff --git a/assets/img/kofferraum.webp b/assets/img/kofferraum.webp new file mode 100644 index 0000000..b118f81 Binary files /dev/null and b/assets/img/kofferraum.webp differ diff --git a/assets/img/laden-900.webp b/assets/img/laden-900.webp new file mode 100644 index 0000000..aba13d1 Binary files /dev/null and b/assets/img/laden-900.webp differ diff --git a/assets/img/laden.webp b/assets/img/laden.webp new file mode 100644 index 0000000..b0ad9c0 Binary files /dev/null and b/assets/img/laden.webp differ diff --git a/assets/img/logo.webp b/assets/img/logo.webp new file mode 100644 index 0000000..0066e37 Binary files /dev/null and b/assets/img/logo.webp differ diff --git a/assets/img/vorschau.jpg b/assets/img/vorschau.jpg new file mode 100644 index 0000000..e49ff35 Binary files /dev/null and b/assets/img/vorschau.jpg differ diff --git a/assets/site.css b/assets/site.css index e487306..f0e30ba 100644 --- a/assets/site.css +++ b/assets/site.css @@ -1,3 +1,21 @@ +/* ===== Schrift (lokal, Questrial – SIL Open Font License) ===== */ +@font-face { + font-family: "Questrial"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("fonts/questrial-latin.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: "Questrial"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("fonts/questrial-latin-ext.woff2") format("woff2"); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + /* ===== Farben – aus dem Schmacko-Napf-Branding ===== */ :root { --bg: #fcfaf4; /* Creme */ @@ -33,6 +51,15 @@ h1, h2, h3 { font-weight: 400; line-height: 1.05; letter-spacing: -.025em; margi p { margin: 0; } svg { flex: none; } +/* Tastatur: direkt zum Inhalt */ +.skip { + position: fixed; left: 16px; top: 16px; z-index: 100; + padding: 12px 20px; border-radius: 999px; + background: var(--ink); color: var(--bg); + transform: translateY(-200%); +} +.skip:focus { transform: none; } + /* ===== Header: Logo und Menü als zwei schwebende Elemente ===== */ .site-header { position: sticky; top: 0; z-index: 50; @@ -332,6 +359,8 @@ a.panel--photo:hover > img { transform: scale(1.04); } a.panel:hover .panel-arrow { background: var(--sage); border-color: var(--sage); color: var(--ink); } a.panel:hover .panel-arrow svg { transform: rotate(-45deg); } +.panel-arrow--ink { background: var(--ink); border-color: var(--ink); } + /* Kurze Fakten als Pillen */ .facts { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 30px; } .fact { @@ -372,6 +401,29 @@ a.panel:hover .panel-arrow svg { transform: rotate(-45deg); } .words small { font-size: 1rem; letter-spacing: .1em; color: var(--sage); width: 2.2em; flex: none; } .words span { font-size: clamp(1.05rem, 1.4vw, 1.3rem); letter-spacing: 0; color: color-mix(in srgb, var(--bg) 70%, transparent); margin-left: auto; text-align: right; max-width: 26ch; line-height: 1.35; } +/* Qualifikationen (auf dunkler Fläche) */ +.quals { list-style: none; padding: 0; margin: 10px 0 0; } +.quals li { + display: grid; grid-template-columns: 9em 1fr auto; align-items: baseline; gap: 12px 32px; + padding: clamp(18px, 2vw, 28px) 0; + border-bottom: 1px solid rgba(255, 255, 255, .12); +} +.quals small { font-size: 1rem; letter-spacing: .06em; color: var(--sage); } +.quals strong { font-weight: 400; font-size: clamp(1.6rem, 3.2vw, 3rem); line-height: 1.05; letter-spacing: -.02em; } +.quals span { color: color-mix(in srgb, var(--bg) 70%, transparent); font-size: clamp(1.05rem, 1.4vw, 1.25rem); text-align: right; } + +/* Liste mit Jahreszahl (auf heller Fläche) */ +.list-big { list-style: none; padding: 0; margin: 10px 0 0; columns: 2; column-gap: clamp(32px, 5vw, 80px); } +.list-big li { + break-inside: avoid; + display: flex; gap: 20px; align-items: baseline; + padding: 18px 0; + border-bottom: 1px solid var(--line); + font-size: clamp(1.15rem, 1.6vw, 1.4rem); + line-height: 1.35; +} +.list-big small { flex: none; width: 3em; font-size: 1rem; color: var(--muted); } + /* Schritte */ .steps { list-style: none; padding: 0; margin: 40px 0 0; display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--gap); } .steps li { border-top: 1px solid rgba(255, 255, 255, .2); padding-top: 22px; } @@ -445,7 +497,9 @@ a.panel:hover .panel-arrow svg { transform: rotate(-45deg); } .page-hero h1 { font-size: clamp(3.2rem, 8vw, 8rem); letter-spacing: -.035em; line-height: .98; } /* Text-Seite (Impressum) */ -.legal { font-size: clamp(1.15rem, 1.5vw, 1.35rem); line-height: 1.6; } +.legal { font-size: clamp(1.1rem, 1.4vw, 1.3rem); line-height: 1.6; max-width: 46em; margin-top: 48px; } +.legal h2 { font-size: clamp(1.5rem, 2.2vw, 2rem); margin: 52px 0 16px; letter-spacing: -.015em; } +.legal a { text-decoration: underline; text-underline-offset: 3px; } .legal p + p { margin-top: 28px; } .legal b { font-weight: 400; display: block; font-size: 1rem; letter-spacing: .16em; text-transform: uppercase; opacity: .7; margin-bottom: 6px; } @@ -478,6 +532,9 @@ a.panel:hover .panel-arrow svg { transform: rotate(-45deg); } .panel--photo.tall { min-height: 80svh; } .plate-panel { min-height: 0; padding-block: 56px; } .words span { display: none; } + .quals li { grid-template-columns: 1fr; gap: 6px; } + .quals span { text-align: left; } + .list-big { columns: 1; } } @media (max-width: 767px) { body { font-size: 18px; } diff --git a/datenschutz.html b/datenschutz.html new file mode 100644 index 0000000..9df47f6 --- /dev/null +++ b/datenschutz.html @@ -0,0 +1,86 @@ + + + + + + Datenschutz – Schmacko Napf + + + + + + + + + + + + + + + + + + + +
+
+ Rechtliches +

Datenschutz

+ +
+ +
+ + + diff --git a/ernaehrung.html b/ernaehrung.html index 78428fc..4da3c01 100644 --- a/ernaehrung.html +++ b/ernaehrung.html @@ -5,30 +5,39 @@ Ernährungsberatung – Schmacko Napf + - - - - - + + + + + + + + + + + + -
+
- Hund schnuppert an einem Napf mit Trockenfutter + Hund schnuppert an einem Napf mit Trockenfutter Ernährungs- & Gesundheitsberatung

Fürsorge
in Napfform.

Individuelle Futterpläne – gesund, sensibel oder mit Diagnose.

@@ -41,7 +50,7 @@

Ich bringe Klarheit in die Futter-Frage – und erstelle einen Plan, der zu deinem Hund passt.

BARFTeil-BARFKoch-BARFNassfutterTrockenfutter
-
Teller mit frischem Fleisch, Gemüse und Obst
+
Teller mit frischem Fleisch, Gemüse und Obst
@@ -83,11 +92,11 @@ info@schmacko-napf.de
-
Schwarze Schäferhündin steht aufmerksam im Wald
+
Schwarze Schäferhündin steht aufmerksam im Wald
- +
diff --git a/hundeschule.html b/hundeschule.html index f974579..cd6375c 100644 --- a/hundeschule.html +++ b/hundeschule.html @@ -5,30 +5,39 @@ Hundetraining – Schmacko Napf + - - - - - + + + + + + + + + + + + -
+
- Katha mit ihrem Hund auf einer Wiese im Abendlicht + Katha mit ihrem Hund auf einer Wiese im Abendlicht Hundetraining

Für beide Seiten
der Leine.

Vertrauen, klare Kommunikation und Training, das im Alltag funktioniert.

@@ -41,11 +50,11 @@

Für Grundgehorsam, Unsicherheit, Leinenführigkeit oder einen neuen Hund im Haus.

60 €pro Stunde · nach dem Erstgespräch (120 €, ca. 2 Std.)
-
Schwarze Schäferhündin steht aufmerksam im Wald
+
Schwarze Schäferhündin steht aufmerksam im Wald
-
Schwarzer Schäferhund rennt über einen Feldweg
+
Schwarzer Schäferhund rennt über einen Feldweg
Gruppe & Außentraining

Training da, wo
das Leben ist.

@@ -71,7 +80,7 @@
Erstgespräch Einzeltrainingca. 2 Stunden · zzgl. 0,30 € / km120 €
Einzeltrainingpro Stunde · zzgl. 0,30 € / km60 €
-
Gruppentrainingpro Mensch-Hund-Team18 €
+
Gruppentrainingpro Mensch-Hund-Team · max. 2 Hunde pro Halter18 €
10er-KarteGruppe & Einzel frei kombinierbar165 €
@@ -86,11 +95,11 @@ info@schmacko-napf.de
-
Katha sitzt mit ihrer Schäferhündin im Grünen
+
Katha sitzt mit ihrer Schäferhündin im Grünen
- +
diff --git a/impressum.html b/impressum.html index b134713..ada8dfb 100644 --- a/impressum.html +++ b/impressum.html @@ -5,41 +5,53 @@ Impressum – Schmacko Napf + + - - - - - + + + + + + + + + + + + -
+
Rechtliches

Impressum

-
- +
diff --git a/index.html b/index.html index 32589ab..8869e73 100644 --- a/index.html +++ b/index.html @@ -4,23 +4,32 @@ Schmacko Napf & Hundetraining by Katha - + + - - - - - + + + + + + + + + + + +
diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..cb9b0f0 --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://schmacko-napf.de/sitemap.xml diff --git a/shop.html b/shop.html index 38d7f1b..cfd271c 100644 --- a/shop.html +++ b/shop.html @@ -5,30 +5,39 @@ Shop – Schmacko Napf + - - - - - + + + + + + + + + + + + -
+
- Hund in einem Laden mit Hundezubehör + Hund in einem Laden mit Hundezubehör Shop

Ausgewählt
mit Herz.

Futter, Snacks und Zubehör, hinter denen ich stehe.

@@ -54,11 +63,11 @@ info@schmacko-napf.de -
Schwarze Schäferhündin steht aufmerksam im Wald
+
Schwarze Schäferhündin steht aufmerksam im Wald
- +
diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..a2bba06 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,9 @@ + + + https://schmacko-napf.de/ + https://schmacko-napf.de/hundeschule.html + https://schmacko-napf.de/ernaehrung.html + https://schmacko-napf.de/shop.html + https://schmacko-napf.de/transportboxen.html + https://schmacko-napf.de/ueber-mich.html + diff --git a/tools/build_pages.py b/tools/build_pages.py index 4b797b2..6decdce 100644 --- a/tools/build_pages.py +++ b/tools/build_pages.py @@ -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'{alt}' PHONE, PHONE_HREF = "+49 176 569 329 42", "tel:+4917656932942" MAIL = "info@schmacko-napf.de" @@ -38,21 +47,30 @@ I = { ARROW_BADGE = f'{I["arrow"]}' 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 ' if robots else "" return f''' {title} - + {meta_robots} + - - - - + + + + + + + + + + ''' @@ -60,9 +78,10 @@ def head(title, desc): def header(current=None): cur = ' aria-current="page"' links = "\n".join(f' {t}' for h, t in NAV) - return f'''
@@ -109,34 +129,35 @@ def footer(): ''' -def page_hero(img, kicker, title, text, alt): +def page_hero(photo, kicker, title, text, alt): return f'''
- {alt} + {img(photo, alt, "100vw", lazy=False)} {kicker}

{title}

{text}

''' -def page(name, title, desc, current, body): - write(name, head(title, desc) + "\n" + header(current) + '
\n' + body + footer()) +def page(name, title, desc, current, body, robots=""): + write(name, head(title, desc, name, robots) + "\n" + header(current) + '
\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"{sub}" 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''' - {alt} + {img(photo, alt, "(max-width: 767px) 100vw, 50vw", lazy=False)} {name}{small} {I["arrow"]} @@ -144,17 +165,20 @@ for href, name, sub, src, alt, pid in tiles: ''' -index = head("Schmacko Napf & Hundetraining by Katha", "Hundetraining, Ernährungs- und Gesundheitsberatung, Shop und maßgefertigte Transportboxen – Schmacko Napf by Katha.") + '\n' + header() + f'''
+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") + '\n' + header() + f'''
-
- - Schwarzer Schäferhund rennt freudig über einen Feldweg + {img("hund-rennt", "Schwarzer Schäferhund rennt freudig über einen Feldweg", "100vw")} {ARROW_BADGE} Hundetraining

Entspannt durch
den Alltag.

@@ -180,9 +204,9 @@ index = head("Schmacko Napf & Hundetraining by Katha", "Hundetraining, Ernährun
\n", "
\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
der Leine.", + page_hero("katha-abendlicht", "Hundetraining", "Für beide Seiten
der Leine.", "Vertrauen, klare Kommunikation und Training, das im Alltag funktioniert.", "Katha mit ihrem Hund auf einer Wiese im Abendlicht") + f'''
@@ -238,11 +263,11 @@ page("hundeschule.html", "Hundetraining – Schmacko Napf",

Für Grundgehorsam, Unsicherheit, Leinenführigkeit oder einen neuen Hund im Haus.

60 €pro Stunde · nach dem Erstgespräch (120 €, ca. 2 Std.)
-
Schwarze Schäferhündin steht aufmerksam im Wald
+
{img("hund-wald", "Schwarze Schäferhündin steht aufmerksam im Wald")}
-
Schwarzer Schäferhund rennt über einen Feldweg
+
{img("hund-rennt", "Schwarzer Schäferhund rennt über einen Feldweg")}
Gruppe & Außentraining

Training da, wo
das Leben ist.

@@ -268,18 +293,19 @@ page("hundeschule.html", "Hundetraining – Schmacko Napf",
Erstgespräch Einzeltrainingca. 2 Stunden · zzgl. 0,30 € / km120 €
Einzeltrainingpro Stunde · zzgl. 0,30 € / km60 €
-
Gruppentrainingpro Mensch-Hund-Team18 €
+
Gruppentrainingpro Mensch-Hund-Team · max. 2 Hunde pro Halter18 €
10er-KarteGruppe & Einzel frei kombinierbar165 €
-{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
in Napfform.", + page_hero("futternapf", "Ernährungs- & Gesundheitsberatung", "Fürsorge
in Napfform.", "Individuelle Futterpläne – gesund, sensibel oder mit Diagnose.", "Hund schnuppert an einem Napf mit Trockenfutter") + f'''
@@ -289,7 +315,7 @@ page("ernaehrung.html", "Ernährungsberatung – Schmacko Napf",

Ich bringe Klarheit in die Futter-Frage – und erstelle einen Plan, der zu deinem Hund passt.

BARFTeil-BARFKoch-BARFNassfutterTrockenfutter
-
Teller mit frischem Fleisch, Gemüse und Obst
+
Teller mit frischem Fleisch, Gemüse und Obst
@@ -322,10 +348,11 @@ page("ernaehrung.html", "Ernährungsberatung – Schmacko Napf",
{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
mit Herz.", + page_hero("laden", "Shop", "Ausgewählt
mit Herz.", "Futter, Snacks und Zubehör, hinter denen ich stehe.", "Hund in einem Laden mit Hundezubehör") + f'''
@@ -339,11 +366,12 @@ page("shop.html", "Shop – Schmacko Napf", "Ausgewähltes Futter, Snacks und Zu
{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
fürs Auto.", + page_hero("kofferraum", "Maßanfertigung", "Transportboxen
fürs Auto.", "Passgenau für dein Fahrzeug und deinen Hund.", "Hund sitzt im offenen Kofferraum hinter einem Trenngitter") + f'''
@@ -364,17 +392,123 @@ page("transportboxen.html", "Transportboxen nach Maß – Schmacko Napf",
{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,
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''' +
+
+ Warum ich das mache +

Tiere sind die
ehrlichsten Wesen.

+

Und trotzdem werden sie oft missverstanden. Ich möchte meine Erfahrung teilen und ihre Welt ein Stück besser machen.

+
+
{img("hund-wald", "Schwarze Schäferhündin steht aufmerksam im Wald")}
+
+ +
+
{img("hund-rennt", "Schwarzer Schäferhund rennt über einen Feldweg")}
+
+ Wie alles begann +

Mit der Frage nach
dem richtigen Futter.

+

Für meine eigene Hündin suchte ich die beste Ernährung – daraus wurde eine Leidenschaft und schließlich mein Beruf.

+
+
+ +
+ Ausbildungen +
    +
  • 2021 – 2023HundetrainerinDiane Bartlog, Hundeschule Mengkofen
  • +
  • 2022 – 2023Hunde-ErnährungsberaterinHeidi Herrmann, G&H Tierernährung
  • +
  • 2024Hunde-GesundheitsberaterinG&H Tierernährung
  • +
  • Okt. 2024Erlaubnis nach § 11 TierSchGVeterinäramt Landshut
  • +
+
+ +
+ Weiterbildungen +
    +
  • 2025Webinar „Pankreas – ein Drüsenorgan mit vielen Aufgaben“
  • +
  • 2025Roundtable der BIG FIVE – Problemverhalten richtig einschätzen
  • +
  • 2024Workshop „Einschätzen von 8 Malinois“
  • +
  • 2024Workshop „Arbeiten mit schwierigen Hunden & Selbstschutz“
  • +
  • 2023Blutbilder verstehen · Äußere Anzeichen – innere Organe
  • +
  • 2023Blickschulung – Hunde ganzheitlich betrachtet
  • +
  • 2023Zusatzqualifikation Katzen-Ernährungsberaterin
  • +
  • 2021D.O.Q.-Test 2.0 (Hundeführerschein)
  • +
+
+ +{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'''
Rechtliches

Impressum

- -''') +''', robots="noindex") +PAGES.append("impressum.html") + +# ================================================================ Datenschutz +page("datenschutz.html", "Datenschutz – Schmacko Napf", "Datenschutzerklärung von Schmacko Napf & Hundetraining by Katha.", None, f'''
+ Rechtliches +

Datenschutz

+ +
+''', robots="noindex") +PAGES.append("datenschutz.html") + +# ================================================================ 404 +page("404.html", "Seite nicht gefunden – Schmacko Napf", "Diese Seite gibt es leider nicht.", None, f'''
+ Fehler 404 +

Hier ist leider
nichts zu finden.

+

Vielleicht hat ein Hund die Seite vergraben. Über die Startseite findest du alles wieder.

+ +
+''', 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("", '\n ', 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" {SITE}/{'' if p == 'index.html' else p}" for p in PAGES if p not in ("impressum.html", "datenschutz.html")) +write("sitemap.xml", f'\n\n{urls}\n\n') print("ok") diff --git a/tools/optimize_images.py b/tools/optimize_images.py new file mode 100644 index 0000000..1290d19 --- /dev/null +++ b/tools/optimize_images.py @@ -0,0 +1,60 @@ +"""Erzeugt aus tools/originals/ die Web-Bilder in assets/img/ (WebP, zwei Größen) sowie Icons und Vorschaubild. + + python3 tools/optimize_images.py +""" +import os +from PIL import Image, ImageDraw + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +SRC = os.path.join(ROOT, "tools", "originals") +OUT = os.path.join(ROOT, "assets", "img") +os.makedirs(OUT, exist_ok=True) + +CREAM = (252, 250, 244) +PHOTOS = ["katha-abendlicht", "katha-heide", "hund-wald", "hund-rennt", "futternapf", "laden", "kofferraum"] + + +def fit(img, longest): + img = img.copy() + img.thumbnail((longest, longest), Image.LANCZOS) + return img + + +def save_webp(img, name, quality=78): + path = os.path.join(OUT, name) + img.save(path, "WEBP", quality=quality, method=6) + print(f"{os.path.getsize(path) / 1024:6.0f} KB {name} {img.size[0]}x{img.size[1]}") + + +# Fotos: groß (1800) und klein (900) für Handy / halbe Kacheln +for name in PHOTOS: + img = Image.open(os.path.join(SRC, name + ".jpg")).convert("RGB") + save_webp(fit(img, 1800), f"{name}.webp") + save_webp(fit(img, 900), f"{name}-900.webp", quality=76) + +# Logo und BARF-Teller mit Transparenz +logo = Image.open(os.path.join(SRC, "logo.png")).convert("RGBA") +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) + +# Apple-Touch-Icon: Logo auf Creme +icon = Image.new("RGB", (180, 180), CREAM) +small = fit(logo, 172) +icon.paste(small, ((180 - small.width) // 2, (180 - small.height) // 2), small) +icon.save(os.path.join(ROOT, "apple-touch-icon.png")) + +# Vorschaubild für WhatsApp / Facebook (1200x630): Foto + Logo-Siegel +og = Image.open(os.path.join(SRC, "katha-abendlicht.jpg")).convert("RGB") +scale = 1200 / og.width +og = og.resize((1200, round(og.height * scale)), Image.LANCZOS) +top = max(0, (og.height - 630) // 2) +og = og.crop((0, top, 1200, top + 630)) +d = 300 +seal = Image.new("RGBA", (d, d), (0, 0, 0, 0)) +ImageDraw.Draw(seal).ellipse((0, 0, d - 1, d - 1), fill=CREAM + (255,)) +lg = fit(logo, int(d * .94)) +seal.paste(lg, ((d - lg.width) // 2, (d - lg.height) // 2), lg) +og.paste(seal, (1200 - d - 60, 50), seal) # oberhalb des Fotografen-Schriftzugs +og.save(os.path.join(OUT, "vorschau.jpg"), quality=82) +print("Icons und Vorschaubild erzeugt") diff --git a/tools/originals/barf-teller.png b/tools/originals/barf-teller.png new file mode 100644 index 0000000..f8a0ab7 Binary files /dev/null and b/tools/originals/barf-teller.png differ diff --git a/tools/originals/futternapf.jpg b/tools/originals/futternapf.jpg new file mode 100644 index 0000000..a14d4b8 Binary files /dev/null and b/tools/originals/futternapf.jpg differ diff --git a/tools/originals/hund-rennt.jpg b/tools/originals/hund-rennt.jpg new file mode 100644 index 0000000..4a32411 Binary files /dev/null and b/tools/originals/hund-rennt.jpg differ diff --git a/tools/originals/hund-wald.jpg b/tools/originals/hund-wald.jpg new file mode 100644 index 0000000..83e6296 Binary files /dev/null and b/tools/originals/hund-wald.jpg differ diff --git a/tools/originals/katha-abendlicht.jpg b/tools/originals/katha-abendlicht.jpg new file mode 100644 index 0000000..f2bafe4 Binary files /dev/null and b/tools/originals/katha-abendlicht.jpg differ diff --git a/tools/originals/katha-heide.jpg b/tools/originals/katha-heide.jpg new file mode 100644 index 0000000..02a6bb7 Binary files /dev/null and b/tools/originals/katha-heide.jpg differ diff --git a/tools/originals/kofferraum.jpg b/tools/originals/kofferraum.jpg new file mode 100644 index 0000000..7a669a0 Binary files /dev/null and b/tools/originals/kofferraum.jpg differ diff --git a/tools/originals/laden.jpg b/tools/originals/laden.jpg new file mode 100644 index 0000000..65919e7 Binary files /dev/null and b/tools/originals/laden.jpg differ diff --git a/tools/originals/logo.png b/tools/originals/logo.png new file mode 100644 index 0000000..a599f02 Binary files /dev/null and b/tools/originals/logo.png differ diff --git a/transportboxen.html b/transportboxen.html index 097c23e..ef87366 100644 --- a/transportboxen.html +++ b/transportboxen.html @@ -5,30 +5,39 @@ Transportboxen nach Maß – Schmacko Napf + - - - - - + + + + + + + + + + + + -
+
- Hund sitzt im offenen Kofferraum hinter einem Trenngitter + Hund sitzt im offenen Kofferraum hinter einem Trenngitter Maßanfertigung

Transportboxen
fürs Auto.

Passgenau für dein Fahrzeug und deinen Hund.

@@ -61,11 +70,11 @@ info@schmacko-napf.de
-
Schwarze Schäferhündin steht aufmerksam im Wald
+
Schwarze Schäferhündin steht aufmerksam im Wald
- +
diff --git a/ueber-mich.html b/ueber-mich.html new file mode 100644 index 0000000..874acdf --- /dev/null +++ b/ueber-mich.html @@ -0,0 +1,119 @@ + + + + + + Über mich – Schmacko Napf + + + + + + + + + + + + + + + + + + +
+
+ Katha sitzt mit ihrer Schäferhündin im Grünen + Über mich +

Hallo,
ich bin Katha.

+

Mein Herz gehört den Tieren – an meiner Seite meine Holländische Schäferhündin Elina.

+
+ +
+
+ Warum ich das mache +

Tiere sind die
ehrlichsten Wesen.

+

Und trotzdem werden sie oft missverstanden. Ich möchte meine Erfahrung teilen und ihre Welt ein Stück besser machen.

+
+
Schwarze Schäferhündin steht aufmerksam im Wald
+
+ +
+
Schwarzer Schäferhund rennt über einen Feldweg
+
+ Wie alles begann +

Mit der Frage nach
dem richtigen Futter.

+

Für meine eigene Hündin suchte ich die beste Ernährung – daraus wurde eine Leidenschaft und schließlich mein Beruf.

+
+
+ +
+ Ausbildungen +
    +
  • 2021 – 2023HundetrainerinDiane Bartlog, Hundeschule Mengkofen
  • +
  • 2022 – 2023Hunde-ErnährungsberaterinHeidi Herrmann, G&H Tierernährung
  • +
  • 2024Hunde-GesundheitsberaterinG&H Tierernährung
  • +
  • Okt. 2024Erlaubnis nach § 11 TierSchGVeterinäramt Landshut
  • +
+
+ +
+ Weiterbildungen +
    +
  • 2025Webinar „Pankreas – ein Drüsenorgan mit vielen Aufgaben“
  • +
  • 2025Roundtable der BIG FIVE – Problemverhalten richtig einschätzen
  • +
  • 2024Workshop „Einschätzen von 8 Malinois“
  • +
  • 2024Workshop „Arbeiten mit schwierigen Hunden & Selbstschutz“
  • +
  • 2023Blutbilder verstehen · Äußere Anzeichen – innere Organe
  • +
  • 2023Blickschulung – Hunde ganzheitlich betrachtet
  • +
  • 2023Zusatzqualifikation Katzen-Ernährungsberaterin
  • +
  • 2021D.O.Q.-Test 2.0 (Hundeführerschein)
  • +
+
+ +
+
+ Kontakt +

Lass uns
sprechen.

+ +
+
Katha mit ihrem Hund auf einer Wiese im Abendlicht
+
+ +
+ + +