Prüfdurchgang: Buchungslinks, alte Adressen, Tablet/Handy-Layout

- Buchungslinks direkt auf Portal-IDs; Ernährungsberatung auf id=107,
  Kaufberatung entfernt (im Portal gibt es keine Seite dafür)
- .htaccess: alte WordPress-Adressen per 301 auf die neuen Seiten
- Tablet bis 980 px: Logo-Siegel über den Kacheln statt darauf
- Handy: lange Wörter werden nicht mehr abgeschnitten, Pfeile
  überdecken keinen Text mehr, „Buchen“ neben dem Menü-Knopf
- Dreier-Karten: Überschriften auf einer Linie (Subgrid)
- Menü schließt mit Escape und Tipp daneben; sichtbarer Fokusrahmen
- Startseite Handy/Tablet: Kopfleiste, sobald das Siegel weg ist
- 404: Pfade ab der Wurzel statt <base>, Sprunglink bleibt auf der Seite

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
NotPika69andClaude Opus 5.5 committed 2026-10-04 13:32:54 +02:00
1 parent d154ea13c2
commit fef4ac8eae
14 files changed
+152 -97

No files matched your search

+14
View File
@@ -1,6 +1,20 @@
# Für Apache-Webspace (z. B. IONOS, Strato, All-Inkl). Auf anderen Servern wird die Datei ignoriert. # Für Apache-Webspace (z. B. IONOS, Strato, All-Inkl). Auf anderen Servern wird die Datei ignoriert.
ErrorDocument 404 /404.html ErrorDocument 404 /404.html
# Adressen der alten WordPress-Seite auf die neuen Seiten umleiten
# (Google-Treffer, Lesezeichen und die Links im PetWorkers-Portal auf /impressum/ und /kontakt/)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(hundetraining|einzeltraining-hausbesuch|gruppenstunden-aussentraining|preise-hundetraining)/?$ /hundeschule.html [R=301,L]
RewriteRule ^(einfache-rationspruefung|beratungsablauf|erst-anamnesegespraech|futterplaene|welpe-zum-junghund|welpe-und-junghund|erwachsener-hund|seniorenplan|der-seniorenplan|erkrankter-hund|aufbau-reduktionsplan|urlaubsplan-2|der-urlaubsplan)/?$ /ernaehrung.html [R=301,L]
RewriteRule ^category/futterplan(/.*)?$ /ernaehrung.html [R=301,L]
RewriteRule ^(ueber-mich|qualifikationen)/?$ /ueber-mich.html [R=301,L]
RewriteRule ^(shop|coming-soon)/?$ /shop.html [R=301,L]
RewriteRule ^impressum/?$ /impressum.html [R=301,L]
RewriteRule ^datenschutz/?$ /datenschutz.html [R=301,L]
RewriteRule ^kontakt/?$ /#kontakt [R=301,NE,L]
</IfModule>
<IfModule mod_deflate.c> <IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript image/svg+xml AddOutputFilterByType DEFLATE text/html text/css application/javascript image/svg+xml
</IfModule> </IfModule>
+22 -23
View File
@@ -1,7 +1,6 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<base href="/">
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>Seite nicht gefunden – Schmacko Napf</title> <title>Seite nicht gefunden – Schmacko Napf</title>
@@ -16,23 +15,23 @@
<meta property="og:description" content="Diese Seite gibt es leider nicht."> <meta property="og:description" content="Diese Seite gibt es leider nicht.">
<meta property="og:url" content="https://schmacko-napf.de/404.html"> <meta property="og:url" content="https://schmacko-napf.de/404.html">
<meta property="og:image" content="https://schmacko-napf.de/assets/img/vorschau.jpg"> <meta property="og:image" content="https://schmacko-napf.de/assets/img/vorschau.jpg">
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml"> <link rel="icon" href="/assets/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png"> <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="preload" href="/assets/fonts/questrial-latin.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="assets/site.css?v=00c6919d"> <link rel="stylesheet" href="/assets/site.css?v=ee527775">
</head> </head>
<body> <body>
<a class="skip" href="#inhalt">Zum Inhalt springen</a> <a class="skip" href="#inhalt">Zum Inhalt springen</a>
<header class="site-header"> <header class="site-header">
<div class="header-inner"> <div class="header-inner">
<a class="brand" href="index.html" aria-label="Schmacko Napf – Startseite"><img src="assets/img/logo.webp" alt="Schmacko Napf &amp; Hundetraining by Katha" width="68" height="68"></a> <a class="brand" href="/index.html" aria-label="Schmacko Napf – Startseite"><img src="/assets/img/logo.webp" alt="Schmacko Napf &amp; Hundetraining by Katha" width="68" height="68"></a>
<nav class="nav" aria-label="Hauptmenü"> <nav class="nav" aria-label="Hauptmenü">
<a href="hundeschule.html">Hundetraining</a> <a href="/hundeschule.html">Hundetraining</a>
<a href="ernaehrung.html">Ernährung</a> <a href="/ernaehrung.html">Ernährung</a>
<a href="shop.html">Shop</a> <a href="/shop.html">Shop</a>
<a href="transportboxen.html">Transportboxen</a> <a href="/transportboxen.html">Transportboxen</a>
<a href="ueber-mich.html">Über mich</a> <a href="/ueber-mich.html">Über mich</a>
<a href="index.html#kontakt">Kontakt</a> <a href="/index.html#kontakt">Kontakt</a>
</nav> </nav>
<a class="book-btn" href="https://schmacko-napf.petworkers.app/" target="_blank" rel="noopener"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3.5" y="5" width="17" height="15" rx="2.5"/><path d="M3.5 10h17M8 3v4M16 3v4"/></svg><span class="book-long">Termin buchen</span><span class="book-short" aria-hidden="true">Buchen</span></a> <a class="book-btn" href="https://schmacko-napf.petworkers.app/" target="_blank" rel="noopener"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3.5" y="5" width="17" height="15" rx="2.5"/><path d="M3.5 10h17M8 3v4M16 3v4"/></svg><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"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 7h16M4 12h16M4 17h16"/></svg></button> <button class="burger" type="button" aria-label="Menü öffnen" aria-expanded="false"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 7h16M4 12h16M4 17h16"/></svg></button>
@@ -43,26 +42,26 @@
<span class="kicker">Fehler 404</span> <span class="kicker">Fehler 404</span>
<h1 class="display">Hier ist leider<br>nichts zu finden.</h1> <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> <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 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a></div> <div class="btn-row"><a class="btn btn--sage" href="/index.html">Zur Startseite <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a></div>
</div> </div>
<footer class="site-footer"> <footer class="site-footer">
<div class="footer-brand"> <div class="footer-brand">
<a class="footer-logo" href="index.html"><img src="assets/img/logo.webp" alt="Schmacko Napf &amp; Hundetraining by Katha" width="88" height="88" loading="lazy"></a> <a class="footer-logo" href="/index.html"><img src="/assets/img/logo.webp" 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> <span>Ernährung, Gesundheit und Training –<br>mit Herz und Verstand.</span>
<img class="footer-cert" src="assets/img/gh-siegel.webp" alt="Zertifiziert nach G&amp;H Tierernährung – Gesund gefüttert Heidi Herrmann" width="480" height="329" loading="lazy"> <img class="footer-cert" src="/assets/img/gh-siegel.webp" alt="Zertifiziert nach G&amp;H Tierernährung – Gesund gefüttert Heidi Herrmann" width="480" height="329" loading="lazy">
</div> </div>
<nav class="footer-links" aria-label="Footer"> <nav class="footer-links" aria-label="Footer">
<a href="hundeschule.html">Hundetraining</a> <a href="/hundeschule.html">Hundetraining</a>
<a href="ernaehrung.html">Ernährung</a> <a href="/ernaehrung.html">Ernährung</a>
<a href="shop.html">Shop</a> <a href="/shop.html">Shop</a>
<a href="transportboxen.html">Transportboxen</a> <a href="/transportboxen.html">Transportboxen</a>
<a href="ueber-mich.html">Über mich</a> <a href="/ueber-mich.html">Über mich</a>
<a href="impressum.html">Impressum</a> <a href="/impressum.html">Impressum</a>
<a href="datenschutz.html">Datenschutz</a> <a href="/datenschutz.html">Datenschutz</a>
</nav> </nav>
<div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div> <div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div>
</footer> </footer>
</main> </main>
<script src="assets/site.js?v=4a2c8d49"></script> <script src="/assets/site.js?v=1b827e6e"></script>
</body> </body>
</html> </html>
+7
View File
@@ -24,8 +24,14 @@ Neue Website für Katha (bisher WordPress auf `schmacko-napf.de`). Statisches HT
Alle „Termin buchen“-Knöpfe führen zu Kathas Buchungsportal **PetWorkers** (`https://schmacko-napf.petworkers.app`): Kopfleiste, Kontakt-Fläche, Buchungs-Fläche auf Start/Hundetraining/Ernährung und die Buchen-Knöpfe in den Trainings-Flächen. Die einzelnen Links stehen zentral in `BOOK` in `tools/build_pages.py`. Alle „Termin buchen“-Knöpfe führen zu Kathas Buchungsportal **PetWorkers** (`https://schmacko-napf.petworkers.app`): Kopfleiste, Kontakt-Fläche, Buchungs-Fläche auf Start/Hundetraining/Ernährung und die Buchen-Knöpfe in den Trainings-Flächen. Die einzelnen Links stehen zentral in `BOOK` in `tools/build_pages.py`.
Verlinkt werden die Portal-Seiten direkt über ihre ID (`index.php?id=…`). Die Adressen `seite.php?name=ernaehrungsberatung` und `…name=kaufberatung` leiten im Portal nur auf die Startseite um. Für die Kaufberatung gibt es im Portal noch keine eigene Seite, deshalb fehlt sie in den Buchungs-Flächen. Sobald Katha eine anlegt, in `BOOK` ergänzen.
Die alte Seite verlinkte für das Ernährungs-Erstgespräch teilweise auch Microsoft Bookings – die neue Seite nutzt einheitlich PetWorkers. Die alte Seite verlinkte für das Ernährungs-Erstgespräch teilweise auch Microsoft Bookings – die neue Seite nutzt einheitlich PetWorkers.
## Alte Adressen
`.htaccess` leitet die Adressen der alten WordPress-Seite (z. B. `/hundetraining/`, `/futterplaene/`, `/impressum/`, `/kontakt/`) per 301 auf die neuen Seiten um. So landen Google-Treffer, Lesezeichen und die Links im PetWorkers-Portal nicht auf der Fehlerseite.
## Lokal ansehen ## Lokal ansehen
```bash ```bash
@@ -53,3 +59,4 @@ Alles außer `tools/`, `README.md` und `.git` in das Hauptverzeichnis des Webspa
- Texte für Shop und Transportboxen mit Katha abstimmen (aktuell allgemein formuliert). - 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. - 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. - Nutzungsrecht der Fotos von KK-Fotografie (Steffi Biller) für die neue Seite bestätigen.
- Im PetWorkers-Portal (Katha): Die Knöpfe „Ernährungsberatung“ und „Kaufberatung“ auf der Portal-Startseite führen ins Leere. Der Text der Ernährungs-Seite (`id=107`) spricht noch von „DogWorkers“ (Vorlagentext).
+40 -18
View File
@@ -46,7 +46,7 @@ body {
overflow-x: hidden; overflow-x: hidden;
} }
a { color: inherit; text-decoration: none; } a { color: inherit; text-decoration: none; }
img { display: block; max-width: 100%; } img { display: block; max-width: 100%; height: auto; }
h1, h2, h3 { font-weight: 400; line-height: 1.05; letter-spacing: -.025em; margin: 0; } h1, h2, h3 { font-weight: 400; line-height: 1.05; letter-spacing: -.025em; margin: 0; }
p { margin: 0; } p { margin: 0; }
svg { flex: none; } svg { flex: none; }
@@ -60,6 +60,10 @@ svg { flex: none; }
} }
.skip:focus { transform: none; } .skip:focus { transform: none; }
/* Tastatur-Fokus: dunkler Ring auf hellem Grund, Salbei auf dunklen Flächen */
:focus-visible { outline: 3px solid var(--ink); outline-offset: 3px; }
.panel--ink :focus-visible, .panel--photo :focus-visible, .site-footer :focus-visible { outline-color: var(--sage); }
/* ===== Header: Logo und Menü als zwei schwebende Elemente ===== */ /* ===== Header: Logo und Menü als zwei schwebende Elemente ===== */
.site-header { .site-header {
position: sticky; top: 0; z-index: 50; position: sticky; top: 0; z-index: 50;
@@ -239,7 +243,6 @@ svg { flex: none; }
.tile:hover .tile-arrow { background: var(--sage); border-color: var(--sage); color: var(--ink); } .tile:hover .tile-arrow { background: var(--sage); border-color: var(--sage); color: var(--ink); }
.tile:hover .tile-arrow svg { transform: rotate(-45deg); } .tile:hover .tile-arrow svg { transform: rotate(-45deg); }
} }
.tile:focus-visible, .btn:focus-visible, .nav a:focus-visible { outline: 3px solid var(--sage); outline-offset: 3px; }
/* Logo-Siegel in der Mitte */ /* Logo-Siegel in der Mitte */
.seal { .seal {
@@ -375,6 +378,8 @@ a.panel:hover .panel-arrow { background: var(--sage); border-color: var(--sage);
a.panel:hover .panel-arrow svg { transform: rotate(-45deg); } a.panel:hover .panel-arrow svg { transform: rotate(-45deg); }
.panel-arrow--ink { background: var(--ink); border-color: var(--ink); } .panel-arrow--ink { background: var(--ink); border-color: var(--ink); }
/* Steht die Überschrift oben (Handy), darf sie nicht unter den Pfeil laufen */
.panel-arrow--ink ~ .kicker { padding-right: 64px; }
/* Kurze Fakten als Pillen */ /* Kurze Fakten als Pillen */
.facts { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 30px; } .facts { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 30px; }
@@ -461,6 +466,14 @@ a.panel:hover .panel-arrow svg { transform: rotate(-45deg); }
.price-rows small { display: block; font-size: 1.05rem; color: var(--muted); margin-top: 6px; letter-spacing: 0; } .price-rows small { display: block; font-size: 1.05rem; color: var(--muted); margin-top: 6px; letter-spacing: 0; }
.price-rows strong { font-weight: 400; white-space: nowrap; font-size: clamp(1.6rem, 2.6vw, 2.4rem); } .price-rows strong { font-weight: 400; white-space: nowrap; font-size: clamp(1.6rem, 2.6vw, 2.4rem); }
/* Dreier-Reihen: Überschriften, Texte und Preise auf einer Linie, auch wenn ein Text kürzer ist */
@media (min-width: 981px) {
.row--3 { grid-template-rows: 1fr auto auto; min-height: min(62svh, 620px); } /* Höhe wie .panel--mid – im Subgrid zählt die der Flächen nicht */
.row--3 > .panel { display: grid; grid-row: span 3; grid-template-rows: subgrid; row-gap: 0; justify-content: stretch; }
.row--3 > .panel > * { align-self: start; }
.row--3 > .panel > .kicker { align-self: end; }
}
/* Icon in Flächen */ /* Icon in Flächen */
.panel-icon { .panel-icon {
width: 76px; height: 76px; width: 76px; height: 76px;
@@ -490,7 +503,7 @@ a.panel:hover .panel-arrow svg { transform: rotate(-45deg); }
.book-links a:hover { background: var(--ink); color: var(--bg); } .book-links a:hover { background: var(--ink); color: var(--bg); }
.book-links svg { width: 22px; height: 22px; transition: transform .4s var(--ease); } .book-links svg { width: 22px; height: 22px; transition: transform .4s var(--ease); }
.book-links a:hover svg { transform: translate(2px, -2px); } .book-links a:hover svg { transform: translate(2px, -2px); }
.book-links a:only-child { grid-column: 1 / -1; } .book-links a:last-child:nth-child(odd) { grid-column: 1 / -1; }
/* G&H-Zertifikat */ /* G&H-Zertifikat */
.cert { display: block; width: clamp(150px, 13vw, 200px); height: auto; margin-top: 36px; } .cert { display: block; width: clamp(150px, 13vw, 200px); height: auto; margin-top: 36px; }
@@ -549,18 +562,28 @@ a.panel:hover .panel-arrow svg { transform: rotate(-45deg); }
.d1 { transition-delay: .1s; } .d1 { transition-delay: .1s; }
.d2 { transition-delay: .2s; } .d2 { transition-delay: .2s; }
.tile:focus-visible, .btn:focus-visible, .nav a:focus-visible, a.panel:focus-visible { outline: 3px solid var(--sage); outline-offset: 3px; }
/* ===== Responsive ===== */ /* ===== Responsive ===== */
@media (max-width: 1100px) { @media (max-width: 1100px) {
.steps { grid-template-columns: repeat(2, 1fr); row-gap: 34px; } .steps { grid-template-columns: repeat(2, 1fr); row-gap: 34px; }
.nav a { padding: 10px 12px; font-size: 1rem; } .nav a { padding: 10px 12px; font-size: 1rem; }
} }
@media (max-width: 980px) { @media (max-width: 980px) {
.header-inner { gap: 10px; }
.nav { display: none; } .nav { display: none; }
.burger { display: grid; margin-left: 10px; } .burger { display: grid; margin-left: 0; }
.book-btn { margin-left: auto; } .book-btn { margin-left: auto; }
.booking { grid-template-columns: 1fr; align-items: start; } .booking { grid-template-columns: minmax(0, 1fr); align-items: start; }
/* Logo-Siegel über den Kacheln – mittig wäre es den Beschriftungen im Weg */
.tiles { grid-template-rows: auto 1fr 1fr; }
.seal {
position: static;
grid-column: 1 / -1;
width: 190px;
margin: 0 auto;
transform: scale(.9);
}
@keyframes seal { to { opacity: 1; transform: none; } }
.seal-joint { display: none; }
.menu-open .nav { .menu-open .nav {
display: flex; flex-direction: column; gap: 4px; display: flex; flex-direction: column; gap: 4px;
position: fixed; top: 88px; left: var(--pad); right: var(--pad); position: fixed; top: 88px; left: var(--pad); right: var(--pad);
@@ -583,7 +606,7 @@ a.panel:hover .panel-arrow svg { transform: rotate(-45deg); }
.header-inner { height: 76px; } .header-inner { height: 76px; }
.brand { width: 62px; height: 62px; } .brand { width: 62px; height: 62px; }
.book-btn { height: 54px; padding: 0 18px; font-size: 1rem; } .book-btn { height: 54px; padding: 0 18px; font-size: 1rem; }
.book-links { grid-template-columns: 1fr; } .book-links { grid-template-columns: minmax(0, 1fr); }
.footer-cert { height: 72px; } .footer-cert { height: 72px; }
.brand img { width: 58px; height: 58px; } .brand img { width: 58px; height: 58px; }
.burger { width: 54px; height: 54px; } .burger { width: 54px; height: 54px; }
@@ -592,15 +615,10 @@ a.panel:hover .panel-arrow svg { transform: rotate(-45deg); }
.tiles { grid-template-columns: 1fr; grid-template-rows: none; gap: 12px; } .tiles { grid-template-columns: 1fr; grid-template-rows: none; gap: 12px; }
.tile { height: 44svh; min-height: 260px; } .tile { height: 44svh; min-height: 260px; }
.tile:nth-of-type(even) .tile-foot { flex-direction: row; text-align: left; } .tile:nth-of-type(even) .tile-foot { flex-direction: row; text-align: left; }
.tile-arrow { width: 50px; height: 50px; } .tile-foot { gap: 12px; }
.seal { .tile-label { font-size: clamp(1.4rem, 6.6vw, 1.7rem); }
position: static; .tile-arrow { width: 46px; height: 46px; }
width: 210px; .seal { width: 210px; margin: 4px auto -6px; }
margin: 4px auto -6px;
transform: scale(.9);
}
@keyframes seal { to { opacity: 1; transform: none; } }
.seal-joint { display: none; }
.scroll-hint { display: none; } .scroll-hint { display: none; }
.mosaic { gap: 12px; padding: 0 16px 16px; } .mosaic { gap: 12px; padding: 0 16px 16px; }
.row { gap: 12px; } .row { gap: 12px; }
@@ -610,6 +628,10 @@ a.panel:hover .panel-arrow svg { transform: rotate(-45deg); }
.contact-links a { padding: 18px 18px; } .contact-links a { padding: 18px 18px; }
.page-hero { min-height: calc(100svh - 76px - 16px); } .page-hero { min-height: calc(100svh - 76px - 16px); }
.footer-brand { flex-direction: column; align-items: flex-start; } .footer-brand { flex-direction: column; align-items: flex-start; }
/* lange Wörter („Transportboxen“, „Konsequenz“) passen auch auf schmale Handys */
.page-hero h1 { font-size: min(3.2rem, 11vw); }
.display { font-size: min(2.8rem, 12.5vw); }
.words li { font-size: min(2.4rem, 10.5vw); }
} }
.book-short { display: none; } .book-short { display: none; }
@@ -627,6 +649,6 @@ a.panel:hover .panel-arrow svg { transform: rotate(-45deg); }
.scroll-hint { animation: none; } .scroll-hint { animation: none; }
.reveal { opacity: 1; transform: none; transition: none; } .reveal { opacity: 1; transform: none; transition: none; }
} }
@media (prefers-reduced-motion: reduce) and (max-width: 767px) { @media (prefers-reduced-motion: reduce) and (max-width: 980px) {
.seal { transform: none; } .seal { transform: none; }
} }
+22 -12
View File
@@ -1,31 +1,41 @@
(() => { (() => {
const body = document.body; const body = document.body;
// Mobiles Menü // Mobiles Menü – schließt auch mit Escape oder Tipp daneben
const burger = document.querySelector('.burger'); const burger = document.querySelector('.burger');
if (burger) { if (burger) {
burger.addEventListener('click', () => { const setMenu = open => {
const open = body.classList.toggle('menu-open'); body.classList.toggle('menu-open', open);
burger.setAttribute('aria-expanded', open); burger.setAttribute('aria-expanded', open);
burger.setAttribute('aria-label', open ? 'Menü schließen' : 'Menü öffnen');
};
burger.addEventListener('click', () => setMenu(!body.classList.contains('menu-open')));
document.querySelectorAll('.nav a').forEach(a => a.addEventListener('click', () => setMenu(false)));
document.addEventListener('keydown', e => {
if (e.key === 'Escape' && body.classList.contains('menu-open')) { setMenu(false); burger.focus(); }
});
document.addEventListener('click', e => {
if (body.classList.contains('menu-open') && !e.target.closest('.nav, .burger')) setMenu(false);
}); });
document.querySelectorAll('.nav a').forEach(a =>
a.addEventListener('click', () => {
body.classList.remove('menu-open');
burger.setAttribute('aria-expanded', 'false');
})
);
} }
// Startseite: Header einblenden, sobald der Hero verlassen wird // Startseite: Header einblenden, sobald der Hero verlassen wird. Auf Handy/Tablet steht das
// Siegel über den Kacheln – dort kommt der Header schon, sobald das Siegel aus dem Bild ist.
const hero = document.querySelector('.hero'); const hero = document.querySelector('.hero');
const seal = document.querySelector('.seal');
if (body.classList.contains('is-home') && hero) { if (body.classList.contains('is-home') && hero) {
new IntersectionObserver(([e]) => body.classList.toggle('scrolled', !e.isIntersecting), { const past = { hero: false, seal: false };
const update = () => body.classList.toggle('scrolled', past.hero || past.seal);
new IntersectionObserver(([e]) => { past.hero = !e.isIntersecting; update(); }, {
rootMargin: '-120px 0px 0px 0px' rootMargin: '-120px 0px 0px 0px'
}).observe(hero); }).observe(hero);
if (seal) new IntersectionObserver(([e]) => {
past.seal = !e.isIntersecting && e.boundingClientRect.top < 0 && getComputedStyle(seal).position === 'static';
update();
}).observe(seal);
} }
// Ring um das Logo-Siegel: Kreis + die vier Kachel-Lücken, Übergänge mit Radius f abgerundet // Ring um das Logo-Siegel: Kreis + die vier Kachel-Lücken, Übergänge mit Radius f abgerundet
const seal = document.querySelector('.seal');
const joint = document.querySelector('.seal-joint'); const joint = document.querySelector('.seal-joint');
if (seal && joint) { if (seal && joint) {
const drawJoint = () => { const drawJoint = () => {
+2 -2
View File
@@ -18,7 +18,7 @@
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml"> <link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png"> <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="preload" href="assets/fonts/questrial-latin.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="assets/site.css?v=00c6919d"> <link rel="stylesheet" href="assets/site.css?v=ee527775">
</head> </head>
<body> <body>
<a class="skip" href="#inhalt">Zum Inhalt springen</a> <a class="skip" href="#inhalt">Zum Inhalt springen</a>
@@ -86,6 +86,6 @@
<div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div> <div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div>
</footer> </footer>
</main> </main>
<script src="assets/site.js?v=4a2c8d49"></script> <script src="assets/site.js?v=1b827e6e"></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -17,7 +17,7 @@
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml"> <link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png"> <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="preload" href="assets/fonts/questrial-latin.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="assets/site.css?v=00c6919d"> <link rel="stylesheet" href="assets/site.css?v=ee527775">
</head> </head>
<body> <body>
<a class="skip" href="#inhalt">Zum Inhalt springen</a> <a class="skip" href="#inhalt">Zum Inhalt springen</a>
@@ -39,7 +39,7 @@
<main class="mosaic" id="inhalt"> <main class="mosaic" id="inhalt">
<section class="panel panel--photo page-hero"> <section class="panel panel--photo page-hero">
<img src="assets/img/futternapf.webp" srcset="assets/img/futternapf-900.webp 900w, assets/img/futternapf.webp 1800w" sizes="100vw" alt="Hund schnuppert an einem Napf mit Trockenfutter"> <img src="assets/img/futternapf.webp" srcset="assets/img/futternapf-900.webp 900w, assets/img/futternapf.webp 1800w" sizes="100vw" alt="Hund schnuppert an einem Napf mit Trockenfutter">
<span class="kicker">Ernährungs- &amp; Gesundheitsberatung</span> <span class="kicker">Ernährungs- &amp; Gesundheits&shy;beratung</span>
<h1>Fürsorge<br>in Napfform.</h1> <h1>Fürsorge<br>in Napfform.</h1>
<p class="big">Individuelle Futterpläne – gesund, sensibel oder mit Diagnose.</p> <p class="big">Individuelle Futterpläne – gesund, sensibel oder mit Diagnose.</p>
</section> </section>
@@ -91,7 +91,7 @@
<p class="big">Erstgespräch und Futterplan direkt online buchen – vor Ort, am Telefon oder online.</p> <p class="big">Erstgespräch und Futterplan direkt online buchen – vor Ort, am Telefon oder online.</p>
</div> </div>
<div class="book-links"> <div class="book-links">
<a href="https://schmacko-napf.petworkers.app/seite.php?name=ernaehrungsberatung" target="_blank" rel="noopener"><span>Ernährungsberatung</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a href="https://schmacko-napf.petworkers.app/index.php?id=107" target="_blank" rel="noopener"><span>Ernährungs&shy;beratung</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
</div> </div>
</div> </div>
@@ -126,6 +126,6 @@
<div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div> <div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div>
</footer> </footer>
</main> </main>
<script src="assets/site.js?v=4a2c8d49"></script> <script src="assets/site.js?v=1b827e6e"></script>
</body> </body>
</html> </html>
+6 -7
View File
@@ -17,7 +17,7 @@
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml"> <link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png"> <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="preload" href="assets/fonts/questrial-latin.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="assets/site.css?v=00c6919d"> <link rel="stylesheet" href="assets/site.css?v=ee527775">
</head> </head>
<body> <body>
<a class="skip" href="#inhalt">Zum Inhalt springen</a> <a class="skip" href="#inhalt">Zum Inhalt springen</a>
@@ -50,7 +50,7 @@
<h2 class="title">Individuell.<br>Bei dir zu Hause.</h2> <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> <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="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="https://schmacko-napf.petworkers.app/seite.php?name=einzelcoaching&amp;id=11&amp;sysname=coaching" target="_blank" rel="noopener">Einzelcoaching buchen <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a></div> <div class="btn-row"><a class="btn btn--ink" href="https://schmacko-napf.petworkers.app/index.php?id=11" target="_blank" rel="noopener">Einzelcoaching buchen <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a></div>
</div> </div>
<div class="panel panel--photo plain reveal d1"><img src="assets/img/hund-wald.webp" srcset="assets/img/hund-wald-900.webp 900w, assets/img/hund-wald.webp 1417w" sizes="(max-width: 980px) 100vw, 55vw" alt="Schwarze Schäferhündin steht aufmerksam im Wald" loading="lazy"></div> <div class="panel panel--photo plain reveal d1"><img src="assets/img/hund-wald.webp" srcset="assets/img/hund-wald-900.webp 900w, assets/img/hund-wald.webp 1417w" sizes="(max-width: 980px) 100vw, 55vw" alt="Schwarze Schäferhündin steht aufmerksam im Wald" loading="lazy"></div>
</div> </div>
@@ -63,7 +63,7 @@
<p class="big">In der Stadt, im Grünen, in Geschäften – mit max. 6 Mensch-Hund-Teams.</p> <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="price-big"><strong>18 €</strong><span>pro Mensch-Hund-Team</span></div>
<div class="btn-row"> <div class="btn-row">
<a class="btn btn--sage" href="https://schmacko-napf.petworkers.app/seite.php?name=gruppenstunden&amp;id=12&amp;sysname=groups" target="_blank" rel="noopener">Gruppenstunde buchen <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a class="btn btn--sage" href="https://schmacko-napf.petworkers.app/index.php?id=12" target="_blank" rel="noopener">Gruppenstunde buchen <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
<a class="btn btn--line" href="https://schmacko-napf.petworkers.app/index.php?view=kalender" target="_blank" rel="noopener">Stundenplan <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a class="btn btn--line" href="https://schmacko-napf.petworkers.app/index.php?view=kalender" target="_blank" rel="noopener">Stundenplan <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
</div> </div>
</div> </div>
@@ -98,10 +98,9 @@
<p class="big">Freie Termine, Kurse und der Stundenplan – direkt in meinem Buchungsportal.</p> <p class="big">Freie Termine, Kurse und der Stundenplan – direkt in meinem Buchungsportal.</p>
</div> </div>
<div class="book-links"> <div class="book-links">
<a href="https://schmacko-napf.petworkers.app/seite.php?name=einzelcoaching&amp;id=11&amp;sysname=coaching" target="_blank" rel="noopener"><span>Einzelcoaching</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a href="https://schmacko-napf.petworkers.app/index.php?id=11" target="_blank" rel="noopener"><span>Einzelcoaching</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
<a href="https://schmacko-napf.petworkers.app/seite.php?name=gruppenstunden&amp;id=12&amp;sysname=groups" target="_blank" rel="noopener"><span>Gruppenstunden</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a href="https://schmacko-napf.petworkers.app/index.php?id=12" target="_blank" rel="noopener"><span>Gruppenstunden</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
<a href="https://schmacko-napf.petworkers.app/index.php?id=13" target="_blank" rel="noopener"><span>Kurse &amp; Workshops</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a href="https://schmacko-napf.petworkers.app/index.php?id=13" target="_blank" rel="noopener"><span>Kurse &amp; Workshops</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
<a href="https://schmacko-napf.petworkers.app/seite.php?name=kaufberatung" target="_blank" rel="noopener"><span>Kaufberatung</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
<a href="https://schmacko-napf.petworkers.app/index.php?view=kalender" target="_blank" rel="noopener"><span>Stundenplan</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a href="https://schmacko-napf.petworkers.app/index.php?view=kalender" target="_blank" rel="noopener"><span>Stundenplan</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
</div> </div>
</div> </div>
@@ -137,6 +136,6 @@
<div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div> <div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div>
</footer> </footer>
</main> </main>
<script src="assets/site.js?v=4a2c8d49"></script> <script src="assets/site.js?v=1b827e6e"></script>
</body> </body>
</html> </html>
+3 -3
View File
@@ -18,7 +18,7 @@
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml"> <link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png"> <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="preload" href="assets/fonts/questrial-latin.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="assets/site.css?v=00c6919d"> <link rel="stylesheet" href="assets/site.css?v=ee527775">
</head> </head>
<body> <body>
<a class="skip" href="#inhalt">Zum Inhalt springen</a> <a class="skip" href="#inhalt">Zum Inhalt springen</a>
@@ -46,7 +46,7 @@
<p><b>Kontakt</b>Telefon: <a href="tel:+4917656932942">+49 176 569 329 42</a><br>E-Mail: <a href="mailto:info@schmacko-napf.de">info@schmacko-napf.de</a></p> <p><b>Kontakt</b>Telefon: <a href="tel:+4917656932942">+49 176 569 329 42</a><br>E-Mail: <a href="mailto:info@schmacko-napf.de">info@schmacko-napf.de</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>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>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>Verbraucher&shy;streit&shy;beilegung</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> <p><b>Bildnachweis</b>Fotos von Katha und ihren Hunden: Steffi Biller, KK-Fotografie. Weitere Bilder: Unsplash.</p>
</div> </div>
</div> </div>
@@ -68,6 +68,6 @@
<div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div> <div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div>
</footer> </footer>
</main> </main>
<script src="assets/site.js?v=4a2c8d49"></script> <script src="assets/site.js?v=1b827e6e"></script>
</body> </body>
</html> </html>
+7 -8
View File
@@ -17,7 +17,7 @@
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml"> <link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png"> <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="preload" href="assets/fonts/questrial-latin.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="assets/site.css?v=00c6919d"> <link rel="stylesheet" href="assets/site.css?v=ee527775">
</head> </head>
<body class="is-home"> <body class="is-home">
<a class="skip" href="#inhalt">Zum Inhalt springen</a> <a class="skip" href="#inhalt">Zum Inhalt springen</a>
@@ -50,7 +50,7 @@
<a class="tile" href="ernaehrung.html"> <a class="tile" href="ernaehrung.html">
<img src="assets/img/futternapf.webp" srcset="assets/img/futternapf-900.webp 900w, assets/img/futternapf.webp 1800w" sizes="(max-width: 767px) 100vw, 50vw" alt="Hund schnuppert an einem Napf mit Trockenfutter"> <img src="assets/img/futternapf.webp" srcset="assets/img/futternapf-900.webp 900w, assets/img/futternapf.webp 1800w" sizes="(max-width: 767px) 100vw, 50vw" alt="Hund schnuppert an einem Napf mit Trockenfutter">
<span class="tile-foot"> <span class="tile-foot">
<span class="tile-label">Ernährungsberatung</span> <span class="tile-label">Ernährungs&shy;beratung</span>
<span class="tile-arrow"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span> <span class="tile-arrow"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</span> </span>
</a> </a>
@@ -104,7 +104,7 @@
<div class="panel panel--sage plate-panel reveal"><img src="assets/img/barf-teller.webp" alt="Teller mit frischem Fleisch, Gemüse und Obst für die Rohfütterung" width="900" height="900" loading="lazy"></div> <div class="panel panel--sage plate-panel reveal"><img src="assets/img/barf-teller.webp" 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"> <a class="panel panel--cream reveal d1" href="ernaehrung.html">
<span class="panel-arrow panel-arrow--ink"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span> <span class="panel-arrow panel-arrow--ink"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
<span class="kicker">Ernährungsberatung</span> <span class="kicker">Ernährungs&shy;beratung</span>
<h2 class="display">Gesund<br>gefüttert.</h2> <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> <p class="big">Individuelle Futterpläne – für jedes Alter, auch bei Magen-Darm- oder Pankreas-Problemen.</p>
<div class="facts"><span class="fact">BARF</span><span class="fact">Koch-BARF</span><span class="fact">Nass- &amp; Trockenfutter</span></div> <div class="facts"><span class="fact">BARF</span><span class="fact">Koch-BARF</span><span class="fact">Nass- &amp; Trockenfutter</span></div>
@@ -149,11 +149,10 @@
<p class="big">Freie Termine, Kurse und der Stundenplan – direkt in meinem Buchungsportal.</p> <p class="big">Freie Termine, Kurse und der Stundenplan – direkt in meinem Buchungsportal.</p>
</div> </div>
<div class="book-links"> <div class="book-links">
<a href="https://schmacko-napf.petworkers.app/seite.php?name=einzelcoaching&amp;id=11&amp;sysname=coaching" target="_blank" rel="noopener"><span>Einzelcoaching</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a href="https://schmacko-napf.petworkers.app/index.php?id=11" target="_blank" rel="noopener"><span>Einzelcoaching</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
<a href="https://schmacko-napf.petworkers.app/seite.php?name=gruppenstunden&amp;id=12&amp;sysname=groups" target="_blank" rel="noopener"><span>Gruppenstunden</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a href="https://schmacko-napf.petworkers.app/index.php?id=12" target="_blank" rel="noopener"><span>Gruppenstunden</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
<a href="https://schmacko-napf.petworkers.app/index.php?id=13" target="_blank" rel="noopener"><span>Kurse &amp; Workshops</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a href="https://schmacko-napf.petworkers.app/index.php?id=13" target="_blank" rel="noopener"><span>Kurse &amp; Workshops</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
<a href="https://schmacko-napf.petworkers.app/seite.php?name=ernaehrungsberatung" target="_blank" rel="noopener"><span>Ernährungsberatung</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a href="https://schmacko-napf.petworkers.app/index.php?id=107" target="_blank" rel="noopener"><span>Ernährungs&shy;beratung</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
<a href="https://schmacko-napf.petworkers.app/seite.php?name=kaufberatung" target="_blank" rel="noopener"><span>Kaufberatung</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
<a href="https://schmacko-napf.petworkers.app/index.php?view=kalender" target="_blank" rel="noopener"><span>Stundenplan</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a> <a href="https://schmacko-napf.petworkers.app/index.php?view=kalender" target="_blank" rel="noopener"><span>Stundenplan</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7M9 7h8v8"/></svg></a>
</div> </div>
</div> </div>
@@ -189,6 +188,6 @@
<div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div> <div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div>
</footer> </footer>
</main> </main>
<script src="assets/site.js?v=4a2c8d49"></script> <script src="assets/site.js?v=1b827e6e"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -17,7 +17,7 @@
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml"> <link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png"> <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="preload" href="assets/fonts/questrial-latin.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="assets/site.css?v=00c6919d"> <link rel="stylesheet" href="assets/site.css?v=ee527775">
</head> </head>
<body> <body>
<a class="skip" href="#inhalt">Zum Inhalt springen</a> <a class="skip" href="#inhalt">Zum Inhalt springen</a>
@@ -85,6 +85,6 @@
<div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div> <div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div>
</footer> </footer>
</main> </main>
<script src="assets/site.js?v=4a2c8d49"></script> <script src="assets/site.js?v=1b827e6e"></script>
</body> </body>
</html> </html>
+19 -14
View File
@@ -2,7 +2,7 @@
python3 tools/build_pages.py python3 tools/build_pages.py
""" """
import hashlib, os import hashlib, os, re
from PIL import Image from PIL import Image
OUT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) OUT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -17,14 +17,16 @@ LOGO = "assets/img/logo.webp"
CERT = "assets/img/gh-siegel.webp" CERT = "assets/img/gh-siegel.webp"
CERT_ALT = "Zertifiziert nach G&amp;H Tierernährung – Gesund gefüttert Heidi Herrmann" CERT_ALT = "Zertifiziert nach G&amp;H Tierernährung – Gesund gefüttert Heidi Herrmann"
# Buchungsportal (PetWorkers) – & als &amp; für HTML-Attribute # Buchungsportal (PetWorkers) – & als &amp; für HTML-Attribute.
# Direkt die Seiten-IDs verlinken: Die seite.php?name=…-Adressen leiten um bzw. landen bei
# Ernährungs- und Kaufberatung nur auf der Portal-Startseite. Für Kaufberatung gibt es im
# Portal (Stand Okt. 2026) keine eigene Seite – sobald es eine gibt, hier wieder aufnehmen.
PW = "https://schmacko-napf.petworkers.app/" PW = "https://schmacko-napf.petworkers.app/"
BOOK = { BOOK = {
"coach": ("Einzelcoaching", PW + "seite.php?name=einzelcoaching&amp;id=11&amp;sysname=coaching"), "coach": ("Einzelcoaching", PW + "index.php?id=11"),
"groups": ("Gruppenstunden", PW + "seite.php?name=gruppenstunden&amp;id=12&amp;sysname=groups"), "groups": ("Gruppenstunden", PW + "index.php?id=12"),
"courses": ("Kurse &amp; Workshops", PW + "index.php?id=13"), "courses": ("Kurse &amp; Workshops", PW + "index.php?id=13"),
"food": ("Ernährungsberatung", PW + "seite.php?name=ernaehrungsberatung"), "food": ("Ernährungs&shy;beratung", PW + "index.php?id=107"),
"buy": ("Kaufberatung", PW + "seite.php?name=kaufberatung"),
"cal": ("Stundenplan", PW + "index.php?view=kalender"), "cal": ("Stundenplan", PW + "index.php?view=kalender"),
} }
EXT = ' target="_blank" rel="noopener"' EXT = ' target="_blank" rel="noopener"'
@@ -183,7 +185,7 @@ PAGES = [] # für die Sitemap
# ================================================================ Startseite # ================================================================ Startseite
tiles = [ tiles = [
("hundeschule.html", "Hundeschule", "", "katha-abendlicht", "Katha mit ihrem Hund auf einer Wiese im Abendlicht"), ("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"), ("ernaehrung.html", "Ernährungs&shy;beratung", "", "futternapf", "Hund schnuppert an einem Napf mit Trockenfutter"),
("shop.html", "Shop", "", "laden", "Hund in einem Laden mit Hundezubehör"), ("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"), ("transportboxen.html", "Transportboxen", "Maßanfertigung fürs Auto", "kofferraum", "Hund sitzt im offenen Kofferraum hinter einem Trenngitter"),
] ]
@@ -241,7 +243,7 @@ index = head("Schmacko Napf & Hundetraining by Katha",
<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> <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"> <a class="panel panel--cream reveal d1" href="ernaehrung.html">
<span class="panel-arrow panel-arrow--ink">{I["arrow"]}</span> <span class="panel-arrow panel-arrow--ink">{I["arrow"]}</span>
<span class="kicker">Ernährungsberatung</span> <span class="kicker">Ernährungs&shy;beratung</span>
<h2 class="display">Gesund<br>gefüttert.</h2> <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> <p class="big">Individuelle Futterpläne – für jedes Alter, auch bei Magen-Darm- oder Pankreas-Problemen.</p>
<div class="facts"><span class="fact">BARF</span><span class="fact">Koch-BARF</span><span class="fact">Nass- &amp; Trockenfutter</span></div> <div class="facts"><span class="fact">BARF</span><span class="fact">Koch-BARF</span><span class="fact">Nass- &amp; Trockenfutter</span></div>
@@ -279,7 +281,7 @@ index = head("Schmacko Napf & Hundetraining by Katha",
</a> </a>
</div> </div>
{booking(["coach", "groups", "courses", "food", "buy", "cal"])}{contact()}''' + footer() {booking(["coach", "groups", "courses", "food", "cal"])}{contact()}''' + footer()
write("index.html", index) write("index.html", index)
PAGES.append("index.html") PAGES.append("index.html")
@@ -337,14 +339,14 @@ page("hundeschule.html", "Hundetraining – Schmacko Napf",
</div> </div>
</div> </div>
{booking(["coach", "groups", "courses", "buy", "cal"])}{contact("katha-heide", "Katha sitzt mit ihrer Schäferhündin im Grünen")}''') {booking(["coach", "groups", "courses", "cal"])}{contact("katha-heide", "Katha sitzt mit ihrer Schäferhündin im Grünen")}''')
PAGES.append("hundeschule.html") PAGES.append("hundeschule.html")
# ================================================================ Ernährung # ================================================================ Ernährung
page("ernaehrung.html", "Ernährungsberatung – Schmacko Napf", page("ernaehrung.html", "Ernährungsberatung – Schmacko Napf",
"Individuelle Futterpläne und Gesundheitsberatung für Hunde jeden Alters – BARF, Koch-BARF, Nass- und Trockenfutter.", "Individuelle Futterpläne und Gesundheitsberatung für Hunde jeden Alters – BARF, Koch-BARF, Nass- und Trockenfutter.",
"ernaehrung.html", "ernaehrung.html",
page_hero("futternapf", "Ernährungs- &amp; Gesundheitsberatung", "Fürsorge<br>in Napfform.", page_hero("futternapf", "Ernährungs- &amp; Gesundheits&shy;beratung", "Fürsorge<br>in Napfform.",
"Individuelle Futterpläne – gesund, sensibel oder mit Diagnose.", "Individuelle Futterpläne – gesund, sensibel oder mit Diagnose.",
"Hund schnuppert an einem Napf mit Trockenfutter") + f''' "Hund schnuppert an einem Napf mit Trockenfutter") + f'''
<div class="row"> <div class="row">
@@ -498,7 +500,7 @@ page("impressum.html", "Impressum – Schmacko Napf", "Impressum von Schmacko Na
<p><b>Kontakt</b>Telefon: <a href="{PHONE_HREF}">{PHONE}</a><br>E-Mail: <a href="mailto:{MAIL}">{MAIL}</a></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>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>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>Verbraucher&shy;streit&shy;beilegung</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> <p><b>Bildnachweis</b>Fotos von Katha und ihren Hunden: Steffi Biller, KK-Fotografie. Weitere Bilder: Unsplash.</p>
</div> </div>
</div> </div>
@@ -548,9 +550,12 @@ page("404.html", "Seite nicht gefunden – Schmacko Napf", "Diese Seite gibt es
</div> </div>
''', robots="noindex") ''', robots="noindex")
# 404 wird vom Server unter beliebigen Pfaden ausgeliefert – Links und Bilder relativ zur Wurzel auflösen # 404 wird vom Server unter beliebigen Pfaden ausgeliefert – Links und Bilder ab der Wurzel (/…) angeben.
# Kein <base href="/">: damit würde „Zum Inhalt springen“ (#inhalt) auf die Startseite führen.
p404 = os.path.join(OUT, "404.html") p404 = os.path.join(OUT, "404.html")
html404 = open(p404).read().replace("<head>", '<head>\n <base href="/">', 1) html404 = open(p404).read()
html404 = re.sub(r'srcset="([^"]+)"', lambda m: 'srcset="' + ", ".join("/" + s.strip() for s in m.group(1).split(",")) + '"', html404)
html404 = re.sub(r'\b(href|src)="(?![a-z]+:|#|/)', r'\1="/', html404)
open(p404, "w").write(html404) open(p404, "w").write(html404)
# ================================================================ robots.txt & sitemap.xml # ================================================================ robots.txt & sitemap.xml
+2 -2
View File
@@ -17,7 +17,7 @@
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml"> <link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png"> <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="preload" href="assets/fonts/questrial-latin.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="assets/site.css?v=00c6919d"> <link rel="stylesheet" href="assets/site.css?v=ee527775">
</head> </head>
<body> <body>
<a class="skip" href="#inhalt">Zum Inhalt springen</a> <a class="skip" href="#inhalt">Zum Inhalt springen</a>
@@ -92,6 +92,6 @@
<div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div> <div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div>
</footer> </footer>
</main> </main>
<script src="assets/site.js?v=4a2c8d49"></script> <script src="assets/site.js?v=1b827e6e"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -17,7 +17,7 @@
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml"> <link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png"> <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="preload" href="assets/fonts/questrial-latin.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="assets/site.css?v=00c6919d"> <link rel="stylesheet" href="assets/site.css?v=ee527775">
</head> </head>
<body> <body>
<a class="skip" href="#inhalt">Zum Inhalt springen</a> <a class="skip" href="#inhalt">Zum Inhalt springen</a>
@@ -120,6 +120,6 @@
<div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div> <div class="footer-meta"><span>© 2026 Schmacko Napf &amp; Hundetraining by Katha</span><span>Fotos: Steffi Biller, KK-Fotografie · Unsplash</span></div>
</footer> </footer>
</main> </main>
<script src="assets/site.js?v=4a2c8d49"></script> <script src="assets/site.js?v=1b827e6e"></script>
</body> </body>
</html> </html>