Scoutbus Alltags-Assistent 🔎 Alle Familie Paare ♡ Nur Favoriten © Scoutbus · Alltags-Assistent · Paar & Familie.[tcb-script]/*** ====== Daten (20 Familie + 10 Paare) ====== ***/const BASE_DATA = [ {id:“fam-bett“,audience:“family“,title:“Kind rechtzeitig ins Bett bringen“,tags:[„Abend“,“Routine“,“Schlaf“],solutions:{ pragmatic:“Abendroutine mit festen Uhrzeiten: Zähneputzen – Geschichte – Licht aus.“, playful:“Speed-Pyjama: Wer zuerst im Schlafanzug ist, wählt die Geschichte.“, structured:“Timer + Familienkalender senden um 19:30 Erinnerung: Schlafenszeit.“ }}, {id:“fam-morgen“,audience:“family“,title:“Morgens rechtzeitig aus dem Haus“,tags:[„Morgen“,“PĂĽnktlichkeit“,“Schule“],solutions:{ pragmatic:“Kleidung, Snack und Tasche am Vorabend bereitlegen.“, playful:“Morgen-Checkliste als Punktejagd: 5 Sterne bis zum FrĂĽhstĂĽck.“, structured:“Fixer Ablauf (Anziehen → FrĂĽhstĂĽck → Zähne → Schuhe) mit Wochenbelohnung.“ }}, {id:“fam-hausaufgaben“,audience:“family“,title:“Hausaufgaben ohne Streit“,tags:[„Lernen“,“Nachmittag“,“Fokus“],solutions:{ pragmatic:“Fester Lernplatz ohne Ablenkungen.“, playful:“Aufgaben in kleine Missionen teilen, jede Mission kurz feiern.“, structured:“Pomodoro 25/5 mit max. 3 Blöcken – danach Freizeit.“ }}, {id:“fam-aufraeumen“,audience:“family“,title:“Kinderzimmer aufräumen“,tags:[„Ordnung“,“Routine“],solutions:{ pragmatic:“10-Minuten-Aufräumregel vor dem Schlafen.“, playful:“Musik + Stoppuhr: Aufräum-Battle.“, structured:“Kisten nach Kategorien; Plan hängt sichtbar am Schrank.“ }}, {id:“fam-screen“,audience:“family“,title:“Bildschirmzeit begrenzen“,tags:[„Medien“,“Grenzen“],solutions:{ pragmatic:“Tägliche Obergrenze (z. B. 45–60 Minuten).“, playful:“Spielzeit wird ĂĽber Punkte verdient (Lesen/Bewegen).“, structured:“Gerätezeiten per Kindersicherung automatisch sperren.“ }}, {id:“fam-essen“,audience:“family“,title:“Familienmahlzeiten ohne Drama“,tags:[„Essen“,“Familienzeit“],solutions:{ pragmatic:“2–3 einfache Auswahloptionen; kein Extrakochen.“, playful:“Koch-Kapitän: Heute bestimmt Kind X das GemĂĽse.“, structured:“WochenmenĂĽ am KĂĽhlschrank, Einkaufsliste synchronisiert.“ }}, {id:“fam-streit“,audience:“family“,title:“Streit zwischen Geschwistern schlichten“,tags:[„Konflikt“,“Geschwister“,“Kommunikation“],solutions:{ pragmatic:“Kurze Pause/Trennung, dann 2-Minuten-Gespräch.“, playful:“Rollentausch: Jeder vertritt 1 Minute die andere Sicht.“, structured:“Familienregel: Erst zuhören, dann entscheiden (Sanduhr).“ }}, {id:“fam-zaehne“,audience:“family“,title:“Abendliches Zähneputzen ohne Diskussion“,tags:[„Hygiene“,“Abend“,“Routine“],solutions:{ pragmatic:“2-Minuten-Timer/Sanduhr.“, playful:“Zahnputz-Song/App – High-Five am Ende.“, structured:“Sticker-Plan: 10 Sticker = kleine Belohnung.“ }}, {id:“fam-handy-essen“,audience:“family“,title:“Handy beim Essen“,tags:[„Medien“,“Essen“,“Regeln“],solutions:{ pragmatic:“Regel: Handys vor dem Essen in die Box.“, playful:“Wer zuerst zum Handy greift, macht den Abwasch.“, structured:“Handybox am Tisch; Regel hängt sichtbar daneben.“ }}, {id:“fam-auto“,audience:“family“,title:“Kind will nicht ins Auto“,tags:[„Unterwegs“,“Routine“],solutions:{ pragmatic:“Klare Ansage + kleine Belohnung nach Ankunft.“, playful:“Anschnall-Rennen: Gewinner wählt die Musik.“, structured:“Immer gleicher Ablauf: Jacke → Schuhe → Gurt (Piktogramm).“ }}, {id:“fam-ausflug“,audience:“family“,title:“Familienausflug läuft anders als geplant“,tags:[„Flexibilität“,“Wochenende“],solutions:{ pragmatic:“Plan B vorher benennen.“, playful:“Abenteuer-Tag: Wer findet den lustigsten Moment?“, structured:“Kinder in Planung einbeziehen (3 Optionen – gemeinsamer Vote).“ }}, {id:“fam-bad“,audience:“family“,title:“Kind will nicht duschen/baden“,tags:[„Hygiene“,“Routine“],solutions:{ pragmatic:“Feste Badetage + feste Zeiten.“, playful:“Badeente ruft / Lieblingslied als Dusch-Timer.“, structured:“Bad-Checkliste laminiert im Bad.“ }}, {id:“fam-regen“,audience:“family“,title:“Langeweile an Regentagen“,tags:[„Indoor“,“Kreativität“],solutions:{ pragmatic:“Spiele-/Bastelkiste griffbereit.“, playful:“Wer erfindet ein neues Spiel? BĂĽhne im Wohnzimmer.“, structured:“Wochenend-Ideenliste zum Abhaken.“ }}, {id:“fam-spielplatz“,audience:“family“,title:“Vom Spielplatz rechtzeitig nach Hause“,tags:[„RĂĽckkehr“,“Routine“],solutions:{ pragmatic:“10-Minuten-Ansage + Countdown.“, playful:“Raketenstart-Ritual: 5…4…3…“, structured:“Fester Heimkehrzeitpunkt täglich gleich.“ }}, {id:“fam-suesses“,audience:“family“,title:“Zu viele SĂĽĂźigkeiten“,tags:[„Ernährung“,“Grenzen“],solutions:{ pragmatic:“Tagesration in kleinem Glas.“, playful:“SĂĽĂźes-Gutscheine fĂĽr besondere Momente.“, structured:“Nur nach Mahlzeiten; Regel schriftlich und sichtbar.“ }}, {id:“fam-elternzeit“,audience:“family“,title:“Eltern brauchen Ruhezeit“,tags:[„SelbstfĂĽrsorge“,“Regeneration“],solutions:{ pragmatic:“Ansage: 20 Minuten Ruhe – danach gemeinsame Aktivität.“, playful:“Detektiv-Aufgabe im Kinderzimmer (leise Mission).“, structured:“Täglicher Rhythmus mit festen Elternpausen.“ }}, {id:“fam-fruehstueck“,audience:“family“,title:“Kind frĂĽhstĂĽckt morgens nicht“,tags:[„Morgen“,“Ernährung“],solutions:{ pragmatic:“Greifbares Mini-FrĂĽhstĂĽck (Banane, Joghurt, Riegel).“, playful:“Smoothie gemeinsam mixen (Name vergeben).“, structured:“Fixe FrĂĽhstĂĽckszeit am gleichen Platz.“ }}, {id:“fam-kleidung“,audience:“family“,title:“Kind verweigert Kleidung“,tags:[„Kleidung“,“Autonomie“],solutions:{ pragmatic:“Zwei Wahlmöglichkeiten vorgeben.“, playful:“Mini-Modenschau vorm Spiegel.“, structured:“Outfits fĂĽr die Woche gemeinsam vorbereiten.“ }}, {id:“fam-einkauf“,audience:“family“,title:“Einkaufen mit Kind stressig“,tags:[„Unterwegs“,“Planung“],solutions:{ pragmatic:“Eigene kleine Einkaufsliste fĂĽrs Kind.“, playful:“Suchspiel: Wer findet zuerst Banane/Haferflocken?“, structured:“Immer gleiche Route im Supermarkt + feste Reihenfolge.“ }}, {id:“fam-quality“,audience:“family“,title:“Zu wenig Familienzeit im Alltag“,tags:[„Familienzeit“,“Kalender“],solutions:{ pragmatic:“Fixe Familien-Quality-Time (z. B. So 18:00).“, playful:“Ritual: Filmabend/Pizzaabend im Wechsel.“, structured:“Gemeinsamer Kalender – Familienzeiten sind geschĂĽtzt.“ }}, /* Paare (10) */ {id:“couple-haushalt“,audience:“couple“,title:“Wer macht den Haushalt?“,tags:[„Haushalt“,“Aufgaben“],solutions:{ pragmatic:“To-do-Liste mit grober Aufteilung.“, playful:“Haushalts-Lotterie/MĂĽnzwurf bei Unklarheiten.“, structured:“Wöchentlicher Plan mit Verantwortlichkeiten.“ }}, {id:“couple-wochenende“,audience:“couple“,title:“Unterschiedliche Vorstellungen vom Wochenende“,tags:[„Freizeit“,“Planung“],solutions:{ pragmatic:“Abwechselnd plant jede Woche eine Person.“, playful:“Gemeinsame Ideenbox – blind ziehen.“, structured:“Kalender mit festen Slots fĂĽr beide WĂĽnsche.“ }}, {id:“couple-kleinigkeiten“,audience:“couple“,title:“Streit um Kleinigkeiten“,tags:[„Konflikt“,“Kommunikation“],solutions:{ pragmatic:“Kurz, konkret, ohne Vorwurf ansprechen.“, playful:“Sammelkiste-Challenge: Dinge dorthin statt diskutieren.“, structured:“Regel: Sofort erledigen oder in Sammelkiste – wöchentlicher Durchgang.“ }}, {id:“couple-naehe“,audience:“couple“,title:“Unterschiedlicher Wunsch nach Nähe/Zeit zu zweit“,tags:[„Beziehung“,“Zeit zu zweit“],solutions:{ pragmatic:“Feste Date-Night pro Woche.“, playful:“Ăśberraschungs-Date im Wechsel.“, structured:“Paarzeiten im Kalender blocken (nicht verschiebbar).“ }}, {id:“couple-kochen“,audience:“couple“,title:“Wer kocht / was wird gekocht?“,tags:[„Essen“,“Alltag“],solutions:{ pragmatic:“WochenmenĂĽ + Einkaufsliste.“, playful:“Masterchef: 1x pro Woche improvisiert jede Person.“, structured:“Kochplan mit abwechselnden Verantwortungen.“ }}, {id:“couple-schlaf“,audience:“couple“,title:“Unterschiedliche Schlafgewohnheiten“,tags:[„Schlaf“,“Alltag“],solutions:{ pragmatic:“Ohrstöpsel/Schlafmaske, leise Routinen.“, playful:“Gemeinsames Mini-Ritual vor dem Zubettgehen.“, structured:“2 Abende/Woche gleichzeitig ins Bett – fix.“ }}, {id:“couple-finanz“,audience:“couple“,title:“Finanzfragen: Sparen vs. Ausgeben“,tags:[„Finanzen“,“Planung“],solutions:{ pragmatic:“Gemeinsames Haushaltskonto + persönliche Budgets.“, playful:“Sparspiel: Erreichte Ziele = kleine Belohnung.“, structured:“Monatliches Geld-Gespräch mit festen Regeln.“ }}, {id:“couple-eifersucht“,audience:“couple“,title:“Eifersucht/Unsicherheit“,tags:[„Vertrauen“,“Kommunikation“],solutions:{ pragmatic:“Auslöser offen besprechen, konkrete Bitten formulieren.“, playful:“Wertschätzungs-Zettel (3 Dinge, die ich an dir mag).“, structured:“Ritual: Wöchentlich Dankbarkeit & BedĂĽrfnisse aussprechen.“ }}, {id:“couple-ordnung“,audience:“couple“,title:“Unterschiedliche Ordnungsvorlieben“,tags:[„Ordnung“,“Zonen“],solutions:{ pragmatic:“Gemeinschaftsbereiche ordentlich, persönliche Zonen frei.“, playful:“Aufräum-Battle mit Musik + Timer.“, structured:“Klare Raumverantwortungen; Review sonntags.“ }}, {id:“couple-romantik“,audience:“couple“,title:“Stress – zu wenig Romantik“,tags:[„Romantik“,“Alltag“,“Beziehung“],solutions:{ pragmatic:“Kleine Gesten (Kaffee, Kompliment, Umarmung).“, playful:“Romantik-Glas: Ideen ziehen und sofort umsetzen.“, structured:“Monatliches Candle-Dinner fest im Kalender.“ }},];/*** ====== Favoriten (LocalStorage) ====== ***/const FAV_KEY = „sb_family_assistant_favs_v1″; // nur Favoriten werden gespeichertlet FAVS = {};try{ FAVS = JSON.parse(localStorage.getItem(FAV_KEY)||“{}“)||{} }catch{ FAVS = {} }function saveFavs(){ try{ localStorage.setItem(FAV_KEY, JSON.stringify(FAVS)); }catch{} }/*** ====== State & Utils ====== ***/let QUERY = „“;let AUD = „all“; // all | family | couplelet TAGS = new Set();let SHOW_FAVS = false;const $ = sel => document.querySelector(sel);const $$ = sel => Array.from(document.querySelectorAll(sel));const normalize = s => (s||““).toLowerCase().normalize(„NFKD“).replace(/[u0300-u036f]/g,““);function updateURL(){ const p = new URLSearchParams(); if (QUERY) p.set(„q“, QUERY); if (AUD !== „all“) p.set(„aud“, AUD); if (TAGS.size) p.set(„tags“, Array.from(TAGS).join(„,“)); if (SHOW_FAVS) p.set(„favs“,“1″); const base = location.href.split(„#“)[0]; const hash = p.toString(); history.replaceState(null,““, hash ? base + „#“ + hash : base);}function restoreFromURL(){ const hash = location.hash.replace(/^#/,““); if(!hash) return; const p = new URLSearchParams(hash); QUERY = p.get(„q“) || „“; const aud = p.get(„aud“); AUD = (aud===“family“||aud===“couple“) ? aud : „all“; const t = (p.get(„tags“)||““).split(„,“).filter(Boolean); TAGS = new Set(t); SHOW_FAVS = p.get(„favs“)===“1″;}function allTags(){ const s = new Set(); BASE_DATA.forEach(d=>d.tags.forEach(t=>s.add(t))); return Array.from(s).sort((a,b)=>a.localeCompare(b,’de‘));}/*** ====== Render ====== ***/function render(){ $(„#searchInput“).value = QUERY; $$(„#audienceBar .chip“).forEach(b=>{ b.classList.toggle(„active“, b.dataset.aud===AUD || (AUD===“all“ && b.dataset.aud===“all“)); }); $(„#btnFavs“).classList.toggle(„active“, SHOW_FAVS); // Active filters const af = $(„#activeFilters“); af.innerHTML = „“; if (QUERY || TAGS.size || AUD!==“all“ || SHOW_FAVS){ af.style.display = „“; if (QUERY) af.append(pill(`Suche: “${QUERY}”`, ()=>{ QUERY=““; updateURL(); render(); })); if (AUD!==“all“) af.append(pill(`Zielgruppe: ${AUD===“family“?“Familie“:“Paare“}`, ()=>{ AUD=“all“; updateURL(); render(); })); if (SHOW_FAVS) af.append(pill(„Nur Favoriten“, ()=>{ SHOW_FAVS=false; updateURL(); render(); })); TAGS.forEach(t => af.append(pill(t, ()=>{ TAGS.delete(t); updateURL(); render(); }))); } else { af.style.display = „none“; } // Tags const tb = $(„#tagsBar“); tb.innerHTML = „“; allTags().forEach(t=>{ const btn = document.createElement(„button“); btn.className = „chip“+(TAGS.has(t)?“ active“:““); btn.textContent = t; btn.onclick = ()=>{ TAGS.has(t)?TAGS.delete(t):TAGS.add(t); updateURL(); render(); }; tb.append(btn); }); // Filtered list const nq = normalize(QUERY); const list = BASE_DATA.filter(item=>{ if (AUD!==“all“ && item.audience!==AUD) return false; if (SHOW_FAVS && !FAVS[item.id]) return false; if (TAGS.size && !Array.from(TAGS).every(t=>item.tags.includes(t))) return false; if (!nq) return true; const hay = `${item.title} ${item.tags.join(“ „)} ${item.solutions.pragmatic} ${item.solutions.playful} ${item.solutions.structured}`; return normalize(hay).includes(nq); }); const grid = $(„#grid“); grid.innerHTML = „“; list.forEach(item => grid.append(card(item))); if (!list.length){ const empty = document.createElement(„div“); empty.className=“muted“; empty.style.margin=“28px 6px“; empty.textContent=“Keine Treffer. Passe Suche, Tags oder Zielgruppe an.“; grid.append(empty); }}function pill(text, onX){ const d = document.createElement(„div“); d.className=“pill“; const b = document.createElement(„button“); b.className=“btn“; b.textContent=“âś•“; b.onclick = onX; d.append(document.createTextNode(text)); d.append(b); return d;}function card(item){ const c = document.createElement(„article“); c.className=“card“; const isFav = !!FAVS[item.id]; c.innerHTML = ` <header> <div style=“display:flex;justify-content:space-between;gap:10px;align-items:flex-start“> <div> <h3>${item.title}</h3> <div> <span>${item.audience===“family“?“Familie“:“Paare“}</span> ${item.tags.map(t=>`<span>${t}</span>`).join(„“)} </div> </div> <button title=“Favorit umschalten“ aria-label=“Favorit“>${isFav?“♥“:“♡“}</button> </div> </header> <div role=“tablist“ aria-label=“Lösungsstile“> <button data-v=“pragmatic“ role=“tab“>Pragmatisch</button> <button data-v=“playful“ role=“tab“>Spielerisch</button> <button data-v=“structured“ role=“tab“>Strukturiert</button> </div> <div> <div data-key=“pragmatic“>${escapeHTML(item.solutions.pragmatic)}</div> <div data-key=“playful“ style=“display:none“>${escapeHTML(item.solutions.playful)}</div> <div data-key=“structured“ style=“display:none“>${escapeHTML(item.solutions.structured)}</div> <div> <button data-act=“copyCurrent“>đź“‹ Aktuelle kopieren</button> <button data-act=“copyAll“>đź“‹ Alle 3 kopieren</button> <button data-act=“share“>đź”— Link teilen</button> </div> </div> `; const tabs = c.querySelectorAll(„.tab“); tabs.forEach(t=>{ t.onclick = ()=>{ tabs.forEach(x=>x.classList.remove(„active“)); t.classList.add(„active“); const v = t.dataset.v; c.querySelectorAll(„.content“).forEach(el=>{ el.style.display = (el.dataset.key===v)?““:“none“; }); }; }); c.querySelector(„.fav“).onclick = ()=>{ FAVS[item.id] = !FAVS[item.id]; saveFavs(); render(); }; c.querySelector(„[data-act=’copyCurrent‘]“).onclick = ()=>{ const v = […tabs].find(x=>x.classList.contains(„active“)).dataset.v; const map = {pragmatic:“Pragmatisch“,playful:“Spielerisch“,structured:“Strukturiert“}; const text = `đź’ˇ ${item.title}n${map[v]}: ${item.solutions[v]}`; navigator.clipboard.writeText(text); }; c.querySelector(„[data-act=’copyAll‘]“).onclick = ()=>{ const text = `đź’ˇ ${item.title}nnPragmatisch: ${item.solutions.pragmatic}nSpielerisch: ${item.solutions.playful}nStrukturiert: ${item.solutions.structured}`; navigator.clipboard.writeText(text); }; c.querySelector(„[data-act=’share‘]“).onclick = ()=>{ navigator.clipboard.writeText(location.href); }; return c;}function escapeHTML(s){return (s+““).replace(/[&<>“‚]/g,m=>({ „&“:“&“,“<„:“<“,“>“:“>“,“““:“"“,“‚“:“'“}[m]))}/*** ====== Events & Init ====== ***/document.getElementById(„year“).textContent = new Date().getFullYear();function restoreFromURLAndRender(){ restoreFromURL(); render(); }$(„#searchInput“).addEventListener(„input“, e=>{ QUERY = e.target.value; updateURL(); render(); });$$(„#audienceBar .chip“).forEach(b=>b.addEventListener(„click“, ()=>{ AUD = b.dataset.aud; updateURL(); render(); }));$(„#btnFavs“).onclick = ()=>{ SHOW_FAVS = !SHOW_FAVS; updateURL(); render(); };restoreFromURLAndRender();[/tcb-script]