PageSourceSearch

https://wandkind.de/bundles/cfcustomcart/start-v1.js?1790507818&cfv=20260927s6

js wandkind.de collected 2026-10-06 11:15:41 UTC 4,795 bytes, 113 lines download raw bytes

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.