1/*! WANDKIND Startseite v1 (27.09.2026, Paket /root/cf-start-20260927) â nur auf der neuen Startseite geladen (defer). 2 Aufgaben: Kundenstimmen-Slider (Nachtrag 3) und den Ratgeber (alle bisherigen Startseiten-Texte) nach â 14 Zeilen einklappen, Knopf âWeiterlesenâ / 3 âWeniger anzeigenâ (aria-expanded). Der Text steht immer vollständig im HTML; ohne JavaScript bleibt er offen. 4 Fokus im eingeklappten Teil (Tab auf einen Link darin) klappt auf. Keine Bibliotheken, alles in einer IIFE, defensiv. */ 5(function () { 6 'use strict'; 7 8 var LABEL_MORE = 'Weiterlesen'; 9 var LABEL_LESS = 'Weniger anzeigen'; 10 11 function setup(body) { 12 if (!body || body.getAttribute('data-cf-start-ready') === '1') { 13 return; 14 } 15 var id = body.getAttribute('id'); 16 var button = id ? document.querySelector('.cf-start-more[aria-controls="' + id + '"]') : null; 17 if (!button) { 18 return; 19 } 20 body.setAttribute('data-cf-start-ready', '1'); 21 var label = button.querySelector('.cf-start-more-txt') || button; 22 23 function isCollapsed() { 24 return body.classList.contains('is-collapsed'); 25 } 26 function setState(collapsed) { 27 body.classList.toggle('is-collapsed', collapsed); 28 button.setAttribute('aria-expanded', collapsed ? 'false' : 'true'); 29 label.textContent = collapsed ? LABEL_MORE : LABEL_LESS; 30 } 31 32 // nur einklappen, wenn es sich lohnt (mehr als ~1,5 à die eingeklappte Höhe) 33 body.classList.add('is-collapsed'); 34 var collapsedHeight = body.clientHeight; 35 body.classList.remove('is-collapsed'); 36 var fullHeight = body.scrollHeight; 37 if (!(collapsedHeight > 0) || fullHeight < collapsedHeight * 1.5) { 38 return; 39 } 40 setState(true); 41 button.hidden = false; 42 43 button.addEventListener('click', function () { 44 var collapse = !isCollapsed(); 45 setState(collapse); 46 if (collapse) { 47 var top = body.getBoundingClientRect().top; 48 if (top < 0 && typeof window.scrollBy === 'function') { 49 window.scrollBy(0, top - 120); 50 } 51 } 52 }); 53 body.addEventListener('focusin', function () { 54 if (isCollapsed()) { 55 setState(false); 56 } 57 }); 58 } 59 60 function init() { 61 try { 62 var bodies = document.querySelectorAll('.cf-start-v1 [data-cf-start-more]'); 63 for (var i = 0; i < bodies.length; i++) { 64 setup(bodies[i]); 65 } 66 setupReviews(); 67 } catch (e) { 68 /* nie die Seite stören */ 69 } 70 } 71 72 /* Nachtrag 3 (27.09.): Kundenstimmen-Slider â Pfeile blättern um eine Kartenbreite, sind am Anfang/Ende deaktiviert und 73 erscheinen nur, wenn es etwas zu blättern gibt. Wischen/Scrollen funktioniert auch ohne JavaScript. */ 74 function setupReviews() { 75 var list = document.getElementById('cf-start-revlist'); 76 var nav = document.querySelector('.cf-start-v1 [data-cf-start-revnav]'); 77 if (!list || !nav || nav.getAttribute('data-ready') === '1') { 78 return; 79 } 80 nav.setAttribute('data-ready', '1'); 81 var prev = nav.querySelector('[data-cf-start-rev="-1"]'); 82 var next = nav.querySelector('[data-cf-start-rev="1"]'); 83 function step() { 84 var card = list.querySelector('.cf-start-rev'); 85 var gap = parseFloat(window.getComputedStyle(list).columnGap || window.getComputedStyle(list).gap) || 16; 86 return card ? card.getBoundingClientRect().width + gap : list.clientWidth * 0.8; 87 } 88 function update() { 89 var max = list.scrollWidth - list.clientWidth; 90 nav.hidden = max <= 2; 91 if (prev) { prev.disabled = list.scrollLeft <= 2; } 92 if (next) { next.disabled = list.scrollLeft >= max - 2; } 93 } 94 function go(dir) { 95 list.scrollBy({ left: dir * step(), behavior: 'smooth' }); 96 } 97 if (prev) { prev.addEventListener('click', function () { go(-1); }); } 98 if (next) { next.addEventListener('click', function () { go(1); }); } 99 list.addEventListener('keydown', function (e) { 100 if (e.key === 'ArrowRight') { e.preventDefault(); go(1); } 101 if (e.key === 'ArrowLeft') { e.preventDefault(); go(-1); } 102 }); 103 list.addEventListener('scroll', update, { passive: true }); 104 window.addEventListener('resize', update); 105 update(); 106 } 107 108 if (document.readyState === 'loading') { 109 document.addEventListener('DOMContentLoaded', init); 110 } else { 111 init(); 112 } 113})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.