/* ============================================================ BAN YARO — Hunde-Persönlichkeitstest 10 Fragen, 4 Typen: Abenteurer / Entdecker / Kuschler / Denker ============================================================ */ window.Page_personality = (() => { let _container = null; let _appState = null; let _current = 0; // Aktuelle Frage (0-basiert) let _scores = { A:0, B:0, C:0, D:0 }; let _answers = []; // Gewählte Typen je Frage const LS_KEY = 'banyaro_personality_result'; // ---------------------------------------------------------- // FRAGEN // ---------------------------------------------------------- const FRAGEN = [ { frage: "Wie reagiert dein Hund auf neue Orte?", antworten: [ { text: "Stürmt sofort los — alles erkunden!", typ: 'A' }, { text: "Schaut erst vorsichtig, dann neugierig", typ: 'B' }, { text: "Bleibt lieber bei mir in der Nähe", typ: 'C' }, { text: "Analysiert die Lage gründlich", typ: 'D' }, ]}, { frage: "Was macht dein Hund am liebsten?", antworten: [ { text: "Rennen, Ball, endlos spielen", typ: 'A' }, { text: "Schnüffeln und die Welt erkunden", typ: 'B' }, { text: "Kuscheln auf dem Sofa", typ: 'C' }, { text: "Tricks lernen und Aufgaben lösen", typ: 'D' }, ]}, { frage: "Wie verhält er sich mit anderen Hunden?", antworten: [ { text: "Spielt sofort und wild mit", typ: 'A' }, { text: "Friendly, aber wählerisch", typ: 'B' }, { text: "Lieber zu zweit als in der Gruppe", typ: 'C' }, { text: "Beobachtet erstmal genau", typ: 'D' }, ]}, { frage: "Wie reagiert er auf Kommandos?", antworten: [ { text: "Macht alles — wenn er Lust hat 😅", typ: 'A' }, { text: "Gut, aber manchmal abgelenkt", typ: 'B' }, { text: "Sehr zuverlässig, will gefallen", typ: 'C' }, { text: "Präzise und fokussiert", typ: 'D' }, ]}, { frage: "Was passiert wenn du heimkommst?", antworten: [ { text: "Explosiver Freudentanz!", typ: 'A' }, { text: "Wedelt freudig, bleibt aber cool", typ: 'B' }, { text: "Kuschelt sich sofort an dich", typ: 'C' }, { text: "Bringt dir sein Lieblingsspielzeug", typ: 'D' }, ]}, { frage: "Wie ist er bei Geräuschen/Gewitter?", antworten: [ { text: "Interessiert sich dafür oder ignoriert es", typ: 'A' }, { text: "Schaut kurz, dann weiter", typ: 'B' }, { text: "Sucht Schutz bei dir", typ: 'C' }, { text: "Analysiert die Situation", typ: 'D' }, ]}, { frage: "Sein Verhältnis zu Kindern?", antworten: [ { text: "Liebt das wilde Spielen!", typ: 'A' }, { text: "Gut, aber auf seine Art", typ: 'B' }, { text: "Sanft und geduldig", typ: 'C' }, { text: "Vorsichtig, aber freundlich", typ: 'D' }, ]}, { frage: "Was macht er alleine zu Hause?", antworten: [ { text: "Schläft oder spielt mit Spielzeug", typ: 'A' }, { text: "Schaut aus dem Fenster", typ: 'B' }, { text: "Wartet sehnsüchtig auf dich", typ: 'C' }, { text: "Sucht sich Beschäftigung", typ: 'D' }, ]}, { frage: "Beim Gassigehen:", antworten: [ { text: "Zieht an der Leine — immer vorwärts!", typ: 'A' }, { text: "Läuft locker aber entdeckungsfreudig", typ: 'B' }, { text: "Bleibt gerne neben dir", typ: 'C' }, { text: "Systematisches Schnüffeln", typ: 'D' }, ]}, { frage: "Was sagt er über dich aus?", antworten: [ { text: "Mein Mensch hält mit mir mit!", typ: 'A' }, { text: "Gibt mir Freiheit und Abenteuer", typ: 'B' }, { text: "Mein bester Freund", typ: 'C' }, { text: "Versteht mich wirklich", typ: 'D' }, ]}, ]; // ---------------------------------------------------------- // TYPEN // ---------------------------------------------------------- const TYPEN = { A: { key: 'A', emoji: '🏔️', name: 'Der Abenteurer', desc: 'Immer vorwärts, immer mehr! Dein Hund lebt im Augenblick und liebt das Unbekannte.', staerken: ['Energiegeladen', 'Mutig', 'Lebensfroh'], aktivitaeten: [ { label: 'Routen', page: 'routes' }, { label: 'Karte', page: 'map' }, { label: 'Training', page: 'uebungen' }, ], aktivitaetLabels: ['Agility', 'Canicross', 'Lange Wanderungen', 'Nasenarbeit'], rassen: ['Husky', 'Malinois', 'Border Collie'], color: '#f97316', bg: 'linear-gradient(135deg, #f97316, #ea580c)', }, B: { key: 'B', emoji: '🌍', name: 'Der Entdecker', desc: 'Neugierig auf alles, aber mit Köpfchen. Dein Hund ist der perfekte Begleiter für jede Situation.', staerken: ['Anpassungsfähig', 'Sozial', 'Ausgeglichen'], aktivitaeten: [ { label: 'Karte', page: 'map' }, { label: 'Events', page: 'events' }, { label: 'Routen', page: 'routes' }, ], aktivitaetLabels: ['Mantrailing', 'Dummy-Training', 'Gassi-Treffen'], rassen: ['Labrador', 'Golden Retriever', 'Beagle'], color: '#0ea5e9', bg: 'linear-gradient(135deg, #0ea5e9, #0284c7)', }, C: { key: 'C', emoji: '🥰', name: 'Der Kuschler', desc: 'Verbundenheit über alles. Dein Hund liebt Menschen mehr als alles andere.', staerken: ['Loyal', 'Einfühlsam', 'Zuverlässig'], aktivitaeten: [ { label: 'Tagebuch', page: 'diary' }, { label: 'Training', page: 'uebungen' }, { label: 'Gesundheit', page: 'health' }, ], aktivitaetLabels: ['Trick-Training', 'Therapy-Dog-Ausbildung', 'Ruhige Spaziergänge'], rassen: ['Cavalier KCS', 'Bichon Frisé', 'Mops'], color: '#ec4899', bg: 'linear-gradient(135deg, #ec4899, #db2777)', }, D: { key: 'D', emoji: '🧠', name: 'Der Denker', desc: 'Stratege mit Seele. Dein Hund denkt bevor er handelt — und ist dabei brillant.', staerken: ['Intelligent', 'Fokussiert', 'Lernbegeistert'], aktivitaeten: [ { label: 'Übungen', page: 'uebungen' }, { label: 'Training', page: 'trainingsplaene' }, { label: 'Wiki', page: 'wiki' }, ], aktivitaetLabels: ['Zieltraining', 'Geruchsarbeit', 'Rally Obedience', 'Intelligenzspielzeug'], rassen: ['Poodle', 'Schäferhund', 'Rottweiler'], color: '#8b5cf6', bg: 'linear-gradient(135deg, #8b5cf6, #7c3aed)', }, }; // ---------------------------------------------------------- // LIFECYCLE // ---------------------------------------------------------- function init(container, appState) { _container = container; _appState = appState; _renderPage(); } function refresh() {} function onDogChange() {} // ---------------------------------------------------------- // RENDER EINSTIEG // ---------------------------------------------------------- function _renderPage() { // Gespeichertes Ergebnis aus localStorage? const saved = _loadResult(); if (saved) { _renderResult(TYPEN[saved.typ], saved.scores, true); } else { _renderIntro(); } } // ---------------------------------------------------------- // INTRO // ---------------------------------------------------------- function _renderIntro() { _container.innerHTML = `
🐾

Hunde-Persönlichkeitstest

10 Fragen — finde heraus welcher der 4 Persönlichkeitstypen deinen Hund am besten beschreibt!

${Object.values(TYPEN).map(t => `
${t.emoji}
${t.name}
`).join('')}
`; document.getElementById('quiz-start-btn').addEventListener('click', _startQuiz); } // ---------------------------------------------------------- // QUIZ STARTEN // ---------------------------------------------------------- function _startQuiz() { _current = 0; _scores = { A:0, B:0, C:0, D:0 }; _answers = []; _renderQuestion(); } // ---------------------------------------------------------- // FRAGE RENDERN // ---------------------------------------------------------- function _renderQuestion() { const q = FRAGEN[_current]; const pct = Math.round((_current / FRAGEN.length) * 100); _container.innerHTML = `
Frage ${_current + 1} von ${FRAGEN.length} ${pct}%

${q.frage}

${q.antworten.map((a, i) => ` `).join('')}
`; _container.querySelectorAll('.quiz-answer-btn').forEach(btn => { btn.addEventListener('click', () => _answerQuestion(btn.dataset.typ)); btn.addEventListener('mouseenter', () => { btn.style.borderColor = 'var(--c-primary)'; btn.style.background = 'var(--c-primary-subtle, rgba(var(--c-primary-rgb,59,130,246),.08))'; }); btn.addEventListener('mouseleave', () => { if (!btn.classList.contains('selected')) { btn.style.borderColor = 'var(--c-border)'; btn.style.background = 'var(--c-surface)'; } }); }); } // ---------------------------------------------------------- // ANTWORT VERARBEITEN // ---------------------------------------------------------- function _answerQuestion(typ) { _scores[typ]++; _answers.push(typ); _current++; if (_current < FRAGEN.length) { // Kurze Animation — zeige Auswahl kurz grün _renderQuestion(); } else { _calcAndShowResult(); } } // ---------------------------------------------------------- // AUSWERTUNG // ---------------------------------------------------------- function _calcAndShowResult() { // Mehrheits-Typ finden; bei Gleichstand letzter bestimmender Typ let maxScore = 0; let winner = _answers[_answers.length - 1]; // Fallback: letzte Antwort for (const [typ, score] of Object.entries(_scores)) { if (score > maxScore) { maxScore = score; winner = typ; } } // Bei Gleichstand: letzter in _answers der einen der Max-Score-Typen hat const maxTypes = Object.entries(_scores) .filter(([, s]) => s === maxScore) .map(([t]) => t); if (maxTypes.length > 1) { for (let i = _answers.length - 1; i >= 0; i--) { if (maxTypes.includes(_answers[i])) { winner = _answers[i]; break; } } } _saveResult(winner, _scores); _renderResult(TYPEN[winner], _scores, false); } // ---------------------------------------------------------- // ERGEBNIS RENDERN // ---------------------------------------------------------- function _renderResult(typ, scores, fromStorage) { const dogName = _appState?.activeDog?.name || 'dein Hund'; const shareText = `${dogName} ist ${typ.name} ${typ.emoji} — macht den Test auf ban.yaro.de!`; const scoreBars = Object.entries(scores) .sort(([,a],[,b]) => b - a) .map(([t, s]) => { const tp = TYPEN[t]; const pct = Math.round((s / FRAGEN.length) * 100); return `
${tp.emoji}
${s}/${FRAGEN.length}
`; }).join(''); _container.innerHTML = `
${typ.emoji}
Persönlichkeitstyp

${typ.name}

${typ.desc}

Stärken
${typ.staerken.map(s => ` ${s}`).join('')}
Empfohlene Aktivitäten
${typ.aktivitaetLabels.map(a => ` ${a}`).join('')}
${typ.aktivitaeten.map(a => ` `).join('')}
Typische Rassen
${typ.rassen.map(r => ` ${r}`).join('')}
Dein Profil
${scoreBars}
`; // Share document.getElementById('quiz-share-btn')?.addEventListener('click', async () => { if (navigator.share) { try { await navigator.share({ text: shareText, url: 'https://ban.yaro.de' }); } catch {} } else { await navigator.clipboard.writeText(shareText); UI.toast.success('In die Zwischenablage kopiert!'); } }); // Neustart document.getElementById('quiz-restart-btn')?.addEventListener('click', () => { localStorage.removeItem(LS_KEY); _startQuiz(); }); } // ---------------------------------------------------------- // LOCALSTORAGE // ---------------------------------------------------------- function _saveResult(typ, scores) { try { localStorage.setItem(LS_KEY, JSON.stringify({ typ, scores, ts: Date.now() })); } catch {} } function _loadResult() { try { const raw = localStorage.getItem(LS_KEY); if (!raw) return null; return JSON.parse(raw); } catch { return null; } } // ---------------------------------------------------------- // PUBLIC // ---------------------------------------------------------- return { init, refresh, onDogChange }; })();