diff --git a/backend/main.py b/backend/main.py index 835da3e..40d15ce 100644 --- a/backend/main.py +++ b/backend/main.py @@ -406,7 +406,7 @@ async def serve_media(path: str, request: _Request): raise _HE(404, "Nicht gefunden.") return _media_response(filepath) -APP_VER = "925" # muss mit APP_VER in app.js übereinstimmen +APP_VER = "926" # muss mit APP_VER in app.js übereinstimmen @app.get("/.well-known/assetlinks.json") async def assetlinks(): diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 505ea98..176c0a9 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '925'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '926'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.5.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; // Cache-Bust-Parameter nach Update-Reload sofort entfernen diff --git a/backend/static/js/pages/settings.js b/backend/static/js/pages/settings.js index 180069a..668275f 100644 --- a/backend/static/js/pages/settings.js +++ b/backend/static/js/pages/settings.js @@ -144,13 +144,61 @@ window.Page_settings = (() => { const label = isPro ? 'Ban Yaro Pro' : 'Züchter'; const price = isPro ? '29 €/Jahr' : '49 €/Jahr'; const color = isPro ? '#16a34a' : '#C4843A'; - const features = isPro - ? ['Mehrere Hunde verwalten', 'Ernährungsbereich mit KI-Berater', 'Erweiterte Karten-Layer', 'Alle künftigen Pro-Features'] - : ['Vollständige Züchter-Plattform', 'Warteliste, Läufigkeit & Trächtigkeit', 'Wurfverwaltung, Stammbaum, IK-Rechner', 'KI-Züchter-Assistent & Datenexport']; + const _group = (title, items) => ` +
+
${title}
+ ${items.map(f => ` +
+ + ${f} +
`).join('')} +
`; - const featureList = features.map(f => - `
  • ✓ ${f}
  • ` - ).join(''); + const featureList = isPro + ? _group('Deine Hunde', [ + 'Bis zu 10 Hunde gleichzeitig verwalten', + 'Getrennte Trainingsfortschritte, Gesundheits- und Ernährungsdaten je Hund', + ]) + + _group('Community & Alltag', [ + 'Gassi-Treffen: Fotos und Rasse der Teilnehmer sichtbar, Fotos nach dem Treffen hochladen', + 'Direktnachrichten & Chat mit anderen Hundebesitzern', + 'Playdate: Spielkameraden in der Nähe finden und verabreden', + ]) + + _group('Tools & Wissen', [ + 'Ernährung: Kalorienbedarf-Rechner, BARF-Guide, Giftliste, KI-Ernährungsberater', + 'Reise-Checkliste & EU-Länder-Einreiseregeln', + 'Notizblock mit KI-Muster-Analyse', + 'Erweiterte Karten-Layer (Wandern, Radfahren, Satellit)', + 'Alle künftigen Pro-Features inklusive', + ]) + : `
    + ✓ Alle Pro-Features inklusive — + mehrere Hunde, Ernährung, Gassi-Community, Chat, Playdate, Reise, Karten-Layer +
    ` + + _group('Zucht-Management', [ + 'Zuchtkartei: Stammdaten, Gesundheitstests (HD, ED, OCD, Augen, Herz, Patella, ZTP), Gentests (MDR1, PRA, DM, vWD)', + 'Wurfverwaltung: Welpen, Gewichtsverlauf, Fotos, automatisch ausgefüllter Kaufvertrag', + 'Warteliste: Interessenten mit Präferenzen (Geschlecht, Farbe, Verwendungszweck) pro Zuchthündin', + 'Läufigkeit & Trächtigkeit: Zykluskalender, Progesterontests, Deckdaten, Meilensteinberechnung', + 'Wurf-Buchstabe und Wurf-Name (z. B. A-Wurf, „Vatertags-Wurf")', + ]) + + _group('KI & Analyse', [ + 'KI-Züchter-Assistent: Wurfankündigungen schreiben, Genetik-Erklärung für Käufer, Paarungsanalyse', + 'Stammbaum bis 4 Generationen mit klickbaren Knoten', + 'Inzucht-Koeffizient (Wright\'s Formel, Ampel-Bewertung, Probeverpaarung)', + 'Tierschutz-Check automatisch bei jeder Verpaarung', + 'KI-Jahresbericht mit Trends und Empfehlungen', + ]) + + _group('Sichtbarkeit & Export', [ + 'Öffentliches Züchter-Profil unter banyaro.app/breeder/{zwingername}', + 'Wurfbörse: Würfe öffentlich ankündigen, Käufer schreiben direkt an', + 'Datenexport als HTML-Dossier und ODS-Tabelle (LibreOffice / Excel)', + 'Privater Züchter-Bereich mit Zwingername und Logo', + ]); const inputStyle = `width:100%;box-sizing:border-box;padding:var(--space-2) var(--space-3); border:1.5px solid var(--c-border);border-radius:var(--radius-md); @@ -217,9 +265,9 @@ window.Page_settings = (() => { Einmaliger Jahresbeitrag
    Kündigung jederzeit möglich - +
    diff --git a/backend/static/sw.js b/backend/static/sw.js index 8f687c7..ffc4d5c 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -3,7 +3,7 @@ Offline-Cache + Push Notifications + Tile-Cache ============================================================ */ -const CACHE_VERSION = 'by-v925'; +const CACHE_VERSION = 'by-v926'; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache