v4 Kontrollzentrum: 6 Länder (DE/AT/CH/NL/PL/DK), Währungs-aware, eBay/Retoure + Shop-Seriosität, Preis-Strip, Wetter-Banner (Open-Meteo)+Quellen, availability-first Home, Animationen, Länder-Scope, Preiswecker

This commit is contained in:
2026-06-28 06:47:30 +00:00
parent 600fcfe97d
commit 0915e0988b
16 changed files with 3655 additions and 129 deletions
+20
View File
@@ -27,6 +27,26 @@ import '../styles/global.css';
</nav>
</div></header>
<main><slot /></main>
<script is:inline>
(function(){
const rm = matchMedia('(prefers-reduced-motion: reduce)').matches;
const io = ('IntersectionObserver' in window) ? new IntersectionObserver((es)=>{
es.forEach(e=>{ if(e.isIntersecting){ e.target.classList.add('in'); io.unobserve(e.target); } });
},{rootMargin:'0px 0px -8% 0px'}) : null;
function wire(){
document.querySelectorAll('.reveal:not(.in)').forEach(el=> io? io.observe(el): el.classList.add('in'));
document.querySelectorAll('[data-count]:not([data-done])').forEach(el=>{
const target=+el.getAttribute('data-count'); if(isNaN(target))return; el.setAttribute('data-done','1');
if(rm){ el.textContent=target.toLocaleString('de-DE'); return; }
const dur=900, t0=performance.now();
(function step(t){ const p=Math.min(1,(t-t0)/dur); const v=Math.round(target*(1-Math.pow(1-p,3)));
el.textContent=v.toLocaleString('de-DE'); if(p<1)requestAnimationFrame(step); })(t0);
});
}
document.addEventListener('DOMContentLoaded',wire); wire();
window.kfAnim=wire;
})();
</script>
<footer class="site"><div class="wrap">
<p class="note"><strong>Transparenz:</strong> Einige Links sind Affiliate-Links kaufst du darüber, erhalten wir ggf. eine Provision, für dich ändert sich der Preis nicht. Empfehlungen basieren auf Nutzungsfall, Technik, Testquellen und redaktioneller Einschätzung nicht auf Provision.</p>
<p class="note">Preise und Verfügbarkeit ändern sich während Hitzewellen sehr schnell. Wir halten Daten so aktuell wie möglich, geben aber keine Garantie. Bitte beim Händler final prüfen.</p>