PageSourceSearch

https://knigge-spirit.com/wp-content/plugins/knigge-spirit-cockpit-v3-lab/assets/js/variant-c.js?ver=1.71.1

js knigge-spirit.com collected 2026-10-07 05:25:59 UTC 6,171 bytes, 116 lines download raw bytes

1( function () {
2    'use strict';
3
4    function initVariantC() {
5        document.querySelectorAll( '[data-ksc3-vc-tabs]' ).forEach( function ( root ) {
6            var tabs = Array.prototype.slice.call( root.querySelectorAll( '[role="tab"][data-ksc3-vc-target]' ) );
7            var panels = Array.prototype.slice.call( root.querySelectorAll( '[data-ksc3-vc-panel]' ) );
8
9            function activate( name, moveFocus ) {
10                tabs.forEach( function ( tab ) {
11                    var active = tab.getAttribute( 'data-ksc3-vc-target' ) === name;
12                    tab.classList.toggle( 'ksc3-vc-is-active', active );
13                    tab.setAttribute( 'aria-selected', active ? 'true' : 'false' );
14                    tab.tabIndex = active ? 0 : -1;
15                    if ( active && moveFocus ) tab.focus();
16                } );
17                panels.forEach( function ( panel ) {
18                    panel.hidden = panel.getAttribute( 'data-ksc3-vc-panel' ) !== name;
19                } );
20            }
21
22            root.addEventListener( 'click', function ( event ) {
23                var trigger = event.target.closest( '[data-ksc3-vc-target]' );
24                if ( ! trigger || ! root.contains( trigger ) ) return;
25                var isTab = trigger.getAttribute( 'role' ) === 'tab';
26                activate( trigger.getAttribute( 'data-ksc3-vc-target' ), isTab );
27                // Kein Pill-Klick (z.B. Zähler „Kurse/Merkzettel/Termine" oder Kachel-Button):
28                // zum Pill-Menü hochscrollen, damit der geöffnete Reiter oben sichtbar ist.
29                if ( ! isTab ) {
30                    var pills = root.querySelector( '.ksc3-vc-pills' );
31                    if ( pills ) {
32                        var top = pills.getBoundingClientRect().top + window.pageYOffset - 100;
33                        window.scrollTo( { top: Math.max( 0, top ), behavior: 'smooth' } );
34                    }
35                }
36            } );
37            root.addEventListener( 'keydown', function ( event ) {
38                var current = event.target.closest( '[role="tab"]' );
39                if ( ! current || ( event.key !== 'ArrowLeft' && event.key !== 'ArrowRight' ) ) return;
40                event.preventDefault();
41                var index = tabs.indexOf( current );
42                var next = event.key === 'ArrowRight' ? ( index + 1 ) % tabs.length : ( index - 1 + tabs.length ) % tabs.length;
43                activate( tabs[ next ].getAttribute( 'data-ksc3-vc-target' ), true );
44            } );
45            /* Deep-Link auf eine Pille, für Schnellzugriff, Menü-Plugin und
46             * Hilfeseite: `?ks_panel=bookmarks` oder `#merkzettel`.
47             * CLIENTSEITIG ausgewertet, damit der WP-Rocket-Cache egal ist
48             * (serverseitig gelesene Query-Vars liefern sonst die gecachte
49             * Basisseite und der Link greift für Ausgeloggte nicht).
50             * Deutsche Aliase, damit die URL im Backend lesbar bleibt. */
51            var ALIAS = {
52                'merkzettel': 'bookmarks', 'gespeichert': 'bookmarks', 'bookmarks': 'bookmarks',
53                'kurse': 'courses', 'meine-kurse': 'courses', 'courses': 'courses',
54                'termine': 'events', 'meine-termine': 'events', 'events': 'events',
55                'lounge': 'lounge', 'community': 'lounge',
56                'uebersicht': 'overview', 'übersicht': 'overview', 'overview': 'overview'
57            };
58
59            function wanted() {
60                var v = '';
61                try {
62                    v = new URLSearchParams( window.location.search ).get( 'ks_panel' ) || '';
63                } catch ( e ) {}
64                if ( ! v && window.location.hash ) { v = window.location.hash.replace( /^#/, '' ); }
65                v = ( v || '' ).toLowerCase();
66                return ALIAS[ v ] || '';
67            }
68
69            function openFromUrl( scroll ) {
70                var name = wanted();
71                if ( ! name ) { return false; }
72                // Nur öffnen, wenn es die Pille auf dieser Seite wirklich gibt.
73                var exists = tabs.some( function ( t ) { return t.getAttribute( 'data-ksc3-vc-target' ) === name; } );
74                if ( ! exists ) { return false; }
75                activate( name, false );
76                if ( scroll ) {
77                    var pills = root.querySelector( '.ksc3-vc-pills' );
78                    if ( pills ) {
79                        var top = pills.getBoundingClientRect().top + window.pageYOffset - 100;
80                        window.scrollTo( { top: Math.max( 0, top ), behavior: 'smooth' } );
81                    }
82                }
83                return true;
84            }
85
86            if ( ! openFromUrl( true ) ) {
87                activate( 'overview', false );
88            }
89            // Klick auf denselben Link ohne Neuladen (Hash-Wechsel) ebenfalls beachten.
90            window.addEventListener( 'hashchange', function () { openFromUrl( true ); } );
91        } );
92    }
93
94    /* App-Hinweis-Banner (1.66.0): × klickt den Hinweis dauerhaft weg. Nonce + admin-ajax
95     * stehen als data-Attribute am Banner (kein wp_localize nötig). Erst optisch ausblenden
96     * (reaktiv), dann serverseitig als „weggeklickt" merken. */
97    function initAppHint() {
98        var el = document.querySelector( '.ksc3-vc-apphint' );
99        if ( ! el ) { return; }
100        var btn = el.querySelector( '[data-ksc3-apphint-close]' );
101        if ( ! btn ) { return; }
102        btn.addEventListener( 'click', function () {
103            el.hidden = true;
104            var ajax = el.getAttribute( 'data-ajax' );
105            var nonce = el.getAttribute( 'data-nonce' );
106            if ( ! ajax || ! nonce ) { return; }
107            var fd = new FormData();
108            fd.append( 'action', 'ksc3_app_hint_dismiss' );
109            fd.append( 'nonce', nonce );
110            try { fetch( ajax, { method: 'POST', credentials: 'same-origin', body: fd } ); } catch ( e ) {}
111        } );
112    }
113
114    if ( document.readyState === 'loading' ) document.addEventListener( 'DOMContentLoaded', function () { initVariantC(); initAppHint(); } );
115    else { initVariantC(); initAppHint(); }
116} )();

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.