UX: Upgrade-Modal mit vollständigen Feature-Listen (SW by-v926)

Pro (29€/Jahr): 3 Gruppen — Hunde (bis 10, getrennte Daten),
  Community (Gassi-Treffen, Chat, Playdate), Tools (Ernährung, Reise, Notizblock, Karten)
Züchter (49€/Jahr): Pro-Inklusive-Badge + 3 Züchter-Gruppen —
  Zucht-Management (Kartei, Wurf, Warteliste, Läufigkeit, Wurf-Rang),
  KI & Analyse (KI-Assistent, Stammbaum, IK-Rechner, Tierschutz-Check, Jahresbericht),
  Sichtbarkeit & Export (Profil, Wurfbörse, Datenexport, Privater Bereich)
This commit is contained in:
rene 2026-05-14 11:23:39 +02:00
parent 4332b1195e
commit 3b37c14600
4 changed files with 59 additions and 11 deletions

View file

@ -406,7 +406,7 @@ async def serve_media(path: str, request: _Request):
raise _HE(404, "Nicht gefunden.") raise _HE(404, "Nicht gefunden.")
return _media_response(filepath) 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") @app.get("/.well-known/assetlinks.json")
async def assetlinks(): async def assetlinks():

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung. 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 APP_VERSION = '1.5.1'; // ← semantische Version, wird bei make release gesetzt
const IS_STAGING = location.hostname === 'staging.banyaro.app'; const IS_STAGING = location.hostname === 'staging.banyaro.app';
// Cache-Bust-Parameter nach Update-Reload sofort entfernen // Cache-Bust-Parameter nach Update-Reload sofort entfernen

View file

@ -144,13 +144,61 @@ window.Page_settings = (() => {
const label = isPro ? 'Ban Yaro Pro' : 'Züchter'; const label = isPro ? 'Ban Yaro Pro' : 'Züchter';
const price = isPro ? '29 €/Jahr' : '49 €/Jahr'; const price = isPro ? '29 €/Jahr' : '49 €/Jahr';
const color = isPro ? '#16a34a' : '#C4843A'; const color = isPro ? '#16a34a' : '#C4843A';
const features = isPro const _group = (title, items) => `
? ['Mehrere Hunde verwalten', 'Ernährungsbereich mit KI-Berater', 'Erweiterte Karten-Layer', 'Alle künftigen Pro-Features'] <div style="margin-bottom:var(--space-3)">
: ['Vollständige Züchter-Plattform', 'Warteliste, Läufigkeit & Trächtigkeit', 'Wurfverwaltung, Stammbaum, IK-Rechner', 'KI-Züchter-Assistent & Datenexport']; <div style="font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
color:var(--c-text-muted);margin-bottom:var(--space-2)">${title}</div>
${items.map(f => `
<div style="display:flex;align-items:flex-start;gap:var(--space-2);
padding:3px 0;font-size:var(--text-sm)">
<span style="color:${color};font-weight:700;flex-shrink:0;margin-top:1px"></span>
<span>${f}</span>
</div>`).join('')}
</div>`;
const featureList = features.map(f => const featureList = isPro
`<li style="padding:var(--space-1) 0;font-size:var(--text-sm)">✓ ${f}</li>` ? _group('Deine Hunde', [
).join(''); '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',
])
: `<div style="padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);
background:rgba(22,163,74,0.08);border:1px solid rgba(22,163,74,0.2);
font-size:var(--text-xs);color:var(--c-text-secondary);margin-bottom:var(--space-3)">
<strong style="color:#16a34a"> Alle Pro-Features inklusive</strong>
mehrere Hunde, Ernährung, Gassi-Community, Chat, Playdate, Reise, Karten-Layer
</div>`
+ _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); 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); border:1.5px solid var(--c-border);border-radius:var(--radius-md);
@ -217,9 +265,9 @@ window.Page_settings = (() => {
Einmaliger Jahresbeitrag<br>Kündigung jederzeit möglich Einmaliger Jahresbeitrag<br>Kündigung jederzeit möglich
</div> </div>
</div> </div>
<ul style="list-style:none;padding:0;margin:0 0 var(--space-3)"> <div style="margin:0 0 var(--space-3)">
${featureList} ${featureList}
</ul> </div>
<div style="padding:var(--space-3);border-radius:var(--radius-md); <div style="padding:var(--space-3);border-radius:var(--radius-md);
background:var(--c-surface-raised,rgba(0,0,0,.04)); background:var(--c-surface-raised,rgba(0,0,0,.04));
font-size:var(--text-xs);color:var(--c-text-secondary);line-height:1.6"> font-size:var(--text-xs);color:var(--c-text-secondary);line-height:1.6">

View file

@ -3,7 +3,7 @@
Offline-Cache + Push Notifications + Tile-Cache Offline-Cache + Push Notifications + Tile-Cache
============================================================ */ ============================================================ */
const CACHE_VERSION = 'by-v925'; const CACHE_VERSION = 'by-v926';
const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_STATIC = `${CACHE_VERSION}-static`;
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache