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 ? ` - - ` : ` - - `} + @@ -145,7 +137,33 @@ window.Page_welcome = (() => {
- + + ${!isInstalled ? ` +
+
+
+ +
+
+
Kein App Store nötig
+
Füge Ban Yaro zum Home-Bildschirm hinzu — einmal, dann immer griffbereit
+
+
+

+ 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 ? ` + + ` : ` +
${_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.

- -
- -
- ${FEATURES.map(f => ` -
-
- -
- ${f.label} -
- `).join('')} -
-
-
- ${hasPrompt ? ` - - ` : ` - - `} -

Kein App Store · Direkt auf den Home-Bildschirm

- - ${!isInstalled ? ` - - ` : ''} + +
- - ${_showInstall ? ` -
-
-
- - Immer griffbereit — kein App Store -
-
${_installHTML()}
-
-
- ` : ''} - `; @@ -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