Zum Inhalt springen

MediaWiki:Common.js: Unterschied zwischen den Versionen

Aus Pixopedia
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 6: Zeile 6:
     var href = '/darktest/toggle-switch.css';
     var href = '/darktest/toggle-switch.css';


    // Prüfen, ob schon geladen
     var existing = document.querySelector('link[rel="stylesheet"][href="' + href + '"]');
     var existing = document.querySelector('link[rel="stylesheet"][href="' + href + '"]');
     if (existing) return;
     if (existing) return;
Zeile 19: Zeile 18:
// Slider einbinden
// Slider einbinden
// =============
// =============
mw.loader.using( 'mediawiki.util', function () {
mw.loader.using('mediawiki.util', function () {
     if ( mw.config.get( 'skin' ) !== 'vector-2022' ) {
     if (mw.config.get('skin') !== 'vector-2022') {
         return;
         return;
     }
     }


    // Warten, bis der Header im DOM ist
     mw.hook('wikipage.content').add(function () {
     mw.hook( 'wikipage.content' ).add( function () {
         var header = document.querySelector('.vector-header');
         var header = document.querySelector( '.vector-header' );
         if (!header) return;
         if ( !header ) return;


         // Prüfen, ob der Slider schon existiert
         // Prüfen, ob der Slider schon existiert
         if ( document.getElementById( 'theme-toggle-checkbox' ) ) {
         if (document.getElementById('theme-toggle-checkbox')) {
             return;
             return;
         }
         }


        // Wrapper für den Slider
         var wrapper = document.createElement('div');
         var wrapper = document.createElement( 'div' );
         wrapper.className = 'vector-header-dark-toggle';
         wrapper.className = 'vector-header-dark-toggle';


Zeile 44: Zeile 41:
             + '</label>';
             + '</label>';


        // Am rechten Rand einfügen – möglichst nahe beim User-Menü
         var userMenu = header.querySelector('.vector-user-menu');
         var userMenu = header.querySelector( '.vector-user-menu' );
         if (userMenu && userMenu.parentNode) {
         if ( userMenu && userMenu.parentNode ) {
             userMenu.parentNode.insertBefore(wrapper, userMenu.nextSibling);
             userMenu.parentNode.insertBefore( wrapper, userMenu.nextSibling );
         } else {
         } else {
             // Fallback: ganz ans Ende des Headers
             header.appendChild(wrapper);
             header.appendChild( wrapper );
        }
 
        // Wenn der Slider neu eingefügt wurde, Theme-Status auf Checkbox anwenden
        if (typeof window.__applyThemeFromCurrent === 'function') {
             window.__applyThemeFromCurrent();
         }
         }
     });
     });
Zeile 74: Zeile 74:
     function applyTheme(theme) {
     function applyTheme(theme) {
         var checkbox = document.getElementById('theme-toggle-checkbox');
         var checkbox = document.getElementById('theme-toggle-checkbox');
         if (theme === 'dark') {
         if (theme === 'dark') {
             linkEl.href = DARK_CSS;
             linkEl.href = DARK_CSS;
Zeile 93: Zeile 94:
         current = prefersDark ? 'dark' : 'light';
         current = prefersDark ? 'dark' : 'light';
     }
     }
    // Helfer, damit der Slider nachträglich synchronisiert werden kann
    window.__applyThemeFromCurrent = function () {
        applyTheme(current);
    };
    // Direkt initial anwenden (falls Checkbox schon da ist, wird sie gesetzt)
     applyTheme(current);
     applyTheme(current);


    // Checkbox-Change anbinden, wenn DOM fertig ist
     mw.hook('wikipage.content').add(function () {
     mw.hook( 'wikipage.content' ).add( function () {
         var checkbox = document.getElementById('theme-toggle-checkbox');
         var checkbox = document.getElementById('theme-toggle-checkbox');
         if (!checkbox) return;
         if (!checkbox) return;


         checkbox.addEventListener('change', function () {
        // Doppelte Listener vermeiden
         checkbox.removeEventListener('change', checkbox.__themeChangeHandler || function () {});
 
        var handler = function () {
             current = checkbox.checked ? 'dark' : 'light';
             current = checkbox.checked ? 'dark' : 'light';
             localStorage.setItem(THEME_KEY, current);
             localStorage.setItem(THEME_KEY, current);
             applyTheme(current);
             applyTheme(current);
         }, { once: false });
         };
 
        checkbox.__themeChangeHandler = handler;
        checkbox.addEventListener('change', handler);
     });
     });
})();
})();

Version vom 13. Februar 2026, 17:09 Uhr

// ========================
// Toggle-Switch-CSS nachladen
// ========================

(function () {
    var href = '/darktest/toggle-switch.css';

    var existing = document.querySelector('link[rel="stylesheet"][href="' + href + '"]');
    if (existing) return;

    var link = document.createElement('link');
    link.rel = 'stylesheet';
    link.href = href;
    document.head.appendChild(link);
})();

// =============
// Slider einbinden
// =============
mw.loader.using('mediawiki.util', function () {
    if (mw.config.get('skin') !== 'vector-2022') {
        return;
    }

    mw.hook('wikipage.content').add(function () {
        var header = document.querySelector('.vector-header');
        if (!header) return;

        // Prüfen, ob der Slider schon existiert
        if (document.getElementById('theme-toggle-checkbox')) {
            return;
        }

        var wrapper = document.createElement('div');
        wrapper.className = 'vector-header-dark-toggle';

        wrapper.innerHTML = ''
            + '<label class="theme-toggle-switch">'
            + '  <input type="checkbox" id="theme-toggle-checkbox" />'
            + '  <span class="theme-toggle-slider"></span>'
            + '</label>';

        var userMenu = header.querySelector('.vector-user-menu');
        if (userMenu && userMenu.parentNode) {
            userMenu.parentNode.insertBefore(wrapper, userMenu.nextSibling);
        } else {
            header.appendChild(wrapper);
        }

        // Wenn der Slider neu eingefügt wurde, Theme-Status auf Checkbox anwenden
        if (typeof window.__applyThemeFromCurrent === 'function') {
            window.__applyThemeFromCurrent();
        }
    });
});

// ================
// Switcher als Modul
// ================
(function () {
    const THEME_KEY = 'custom-site-theme';
    const LIGHT_CSS = '/darktest/light-mode.css';
    const DARK_CSS  = '/darktest/dark-mode.css';

    let linkEl = document.getElementById('theme-css');
    if (!linkEl) {
        linkEl = document.createElement('link');
        linkEl.id = 'theme-css';
        linkEl.rel = 'stylesheet';
        linkEl.href = LIGHT_CSS;
        document.head.appendChild(linkEl);
    }

    function applyTheme(theme) {
        var checkbox = document.getElementById('theme-toggle-checkbox');

        if (theme === 'dark') {
            linkEl.href = DARK_CSS;
            document.documentElement.classList.add('theme-dark');
            document.documentElement.classList.remove('theme-light');
            if (checkbox) checkbox.checked = true;
        } else {
            linkEl.href = LIGHT_CSS;
            document.documentElement.classList.add('theme-light');
            document.documentElement.classList.remove('theme-dark');
            if (checkbox) checkbox.checked = false;
        }
    }

    let current = localStorage.getItem(THEME_KEY);
    if (!current) {
        const prefersDark = window.matchMedia &&
            window.matchMedia('(prefers-color-scheme: dark)').matches;
        current = prefersDark ? 'dark' : 'light';
    }

    // Helfer, damit der Slider nachträglich synchronisiert werden kann
    window.__applyThemeFromCurrent = function () {
        applyTheme(current);
    };

    // Direkt initial anwenden (falls Checkbox schon da ist, wird sie gesetzt)
    applyTheme(current);

    mw.hook('wikipage.content').add(function () {
        var checkbox = document.getElementById('theme-toggle-checkbox');
        if (!checkbox) return;

        // Doppelte Listener vermeiden
        checkbox.removeEventListener('change', checkbox.__themeChangeHandler || function () {});

        var handler = function () {
            current = checkbox.checked ? 'dark' : 'light';
            localStorage.setItem(THEME_KEY, current);
            applyTheme(current);
        };

        checkbox.__themeChangeHandler = handler;
        checkbox.addEventListener('change', handler);
    });
})();