diff --git a/backend/main.py b/backend/main.py
index 9c2fe71..bbf6804 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -327,7 +327,7 @@ MEDIA_DIR = os.getenv("MEDIA_DIR", "/data/media")
os.makedirs(MEDIA_DIR, exist_ok=True)
app.mount("/media", StaticFiles(directory=MEDIA_DIR), name="media")
-APP_VER = "754" # muss mit APP_VER in app.js übereinstimmen
+APP_VER = "755" # muss mit APP_VER in app.js übereinstimmen
@app.get("/api/version")
async def app_version():
diff --git a/backend/static/index.html b/backend/static/index.html
index d7f7a58..3501a30 100644
--- a/backend/static/index.html
+++ b/backend/static/index.html
@@ -578,7 +578,7 @@
-
+
diff --git a/backend/static/js/app.js b/backend/static/js/app.js
index 5583c1e..e7771d5 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 = '754'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
+const APP_VER = '755'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VERSION = '1.5.0'; // ← semantische Version, wird bei make release gesetzt
const IS_STAGING = location.hostname === 'staging.banyaro.app';
diff --git a/backend/static/js/pages/settings.js b/backend/static/js/pages/settings.js
index e2b9400..0197f58 100644
--- a/backend/static/js/pages/settings.js
+++ b/backend/static/js/pages/settings.js
@@ -50,10 +50,12 @@ window.Page_settings = (() => {
// ----------------------------------------------------------
// INIT / REFRESH
// ----------------------------------------------------------
- async function init(container, appState) {
+ async function init(container, appState, params = {}) {
_container = container;
_appState = appState;
_render();
+ if (params.tab === 'login') setTimeout(() => _renderAuth('login'), 50);
+ if (params.tab === 'register') setTimeout(() => _renderAuth('register'), 50);
// Frischen User-State laden damit Badges (is_founder, is_partner) aktuell sind
if (_appState.user) {
try {
diff --git a/backend/static/js/pages/welcome.js b/backend/static/js/pages/welcome.js
index a6111f1..ee644b1 100644
--- a/backend/static/js/pages/welcome.js
+++ b/backend/static/js/pages/welcome.js
@@ -87,7 +87,6 @@ window.Page_welcome = (() => {
// LANDING PAGE — nicht eingeloggte Besucher
// ----------------------------------------------------------
function _renderLanding(isInstalled) {
- // Browser-Besucher (kein PWA) ohne Login → auf /info weiterleiten
const isPWA = window.matchMedia('(display-mode: standalone)').matches
|| window.navigator.standalone === true;
if (!isPWA && !sessionStorage.getItem('by_stay_in_app')) {
@@ -113,17 +112,10 @@ window.Page_welcome = (() => {
- ${hasPrompt ? `
-
-
- Zum Home-Bildschirm hinzufügen
-
- ` : `
-
-
- Kostenlos loslegen
-
- `}
+
+
+ Kostenlos registrieren
+
Schon dabei? Anmelden
@@ -145,7 +137,33 @@ window.Page_welcome = (() => {
-
+
+ ${!isInstalled ? `
+
+
+
+ Ban Yaro ist eine Web-App (PWA). Das bedeutet: kein App-Store-Download, automatische Updates ohne dein Zutun, und sie verhält sich genau wie eine native App — mit Icon, Vollbild und Offline-Modus.
+
+ ${hasPrompt ? `
+
+
+ Jetzt zum Home-Bildschirm hinzufügen
+
+ ` : `
+
${_installHTML()}
+ `}
+
+ ` : ''}
+
+
@@ -155,8 +173,6 @@ window.Page_welcome = (() => {
Halte jeden gemeinsamen Moment fest — Fotos, Einträge, Stimmungen. Nur für dich, privat und sicher.
-
-
@@ -166,26 +182,22 @@ window.Page_welcome = (() => {
Impfungen, Gewicht, Tierarzttermine — alles an einem Ort. Du siehst immer, wann was ansteht.
-
-
Community vor Ort
-
Giftköder-Warnungen, Gassi-Treffen, Events — was in deiner Gegend gerade passiert.
+
Giftköder-Warnungen, Forum, Events — was in deiner Gegend gerade passiert.
-
-
-
Training & KI-Trainer
-
Über 100 Übungen mit Schritt-für-Schritt-Anleitungen. Mit KI-Unterstützung, die deinen Hund kennt.
+
Training & Übungen
+
Über 100 Übungen mit Schritt-für-Schritt-Anleitungen. Fortschritt tracken, Streaks aufbauen.
@@ -198,65 +210,21 @@ window.Page_welcome = (() => {
Kein Facebook. Kein Google. Keine Werbung.
Ban Yaro läuft auf einem eigenen Server in Deutschland —
- dein Tagebuch, deine Routen, deine Gesundheitsdaten
- bleiben privat.
+ dein Tagebuch, deine Routen, deine Gesundheitsdaten bleiben privat.
-
-
-
- Und noch viel mehr
-
-
-
- ${FEATURES.map(f => `
-
- `).join('')}
-
-
-
- ${hasPrompt ? `
-
-
- Zum Home-Bildschirm hinzufügen
-
- ` : `
-
-
- Jetzt kostenlos starten
-
- `}
-
Kein App Store · Direkt auf den Home-Bildschirm
-
- ${!isInstalled ? `
-
-
- Zum Home-Bildschirm hinzufügen
-
- ` : ''}
+
+
+ Jetzt kostenlos starten
+
+
+ Schon dabei? Anmelden
+
-
- ${_showInstall ? `
-
- ` : ''}
-
`;
@@ -811,6 +779,43 @@ window.Page_welcome = (() => {
}
.wc-grid.wc-grid--collapsed { display: none; }
+ /* Install Block */
+ .wc-install-block {
+ background: var(--c-bg-card);
+ border-top: 3px solid var(--c-primary);
+ padding: var(--space-5) var(--space-5) var(--space-6);
+ }
+ .wc-install-block-header {
+ display: flex; align-items: flex-start; gap: var(--space-3);
+ margin-bottom: var(--space-3);
+ }
+ .wc-install-block-icon {
+ width: 44px; height: 44px; border-radius: var(--radius-md);
+ background: var(--c-primary-subtle); flex-shrink: 0;
+ display: flex; align-items: center; justify-content: center;
+ }
+ .wc-install-block-icon .ph-icon { width: 22px; height: 22px; color: var(--c-primary); }
+ .wc-install-block-title {
+ font-size: var(--text-base); font-weight: var(--weight-bold);
+ color: var(--c-text); margin-bottom: 2px;
+ }
+ .wc-install-block-sub {
+ font-size: var(--text-sm); color: var(--c-text-secondary); line-height: 1.4;
+ }
+ .wc-install-block-why {
+ font-size: var(--text-sm); color: var(--c-text-secondary);
+ line-height: 1.6; margin: 0 0 var(--space-4);
+ padding: var(--space-3) var(--space-4);
+ background: var(--c-surface); border-radius: var(--radius-md);
+ border-left: 3px solid var(--c-primary);
+ }
+ .wc-install-block-btn {
+ width: 100%; font-size: var(--text-base);
+ padding: 14px; border-radius: var(--radius-lg);
+ display: flex; align-items: center; justify-content: center; gap: var(--space-2);
+ }
+ .wc-install-block-steps { margin-top: var(--space-2); }
+
/* Bottom CTA */
.wc-bottom-cta {
padding: var(--space-8) var(--space-5) var(--space-6);
@@ -1194,15 +1199,10 @@ window.Page_welcome = (() => {
_container.querySelector('#welcome-install-hero-btn2')?.addEventListener('click', installBtn);
// Register / Login
- const toSettings = () => App.navigate('settings');
- _container.querySelector('#welcome-register-btn')?.addEventListener('click', toSettings);
- _container.querySelector('#welcome-register-btn2')?.addEventListener('click', toSettings);
- _container.querySelector('#welcome-login-btn')?.addEventListener('click', toSettings);
-
- // Installationsanleitung Link
- _container.querySelector('#welcome-install-link')?.addEventListener('click', () => {
- App.navigate('welcome', true, { install: true });
- });
+ _container.querySelector('#welcome-register-btn')?.addEventListener('click', () => App.navigate('settings', true, { tab: 'register' }));
+ _container.querySelector('#welcome-register-btn2')?.addEventListener('click', () => App.navigate('settings', true, { tab: 'register' }));
+ _container.querySelector('#welcome-login-btn')?.addEventListener('click', () => App.navigate('settings', true, { tab: 'login' }));
+ _container.querySelector('#welcome-login-btn2')?.addEventListener('click', () => App.navigate('settings', true, { tab: 'login' }));
// Link kopieren
_container.querySelector('#install-copy-btn')?.addEventListener('click', async () => {
diff --git a/backend/static/sw.js b/backend/static/sw.js
index 42700bf..7f45efe 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-v754';
+const CACHE_VERSION = 'by-v755';
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