diff --git a/VERSION b/VERSION index 03ce6df..746faa2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1252 \ No newline at end of file +1250 \ No newline at end of file diff --git a/backend/static/index.html b/backend/static/index.html index 5a330e3..926a1aa 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -86,14 +86,14 @@ Ban Yaro - + - - - - - + + + + + @@ -612,11 +612,11 @@ - - - - - + + + + + @@ -626,7 +626,7 @@ - + diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 9a5e14c..4cb8380 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 = '1252'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '1250'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt window.APP_VER = APP_VER; // global verfügbar für andere Module (z.B. offline-indicator) window.APP_VERSION = APP_VERSION; @@ -469,15 +469,12 @@ const App = (() => { break; case 'sibling': el.style.display = 'none'; - if (el.nextElementSibling) { - el.nextElementSibling.classList.remove('hidden'); // .hidden hat !important - el.nextElementSibling.style.display = 'flex'; - } + if (el.nextElementSibling) el.nextElementSibling.style.display = 'flex'; break; case 'show-el': { el.style.display = 'none'; const t = el.dataset.fbEl && document.getElementById(el.dataset.fbEl); - if (t) { t.classList.remove('hidden'); t.style.display = 'flex'; } // .hidden hat !important + if (t) t.style.display = 'flex'; break; } case 'emoji': diff --git a/backend/static/js/pages/admin.js b/backend/static/js/pages/admin.js index 294b532..7ca761d 100644 --- a/backend/static/js/pages/admin.js +++ b/backend/static/js/pages/admin.js @@ -745,7 +745,7 @@ window.Page_admin = (() => {

-

${u.is_banned - ? `` - : `` } @@ -895,9 +895,9 @@ window.Page_admin = (() => { title="Abo-Stufe ändern"> - ` : ''} @@ -1108,9 +1108,9 @@ window.Page_admin = (() => { ${!r.resolved ? ` - ` : ''}
@@ -1193,13 +1193,13 @@ window.Page_admin = (() => { data-locked="${t.is_locked}" title="${t.is_locked ? 'Entsperren' : 'Sperren'}"> - ` : ` - `} @@ -1712,7 +1712,7 @@ window.Page_admin = (() => { ${z.website ? `Link` : '—'} - + `).join('')}
`; @@ -1747,8 +1747,8 @@ window.Page_admin = (() => { opacity:.5;margin-bottom:var(--space-2)">
↑ aktuelles Foto
` : ''}
- - + +
`).join('')} `; @@ -1841,7 +1841,7 @@ window.Page_admin = (() => { - @@ -2024,9 +2024,9 @@ window.Page_admin = (() => { data-uid="${a.user_id || a.id}" data-name="${UI.escape(a.name)}"> ${UI.icon('check')} Freischalten - @@ -2170,9 +2170,9 @@ window.Page_admin = (() => { ${b.verified_at ? new Date(b.verified_at).toLocaleDateString('de-DE') : '—'} - @@ -2251,8 +2251,8 @@ window.Page_admin = (() => { ${UI.escape(j.trigger)} - @@ -3203,10 +3203,10 @@ window.Page_admin = (() => { border:1.5px solid var(--c-border);border-radius:var(--radius-md); background:var(--c-surface);color:var(--c-text);font-size:var(--text-sm)">
- - + + @@ -3839,8 +3839,8 @@ window.Page_admin = (() => { `); } if (inv.status === 'sent') { - actions.push(``); } @@ -3848,8 +3848,8 @@ window.Page_admin = (() => { actions.push(``); - actions.push(``); } @@ -4067,7 +4067,7 @@ window.Page_admin = (() => { footer: `
${isLocked - ? `` + ? `` : `
`; diff --git a/backend/static/js/pages/breeder.js b/backend/static/js/pages/breeder.js index 917bcaa..fa6fd53 100644 --- a/backend/static/js/pages/breeder.js +++ b/backend/static/js/pages/breeder.js @@ -390,7 +390,6 @@ window.Page_breeder = (() => { `).join('')} `; - section.classList.remove('hidden'); // Template startet mit .hidden (!important) } catch (_) {} } diff --git a/backend/static/js/pages/chat.js b/backend/static/js/pages/chat.js index 3489a40..10b64f5 100644 --- a/backend/static/js/pages/chat.js +++ b/backend/static/js/pages/chat.js @@ -195,7 +195,7 @@ window.Page_chat = (() => { `}
?
- +
@@ -265,7 +265,7 @@ window.Page_chat = (() => { const dotEl = document.getElementById('chat-partner-dot'); if (nameEl) nameEl.textContent = data.partner_name; if (avEl) avEl.textContent = (data.partner_name || '?')[0].toUpperCase(); - if (dotEl) dotEl.classList.toggle('hidden', !data.partner_online); + if (dotEl) dotEl.style.display = data.partner_online ? '' : 'none'; if (!data.messages.length) { el.innerHTML = ` @@ -304,7 +304,7 @@ window.Page_chat = (() => { // Online-Dot aktualisieren const dotEl = document.getElementById('chat-partner-dot'); - if (dotEl) dotEl.classList.toggle('hidden', !data.partner_online); + if (dotEl) dotEl.style.display = data.partner_online ? '' : 'none'; await API.chat.markRead(_convId).catch(() => {}); await _updateChatBadge(); diff --git a/backend/static/js/pages/diary.js b/backend/static/js/pages/diary.js index f6d07e7..d06cc5e 100644 --- a/backend/static/js/pages/diary.js +++ b/backend/static/js/pages/diary.js @@ -391,7 +391,7 @@ window.Page_diary = (() => { const bar = _container.querySelector('#diary-stats-bar'); if (!bar) return; const s = _totalStats; - if (!s && _entries.length === 0) { bar.classList.add('hidden'); return; } + if (!s && _entries.length === 0) { bar.style.display = 'none'; return; } const entries = s?.entries ?? _entries.length; const photos = s?.photos ?? _entries.reduce((n, e) => n + _allMedia(e).length, 0); const days = s?.days ?? new Set(_entries.map(e => e.datum).filter(Boolean)).size; @@ -425,8 +425,7 @@ window.Page_diary = (() => { `; - // .hidden hat !important → nur per classList togglen (style.display verliert immer) - bar.classList.remove('hidden'); + bar.style.display = 'flex'; bar.querySelectorAll('.diary-view-btn').forEach(btn => { btn.addEventListener('click', () => { @@ -1333,9 +1332,8 @@ window.Page_diary = (() => { function _renderNewGrid() { const grid = document.getElementById('diary-new-media-grid'); if (!grid) return; - if (_newFiles.length === 0) { grid.classList.add('hidden'); grid.innerHTML = ''; return; } - // .hidden hat !important → classList togglen; Grid-Layout kommt aus .diary-media-grid - grid.classList.remove('hidden'); + if (_newFiles.length === 0) { grid.style.display = 'none'; grid.innerHTML = ''; return; } + grid.style.cssText = 'display:grid;grid-template-columns:repeat(auto-fill,minmax(90px,1fr));gap:8px;margin-bottom:8px'; grid.innerHTML = _newFiles.map((f, i) => { const objUrl = URL.createObjectURL(f); const thumb = f.type === 'application/pdf' || f.name?.endsWith('.pdf') diff --git a/backend/static/js/pages/dog-profile.js b/backend/static/js/pages/dog-profile.js index 3db85a7..61d23a7 100644 --- a/backend/static/js/pages/dog-profile.js +++ b/backend/static/js/pages/dog-profile.js @@ -559,8 +559,8 @@ window.Page_dog_profile = (() => { value="${defaultUntil}" min="${today}"> - @@ -615,7 +615,7 @@ window.Page_dog_profile = (() => { `, footer: `
- +
`, }); @@ -672,7 +672,7 @@ window.Page_dog_profile = (() => { const footer = `
- ${hasPhoto ? `` : ''} + ${hasPhoto ? `` : ''}
${hasPhoto ? `` : ''} @@ -945,8 +945,8 @@ window.Page_dog_profile = (() => { `).join('')} @@ -322,14 +322,14 @@ window.Page_moderation = (() => {
${canAction ? (u.is_banned - ? `` - : ``) : '' diff --git a/backend/static/js/pages/onboarding.js b/backend/static/js/pages/onboarding.js index fd065f6..5ba7638 100644 --- a/backend/static/js/pages/onboarding.js +++ b/backend/static/js/pages/onboarding.js @@ -163,11 +163,11 @@ window.Page_onboarding = (() => {
- -
@@ -255,14 +255,14 @@ window.Page_onboarding = (() => { -
-
@@ -317,12 +317,12 @@ window.Page_onboarding = (() => {
- ${dogName ? ` - diff --git a/backend/static/js/pages/playdate.js b/backend/static/js/pages/playdate.js index fb21660..1987eb1 100644 --- a/backend/static/js/pages/playdate.js +++ b/backend/static/js/pages/playdate.js @@ -81,7 +81,7 @@ function _fmtDate(iso) {
-
+
@@ -215,7 +215,7 @@ window.Page_poison = (() => { ${r.beschreibung ? UI.escape(r.beschreibung.slice(0, 80)) + '
' : ''} 📍 ${distStr} entfernt
📅 ${_fmtDate(r.created_at)} - ${r.bestaetigt ? '
Bestätigt' : ''} + ${r.bestaetigt ? '
Bestätigt' : ''} `); marker.on('click', () => _openDetail(r)); @@ -276,7 +276,7 @@ window.Page_poison = (() => { ${typ.label} ${r.bestaetigt - ? ' Bestätigt' + ? ' Bestätigt' : ''} @@ -330,7 +330,7 @@ window.Page_poison = (() => { ${UI.icon(typ.icon)} ${typ.label} - ${r.bestaetigt ? ' Bestätigt' : ''} + ${r.bestaetigt ? ' Bestätigt' : ''}
${r.beschreibung @@ -347,7 +347,7 @@ window.Page_poison = (() => {
${!r.bestaetigt && _appState.user && !isOwnEntry - ? `` + ? `` : ''} ${isOwnEntry || isAdmin diff --git a/backend/static/js/pages/routes.js b/backend/static/js/pages/routes.js index ac1d151..665d368 100644 --- a/backend/static/js/pages/routes.js +++ b/backend/static/js/pages/routes.js @@ -352,13 +352,13 @@ window.Page_routes = (() => {
-
- @@ -669,7 +669,7 @@ window.Page_wiki = (() => {
- ` : ''; @@ -835,14 +835,14 @@ window.Page_wiki = (() => { ${berichteHtml}
${_appState.user - ? `` + ? `` : `

Anmelden, um einen Bericht zu schreiben.

` } ${_appState.user ? `
-
` : ''}`} @@ -878,8 +878,7 @@ window.Page_wiki = (() => { const idx = parseInt(btn.dataset.idx); mainImg.src = allFotos[idx].foto_url; mainImg.style.display = ''; - const fb = document.getElementById('wiki-photo-fallback'); - fb.classList.add('hidden'); fb.style.display = ''; + document.getElementById('wiki-photo-fallback').style.display = 'none'; strip.querySelectorAll('.wiki-gallery-thumb').forEach(b => b.classList.toggle('active', b === btn)); }); }); @@ -1256,7 +1255,7 @@ window.Page_wiki = (() => { ${UI.icon('house-line')} ${r.wohnung_geeignet ? 'Wohnung' : 'Haus'} ${UI.icon('users')} ${r.kinder_geeignet ? 'Kinderfreundlich' : 'Erfahrung nötig'}
- + `; @@ -1269,7 +1268,7 @@ window.Page_wiki = (() => {

Deine Top 3 Rassen

${cardsHtml}
- + `; diff --git a/backend/static/js/pages/zuchthunde.js b/backend/static/js/pages/zuchthunde.js index 682abba..16b2b1c 100644 --- a/backend/static/js/pages/zuchthunde.js +++ b/backend/static/js/pages/zuchthunde.js @@ -341,8 +341,8 @@ window.Page_zuchthunde = (() => { title="Bearbeiten"> ${UI.icon('pencil-simple')} - @@ -360,7 +360,7 @@ window.Page_zuchthunde = (() => { - +
`; } @@ -379,7 +379,7 @@ window.Page_zuchthunde = (() => { function _closeSection(hundId) { const wrap = document.getElementById(`zh-section-${hundId}`); - if (wrap) wrap.classList.add('hidden'); // .hidden hat !important → nur classList + if (wrap) wrap.style.display = 'none'; _openSections[hundId] = null; _updateSectionButtons(hundId, null); } @@ -389,7 +389,7 @@ window.Page_zuchthunde = (() => { _updateSectionButtons(hundId, section); const wrap = document.getElementById(`zh-section-${hundId}`); if (!wrap) return; - wrap.classList.remove('hidden'); + wrap.style.display = ''; wrap.innerHTML = `

Lädt…

`; if (section === 'health') _loadHealthSection(hundId, wrap); if (section === 'genetic') _loadGeneticSection(hundId, wrap); @@ -427,8 +427,8 @@ window.Page_zuchthunde = (() => { ${t.untersuch_am ? `${_fmtDate(t.untersuch_am)}` : ''} ${t.labor ? `${UI.escape(t.labor)}` : ''} - + `).join('') : `

Noch keine Gesundheitstests eingetragen.

`; @@ -490,8 +490,8 @@ window.Page_zuchthunde = (() => { ${t.getestet_am ? `${_fmtDate(t.getestet_am)}` : ''} ${t.labor ? `${UI.escape(t.labor)}` : ''} - + `).join('') : `

Noch keine Gentests eingetragen.

`; @@ -555,8 +555,8 @@ window.Page_zuchthunde = (() => { ${t.richter ? `${UI.escape(t.richter)}` : ''} ${t.formwert ? `${UI.escape(t.formwert)}` : ''} - + `).join('') : `

Noch keine Titel eingetragen.

`; diff --git a/backend/static/landing.html b/backend/static/landing.html index f513edc..2104b5f 100644 --- a/backend/static/landing.html +++ b/backend/static/landing.html @@ -4,9 +4,9 @@ - + Ban Yaro — Die Hunde-App für Deutschland, Österreich & Schweiz - + @@ -14,7 +14,7 @@ - + @@ -23,7 +23,7 @@ - + @@ -33,7 +33,7 @@ "@type": "MobileApplication", "name": "Ban Yaro", "alternateName": "Ban Yaro — Die Hunde-Plattform", - "description": "Ban Yaro ist die deutschsprachige All-in-One Hunde-Plattform für Hundebesitzer und Züchter. Kostenlos: Tagebuch, Impfpass, Gassi-Community, Giftköder-Alarm. Pro (29 €/Jahr): mehrere Hunde, Ernährung. Züchter (49 €/Jahr): Warteliste, Läufigkeit, Wurfverwaltung, Stammbaum, Inzucht-Koeffizient, KI-Assistent — DSGVO-konform, direkt im Browser.", + "description": "Ban Yaro ist die deutschsprachige All-in-One Hunde-Plattform für Hundebesitzer und Züchter. Kostenlos: Tagebuch, Impfpass, Gassi-Community, Giftköder-Alarm. Pro (29 €/Jahr): mehrere Hunde, Ernährung. Züchter (49 €/Jahr): Warteliste, Läufigkeit, Wurfverwaltung, Stammbaum, Inzucht-Koeffizient, KI-Assistent — DSGVO-konform, ohne App Store.", "url": "https://banyaro.app", "applicationCategory": "LifestyleApplication", "applicationSubCategory": "PetApplication", @@ -129,7 +129,7 @@ "DSGVO Datenexport (Art. 20): vollständiger JSON-Download aller eigenen Daten", "Hunde-Persönlichkeitstest mit Trainingstipps", "Reise-Checkliste und EU-Länder-Einreiseregeln", - "Integrierte Hilfe und FAQ direkt in der App", + "Integrierte Hilfe und FAQ ohne App Store", "Warteliste: Interessenten mit Präferenzen pro Zuchthündin verwalten", "Läufigkeit und Trächtigkeit: Zykluskalender, Progesterontests, Deckdaten, Meilensteine", "Wurf-Buchstabe und Wurf-Name für jeden Wurf", @@ -750,7 +750,7 @@
Kostenlos nutzbar Daten in Deutschland - Läuft direkt im Browser + Kein App Store nötig Made in Germany Offline-fähig
@@ -1289,7 +1289,7 @@

Ban Yaro vs. Konkurrenz

-

Hundeo ist stark im Training — Dogorama stark in der Community. Ban Yaro vereint beides und geht weit darüber hinaus: Zucht-Management, KI-Trainer, Gesundheitsakte und Sitting in einer einzigen App — direkt im Browser.

+

Hundeo ist stark im Training — Dogorama stark in der Community. Ban Yaro vereint beides und geht weit darüber hinaus: Zucht-Management, KI-Trainer, Gesundheitsakte und Sitting in einer einzigen App — ohne App Store.

@@ -1314,7 +1314,7 @@ - + @@ -1491,7 +1491,7 @@
-

Direkt im Browser

+

Kein App Store

Als Progressive Web App direkt über den Browser installierbar — auf iOS und Android. Sofort updatebar.

@@ -1537,7 +1537,7 @@

Jetzt kostenlos starten

-

Einfach banyaro.app im Browser öffnen und "Zum Homescreen hinzufügen" — fertig. Keine Installation, keine Kreditkarte.

+

Einfach banyaro.app im Browser öffnen und "Zum Homescreen hinzufügen" — fertig. Kein App Store, keine Kreditkarte.

Ban Yaro öffnen
diff --git a/backend/static/sw.js b/backend/static/sw.js index d3a5f27..ff26458 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -4,7 +4,7 @@ ============================================================ */ // ← EINZIGE Stelle für die Version — STATIC_ASSETS und CACHE_VERSION leiten sich ab -const VER = '1252'; +const VER = '1250'; const CACHE_VERSION = `by-v${VER}`; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
✓ DE
Direkt im Browser nutzbar (PWA)Kein App Store nötig (PWA)