/* ============================================================
BAN YARO — Willkommensseite
============================================================ */
window.Page_welcome = (() => {
let _container = null;
let _appState = null;
let _showInstall = false;
let _heroInterval = null;
// ----------------------------------------------------------
// HERO-SLIDES — rotieren alle 4 Sekunden
// ----------------------------------------------------------
const HERO_SLIDES = [
{ headline: 'Jeder Moment zählt.', sub: 'Fotos, Notizen, Stimmungen — das Tagebuch deines Hundes.', screen: '/img/screenshots/screen-1.jpg' },
{ headline: 'Deine Gegend. Sein Revier.', sub: 'Hundeparks, Gassi-Spots und mehr — alles auf der Karte.', screen: '/img/screenshots/screen-2.jpg' },
{ headline: 'Keinen Termin verpassen.', sub: 'Impfungen, Gewicht, Tierarzt — mit KI, individuell auf deinen Hund angepasst.', screen: '/img/screenshots/screen-3.jpg' },
{ headline: 'Wir achten auf deinen Hund.', sub: 'Gefahren in deiner Nähe — damit ihr gezielt aus dem Weg gehen könnt.', screen: '/img/screenshots/screen-4.jpg' },
{ headline: 'Wie eine App. Nur ohne App Store.', sub: 'Einmal auf „Zum Homescreen" — fertig. Kein Store, keine Updates.', screen: '/img/screenshots/screen-5.jpg' },
{ headline: 'Lieblingsrouten für immer.', sub: 'Speichere eure besten Strecken — und entdecke neue in der Nähe.', screen: '/img/screenshots/screen-6.jpg' },
{ headline: 'Gassi ist kein Solosport.', sub: 'Triff andere Hundebesitzer — spontan, in deiner Umgebung.', screen: '/img/screenshots/screen-7.jpg' },
{ headline: 'Dein virtueller Trainer.', sub: '100+ Übungen, Schritt für Schritt — individuell auf deinen Hund abgestimmt.', screen: '/img/screenshots/screen-8.jpg' },
{ headline: 'Frag nach. Du bist nicht allein.', sub: 'Erfahrungen, Tipps, Hilfe — von Hundebesitzern für Hundebesitzer.', screen: '/img/screenshots/screen-9.jpg' },
];
async function init(container, appState, params = {}) {
_container = container;
_appState = appState;
_showInstall = !!params.install;
_render();
if (_showInstall) {
setTimeout(() => {
_container.querySelector('.wc-install-card')?.scrollIntoView({ behavior: 'smooth', block: 'start' });
}, 100);
}
}
function refresh() { _render(); }
function onDogChange() {}
// ----------------------------------------------------------
// FEATURES — Icon, Titel, Beschreibung, Zielseite
// ----------------------------------------------------------
const FEATURES = [
{ icon: 'book-open', label: 'Tagebuch', page: 'diary' },
{ icon: 'first-aid', label: 'Gesundheit', page: 'health' },
{ icon: 'map-trifold', label: 'Karte', page: 'map' },
{ icon: 'path', label: 'Routen', page: 'routes' },
{ icon: 'target', label: 'Training', page: 'uebungen' },
{ icon: 'warning-octagon', label: 'Giftköder', page: 'poison' },
{ icon: 'users', label: 'Freunde', page: 'friends' },
{ icon: 'chat-circle-dots', label: 'Nachrichten', page: 'chat' },
{ icon: 'paw-print', label: 'Gassi-Treffen', page: 'walks' },
{ icon: 'house-line', label: 'Sitting', page: 'sitting' },
{ icon: 'push-pin', label: 'Forum', page: 'forum' },
{ icon: 'books', label: 'Rassen-Wiki', page: 'wiki' },
{ icon: 'calendar-dots', label: 'Events', page: 'events' },
{ icon: 'bell', label: 'Neuigkeiten', page: 'notifications' },
{ icon: 'handshake', label: 'Knigge', page: 'knigge' },
{ icon: 'magnifying-glass', label: 'Vermisste', page: 'lost' },
];
// ----------------------------------------------------------
// RENDER
// ----------------------------------------------------------
function _render() {
if (_heroInterval) { clearInterval(_heroInterval); _heroInterval = null; }
const isInstalled = window.matchMedia('(display-mode: standalone)').matches
|| window.navigator.standalone === true;
const user = _appState?.user;
_injectStyles();
if (user) {
_renderLoggedIn(isInstalled);
} else {
_renderLanding(isInstalled);
}
_bindEvents();
_pulseMenuBtn();
}
// ----------------------------------------------------------
// LANDING PAGE — nicht eingeloggte Besucher
// ----------------------------------------------------------
function _renderLanding(isInstalled) {
const hasPrompt = !!App.getInstallPrompt();
_container.innerHTML = `
${HERO_SLIDES[0].headline}
${HERO_SLIDES[0].sub}
1 / ${HERO_SLIDES.length}
${hasPrompt ? `
` : `
`}
Kostenlos
Kein App Store
Daten in Deutschland
Tagebuch & Erinnerungen
Halte jeden gemeinsamen Moment fest — Fotos, Einträge, Stimmungen. Nur für dich, privat und sicher.
Gesundheit im Blick
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.
Training & KI-Trainer
Über 100 Übungen mit Schritt-für-Schritt-Anleitungen. Mit KI-Unterstützung, die deinen Hund kennt.
Deine Daten gehören dir.
Kein Facebook. Kein Google. Keine Werbung.
Ban Yaro läuft auf einem eigenen Server in Deutschland —
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 ? `
App installieren
${_installHTML()}
` : ''}
Ban Yaro · Deine Daten auf eigenem Server in Deutschland
`;
}
// ----------------------------------------------------------
// HILFSFUNKTIONEN (eingeloggte Ansicht)
// ----------------------------------------------------------
function _relDate(dateStr) {
if (!dateStr) return null;
const diff = Math.floor((Date.now() - new Date(dateStr)) / 86400000);
if (diff === 0) return 'Heute';
if (diff === 1) return 'Gestern';
if (diff > 1 && diff < 14) return `vor ${diff} Tagen`;
if (diff === -1) return 'Morgen';
if (diff < 0 && diff > -14) return `in ${-diff} Tagen`;
return dateStr;
}
function _greeting() {
const h = new Date().getHours();
if (h >= 5 && h < 11) return 'Guten Morgen';
if (h >= 11 && h < 18) return 'Moin';
if (h >= 18 && h < 22) return 'Guten Abend';
return 'Hey';
}
function _appointmentIcon(typ) {
if (!typ) return 'calendar-check';
const t = typ.toLowerCase();
if (t === 'impfung') return 'syringe';
if (t === 'tierarzt') return 'stethoscope';
if (t === 'medikament') return 'pill';
return 'calendar-check';
}
// Die 4 Feature-Karten für die eingeloggte Ansicht
const FEATURE_CARDS = [
{ icon: 'book-open', label: 'Tagebuch', desc: 'Fotos, Notizen, Erinnerungen', page: 'diary' },
{ icon: 'first-aid', label: 'Gesundheit', desc: 'Impfungen, Gewicht, Termine', page: 'health' },
{ icon: 'map-trifold', label: 'Karte', desc: 'Spots & Alerts in deiner Nähe', page: 'map' },
{ icon: 'target', label: 'Training', desc: 'Übungen mit KI-Trainer', page: 'uebungen' },
];
const FEATURE_CARD_PAGES = new Set(FEATURE_CARDS.map(f => f.page));
function _heroHTML(dog, dashData) {
const photoUrl = dashData?.random_photo?.url || null;
const avatarUrl = dog?.foto_url || null;
const dogName = dog ? UI.escape(dog.name) : 'Dein Hund';
const dogRasse = dog?.rasse ? UI.escape(dog.rasse) : '';
const greeting = _greeting();
if (photoUrl) {
return `
${avatarUrl ? `` : ''}
${UI.escape(greeting)}
${dogName}
${dogRasse ? `
${dogRasse}
` : ''}
`;
}
// Fallback: Gradient-Hero
return `
${UI.escape(greeting)}
${dogName}
${dogRasse ? `
${dogRasse}
` : ''}
`;
}
function _chip2HTML(dashData) {
const appt = dashData?.next_appointment;
if (!appt) return ''; // kein Termin → Chip fehlt; Bank kommt ggf. async
const apptLabel = UI.escape(appt.bezeichnung);
const apptDate = _relDate(appt.naechstes) || appt.naechstes || '—';
const apptIcon = _appointmentIcon(appt.typ);
return `
Kein App Store nötig — direkt auf den Home-Bildschirm.
`;
}
if (isIOS && isSafari) {
return `
So kommt Ban Yaro auf deinen Home-Bildschirm:
${_steps([
['share', 'Tippe unten in Safari auf das Teilen-Symbol '],
['rows-plus-top', 'Wähle „Zum Home-Bildschirm" aus der Liste'],
['check', 'Tippe oben rechts auf „Hinzufügen"'],
])}
Funktioniert nur in Safari — nicht in Chrome oder Firefox auf iOS.
`;
}
if (isIOS && !isSafari) {
return `
Auf dem iPhone geht die Installation nur über Safari.
${_steps([
['safari-logo', 'Öffne Safari auf deinem iPhone'],
['arrow-square-in','Gib banyaro.app in die Adressleiste ein'],
['share', 'Tippe auf das Teilen-Symbol und wähle „Zum Home-Bildschirm"'],
])}
`;
}
if (isAndroid) {
return `
Am einfachsten geht es mit Chrome:
${_steps([
['arrow-square-in', 'Öffne banyaro.app in Chrome'],
['dots-three-circle','Tippe auf das Menü ⋮ oben rechts'],
['download-simple', 'Wähle „App installieren" oder „Zum Startbildschirm hinzufügen"'],
])}
`;
}
return `
${_steps([
['arrow-square-in', 'Öffne banyaro.app in Chrome oder Edge'],
['monitor', 'Klicke auf das Installations-Symbol in der Adressleiste'],
['check', 'Bestätigen — fertig!'],
])}
${_steps([
['arrow-square-in', 'Öffne banyaro.app in Safari auf dem iPhone'],
['share', 'Tippe auf das Teilen-Symbol '],
['rows-plus-top', 'Wähle „Zum Home-Bildschirm" → „Hinzufügen"'],
])}