Zuletzt bearbeitet vor 5 Stunden
von Mark Wagner

MediaWiki:Common.js: Unterschied zwischen den Versionen

Keine Kategorien vergebenBearbeiten
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(43 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
/* Das folgende JavaScript wird für alle Benutzer geladen. */
/**
* Entfernt das Wort „Fortsetzung“ aus allen SMW-Spalten-Headern (div.smw-column-header).
* Leg die Datei MediaWiki:Common.js (oder Discovery.js) an bzw. bearbeite sie:
*
* 1. Gehe als Admin auf Special:Edit/MediaWiki:Common.js
* 2. Füge diesen Code ans Ende ein und speichere.
* 3. Leere den Browser-Cache (STRG + F5), damit das neue JS geladen wird.
*/
mw.loader.using(['jquery'], function () {
mw.loader.using(['jquery'], function () {
     $(document).ready(function () {
     $(document).ready(function () {
         $('.smw-column-header').each(function () {
         $('.smw-column-header').each(function () {
Zeile 23: Zeile 15:
             }
             }
         });
         });
         $(function () {
         $(function () {
    $('<style>')
            $('<style>')
      .prop('type', 'text/css')
                .prop('type', 'text/css')
      .html(
                .html(
        '.breadcrumb-item { font-size: 17px !important; }' +
                    '.breadcrumb-item { font-size: 17px !important; }' +
        '.breadcrumb-nav { border-bottom: 2px solid #85bc20!important; margin-bottom: 20px !important; }'
                    '.breadcrumb-nav { border-bottom: 2px solid #85bc20!important; margin-bottom: 20px !important; }' +
      )
                    '.exit-intern-link { display: block; padding: 8px 10px; margin-bottom: 5px; background-color: #f0f0f0; border-radius: 4px; font-size: 14px; text-align: center; }' +
      .appendTo('head');
                    '.exit-intern-link a { color: #d9534f; text-decoration: none; font-weight: bold; }' +
});
                    '.exit-intern-link a:hover { text-decoration: underline; }'
});
                )
                .appendTo('head');
        });
    });
});
 
$(function () {
    $('<style>')
        .prop('type', 'text/css')
        .html(
            '.breadcrumb-item { font-size: 17px !important; }' +
            '.breadcrumb-nav { border-bottom: 2px solid #85bc20!important; margin-bottom: 20px !important; }' +
            '.exit-intern-link { display: block; padding: 8px 10px; margin-bottom: 5px; background-color: #f0f0f0; border-radius: 4px; font-size: 14px; text-align: center; }' +
            '.exit-intern-link a { color: #d9534f; text-decoration: none; font-weight: bold; }' +
            '.exit-intern-link a:hover { text-decoration: underline; }' +
            '.exit-arrow { margin-right: 5px; font-size: 16px; }'
        )
        .appendTo('head');
});
});
$(function() {
// Namespace-Link für Unterseiten-Panel mit MutationObserver
  // 1) Klick merken
(function() {
  $('body').on('click', 'a.mws-tree-item-label', function() {
    function updateSubpageHeader() {
    try {
        const header = document.getElementById('subpage-tree-pnl-head');
      window.name = JSON.stringify({ lastNav: this.getAttribute('href') });
       
    } catch (e) {}
        if (!header) {
  });
            return;
        }
       
        // Prüfen ob wir bereits modifiziert haben (Endlosschleife vermeiden)
        if (header.hasAttribute('data-intern-processed')) {
            return;
        }
       
        const namespace = mw.config.get('wgCanonicalNamespace');
        const namespaceName = namespace || 'Hauptseite';
       
        // Prüfen, ob "_intern" im Namespace-Namen vorkommt (case-insensitive)
        const hasIntern = namespace && namespace.toLowerCase().includes('_intern');
       
        // Link zur Namespace-Hauptseite erstellen
        let namespaceLink;
        if (namespace) {
            namespaceLink = `/${namespace}:Hauptseite`;
        } else {
            namespaceLink = '/Hauptseite';
        }


  // 2) Polling & Aufklappen + Inline‐Styling
        // HTML für den Header erstellen
  var attempts = 0,
        let headerHTML = '';
      interval = setInterval(function() {
       
    attempts++;
        // Wenn "_intern" im Namespace ist, zusätzlichen "Intern verlassen" Link hinzufügen
    var data = {};
        if (hasIntern) {
    try {
            const namespaceWithoutIntern = namespace.replace(/_intern/i, '');
      data = JSON.parse(window.name || '{}');
            const exitLink = `/wiki/${namespaceWithoutIntern}:Hauptseite`;
    } catch (e) {}
            headerHTML += `<div class="exit-intern-link"><a href="${exitLink}">Intern verlassen</a></div>`;
    var last = data.lastNav;
        }
    if (!last || attempts > 10) {
       
      clearInterval(interval);
        // Normalen Namespace-Link hinzufügen
      return;
        headerHTML += `<a href="/wiki${namespaceLink}" style="color: inherit; text-decoration: none;">${namespaceName}</a>`;
 
        // Header mit dem neuen HTML ersetzen
        header.innerHTML = headerHTML;
       
        // Markieren, dass wir diesen Header bereits bearbeitet haben
        header.setAttribute('data-intern-processed', 'true');
 
        // Hover-Effekt für den Namespace-Link hinzufügen
        const mainLink = header.querySelector('a[href*="' + namespaceLink + '"]');
        if (mainLink) {
            mainLink.addEventListener('mouseenter', function() {
                this.style.textDecoration = 'underline';
            });
            mainLink.addEventListener('mouseleave', function() {
                this.style.textDecoration = 'none';
            });
        }
     }
     }
     var $link = $('a.mws-tree-item-label[href="' + last + '"]');
 
    if ($link.length) {
    // MutationObserver einrichten
      clearInterval(interval);
     function setupObserver() {
      // Zweige aufklappen
        const targetNode = document.getElementById('subpage-tree-pnl-head');
      $link.parents('li.mws-tree-item').each(function() {
       
        var $exp = $(this).children('div').children('a.mws-tree-expander.collapsed');
        if (targetNode) {
        if ($exp.length) {
            // Einmal initial ausführen
          $exp.trigger('click');
            updateSubpageHeader();
           
            // Observer für zukünftige Änderungen
            const observer = new MutationObserver(function(mutations) {
                // Wenn der Header geändert wurde, unser Attribut entfernen und neu verarbeiten
                const header = document.getElementById('subpage-tree-pnl-head');
                if (header && !header.hasAttribute('data-intern-processed')) {
                    updateSubpageHeader();
                }
            });
           
            observer.observe(targetNode, {
                childList: true,
                subtree: true,
                characterData: true
            });
         }
         }
      });
      // Inline‐Styles setzen
      $link.css({
        'background-color': '#eef',
        'font-weight': 'bold',
        'color': '#000',
        'border-left': '3px solid #98A7C4',
        'padding-left': '0.5em'
      });
      // optional scrollen
      $('html, body').scrollTop($link.offset().top - 80);
     }
     }
  }, 300);
 
    // Nach dem Laden der Seite ausführen
    $(document).ready(function() {
        setTimeout(setupObserver, 100);
        setTimeout(setupObserver, 500);
        setTimeout(setupObserver, 1000);
    });
 
    // Auch nach AJAX-Updates ausführen
    $(document).ajaxComplete(function() {
        setTimeout(setupObserver, 100);
    });
 
    // MediaWiki Hook
    mw.hook('wikipage.content').add(function() {
        setTimeout(setupObserver, 100);
    });
})();
// Entferne "Hauptseite/" aus Linktexten
function cleanPageLinks() {
    // Alle Links finden, die "Hauptseite/" im Text haben
    const links = document.querySelectorAll('a[href*="Hauptseite/"]');
    links.forEach(function(link) {
        // Nur den sichtbaren Text ändern, nicht den href
        if (link.textContent.includes('Hauptseite/')) {
            link.textContent = link.textContent.replace('Hauptseite/', '');
        }
    });
}
 
// JavaScript nach dem Laden der Seite ausführen
$(document).ready(function() {
    cleanPageLinks();
});
 
// Auch nach AJAX-Updates ausführen (für dynamische Inhalte)
$(document).ajaxComplete(function() {
    cleanPageLinks();
});
 
$(function(){
    // In allen Category-Ausgaben: jede LI, die einen <a class="new"> enthält, entfernen
    $('.smw-columnlist-container a.new').each(function(){
        $(this).closest('li').remove();
    });
});
});
$(function(){
$(function(){
  // In allen Category-Ausgaben: jede LI, die einen <a class="new"> enthält, entfernen
    // 1. Rote Links raus (wie gehabt)
  $('.smw-columnlist-container a.new').each(function(){
    $('.smw-columnlist-container a.new').each(function(){
     $(this).closest('li').remove();
        $(this).closest('li').remove();
  });
    });
 
    // 2. Jetzt jede Buchstaben-Überschrift entfernen, deren Liste leer ist
     $('.smw-column-header').each(function(){
        var $header = $(this),
            $ul = $header.next('ul');
        if ($ul.length && $ul.children('li').length === 0) {
            $ul.remove();
            $header.remove();
        }
    });
});
});
// attachments immer in neuem Tab öffnen
(function () {
    // Hilfs-Funktion, die alle neuen Attachment-Links anpasst
    function updateAttachmentLinks() {
        // Alle Download-Links in der Datei-Liste
        $('.attachments-filelist a.oojsplus-data-gridWidget-url-button')
            .attr('target','_blank')
            .attr('rel','noopener noreferrer');
    }
    // beim Seiten-Load einmal ausführen
    $(updateAttachmentLinks);
    // und mit MutationObserver auf nachträglich geladene Links achten
    var container = document.querySelector('.attachments-filelist');
    if (container) {
        new MutationObserver(function (mutations) {
            updateAttachmentLinks();
        }).observe(container, {
            childList: true,
            subtree: true
        });
    }
})();
/* Startseiten-Menü: ohne Expander, #subpage-tree-pnl ausblenden, kein Einrücken unten */
(function (mw, $) {
    'use strict';
    function isMainView() {
        return mw.config.get('wgIsMainPage') && mw.config.get('wgAction') === 'view';
    }
    // NEUE Funktion: Prüft ob Benutzer angemeldet ist
    function isLoggedIn() {
        return !mw.user.isAnon();
    }
    function hideSubpageTreePanel($scope) {
        // Nur ausführen wenn auf Hauptseite UND angemeldet
        if (!isMainView() || !isLoggedIn()) return;
        // global (nur auf Startseite, weil Funktion nur hier läuft)
        mw.util.addCSS('#subpage-tree-pnl{display:none!important;}');
        // sofort im aktuellen/neu geladenen Bereich
        ($scope || $(document)).find('#subpage-tree-pnl').hide().attr('aria-hidden', 'true');
    }
    function injectHomeMenu($root) {
        // Nur ausführen wenn auf Hauptseite UND angemeldet
        if (!isMainView() || !isLoggedIn()) return;
        if (document.getElementById('home-static-menu')) return; // Duplikate vermeiden
        var $container = ($root || $(document)).find('#sb-pri-cnt:visible').last();
        if (!$container.length) return;
        const menuHtml = `<div id="home-static-menu" class="home-static-menu">
            <div class="enhanced-sidebar-cnt">
                <div id="9a659-pnl" class="card w-100 bg-transp tree-component test">
                    <div id="9a659-head" class="card-header menu-title">Themen</div>
                    <ul id="9a659-menu" class="mws-tree root w-100 bg-transp" role="tree" aria-labelledby="9a659-head" tabindex="0">
                        <li id="43568" class="mws-tree-item internal" role="treeitem">
                            <div><a id="43568-label" class="mws-tree-item-label" href="/wiki/Verein:Hauptseite">Verein</a></div>
                        </li>
                        <li id="12180" class="mws-tree-item internal" role="treeitem">
                            <div><a id="12180-label" class="mws-tree-item-label" href="/wiki/Arbeitsorganisation:Hauptseite">Arbeitsorganisation</a></div>
                        </li>
                        <li id="94668" class="mws-tree-item internal" role="treeitem">
                            <div><a id="94668-label" class="mws-tree-item-label" href="/wiki/Angebote:Hauptseite">Angebote</a></div>
                        </li>
                        <li id="16759" class="mws-tree-item internal" role="treeitem">
                            <div><a id="16759-label" class="mws-tree-item-label" href="/wiki/Gruppenarbeit:Hauptseite">Gruppenarbeit</a></div>
                        </li>
                        <li id="20ee3" class="mws-tree-item internal" role="treeitem">
                            <div><a id="20ee3-label" class="mws-tree-item-label" href="/wiki/Mitarbeit:Hauptseite">Mitarbeit</a></div>
                        </li>
                        <li id="d5272" class="mws-tree-item internal" role="treeitem">
                            <div><a id="d5272-label" class="mws-tree-item-label" href="/wiki/Kommunikation:Hauptseite">Kommunikation</a></div>
                        </li>
                        <li id="48945" class="mws-tree-item internal" role="treeitem">
                            <div><a id="48945-label" class="mws-tree-item-label" href="/wiki/QM:Hauptseite">QM</a></div>
                        </li>
                        <li id="27eea" class="mws-tree-item internal" role="treeitem">
                            <div><a id="27eea-label" class="mws-tree-item-label" href="/wiki/Mitglieder:Hauptseite">Mitglieder</a></div>
                        </li>
                        <li id="3f70b" class="mws-tree-item internal" role="treeitem">
                            <div><a id="3f70b-label" class="mws-tree-item-label" href="/wiki/wikiHilfe:Anleitung">wikiHilfe</a></div>
                        </li>
                    </ul>
                </div>
            </div>
        </div>`;
        $container.append(menuHtml);
        // Safety: Falls andere Skripte Expander nachträglich hinzufügen
        $('#home-static-menu .mws-tree-expander').remove();
        // Einrückung Top-Level neutralisieren (nur in unserem Menü)
        mw.util.addCSS(`
            #home-static-menu #9a659-menu {
                padding-left: 0 !important;
                margin-left: 0 !important;
            }
            #home-static-menu #9a659-menu > li {
                margin-left: 0 !important;
            }
            #home-static-menu #9a659-menu > li > div {
                padding-left: 0 !important;
                margin-left: 0 !important;
            }
            #home-static-menu #9a659-menu > li .mws-tree-item-label {
                padding-left: 0 !important;
                margin-left: 0 !important;
            }
        `);
    }
    // DOM ready
    $(function () {
        injectHomeMenu();
        hideSubpageTreePanel();
    });
    // Dynamisch nachgeladene Inhalte (Discovery, Ajax, Tabs)
    mw.hook('wikipage.content').add(function ($content) {
        injectHomeMenu($content);
        hideSubpageTreePanel($content);
    });
    // Fallback, falls #sb-pri-cnt später kommt
    var tries = 0, max = 10;
    var iv = setInterval(function () {
        if (document.getElementById('sb-pri-cnt') || ++tries >= max) {
            clearInterval(iv);
            injectHomeMenu();
            hideSubpageTreePanel();
        }
    }, 300);
})(mediaWiki, jQuery);

Aktuelle Version vom 6. November 2025, 15:54 Uhr

mw.loader.using(['jquery'], function () {

    $(document).ready(function () {
        $('.smw-column-header').each(function () {
            // aktuellen HTML-Inhalt holen
            var html = $(this).html();
            // "Fortsetzung" entfernen, Leerzeichen ggf. bereinigen
            var newHtml = html.replace(/Fortsetzung/g, '').trim();
            // falls nach dem Entfernen gar kein Text übrig ist, komplette Header-Box ausblenden:
            if (newHtml === '') {
                $(this).hide();
            } else {
                // ansonsten nur den Text überschreiben, sodass z. B. "B Fortsetzung" → "B" wird
                $(this).html(newHtml);
            }
        });

        $(function () {
            $('<style>')
                .prop('type', 'text/css')
                .html(
                    '.breadcrumb-item { font-size: 17px !important; }' +
                    '.breadcrumb-nav { border-bottom: 2px solid #85bc20!important; margin-bottom: 20px !important; }' +
                    '.exit-intern-link { display: block; padding: 8px 10px; margin-bottom: 5px; background-color: #f0f0f0; border-radius: 4px; font-size: 14px; text-align: center; }' +
                    '.exit-intern-link a { color: #d9534f; text-decoration: none; font-weight: bold; }' +
                    '.exit-intern-link a:hover { text-decoration: underline; }'
                )
                .appendTo('head');
        });
    });
});

$(function () {
    $('<style>')
        .prop('type', 'text/css')
        .html(
            '.breadcrumb-item { font-size: 17px !important; }' +
            '.breadcrumb-nav { border-bottom: 2px solid #85bc20!important; margin-bottom: 20px !important; }' +
            '.exit-intern-link { display: block; padding: 8px 10px; margin-bottom: 5px; background-color: #f0f0f0; border-radius: 4px; font-size: 14px; text-align: center; }' +
            '.exit-intern-link a { color: #d9534f; text-decoration: none; font-weight: bold; }' +
            '.exit-intern-link a:hover { text-decoration: underline; }' +
            '.exit-arrow { margin-right: 5px; font-size: 16px; }'
        )
        .appendTo('head');
});
// Namespace-Link für Unterseiten-Panel mit MutationObserver
(function() {
    function updateSubpageHeader() {
        const header = document.getElementById('subpage-tree-pnl-head');
        
        if (!header) {
            return;
        }
        
        // Prüfen ob wir bereits modifiziert haben (Endlosschleife vermeiden)
        if (header.hasAttribute('data-intern-processed')) {
            return;
        }
        
        const namespace = mw.config.get('wgCanonicalNamespace');
        const namespaceName = namespace || 'Hauptseite';
        
        // Prüfen, ob "_intern" im Namespace-Namen vorkommt (case-insensitive)
        const hasIntern = namespace && namespace.toLowerCase().includes('_intern');
        
        // Link zur Namespace-Hauptseite erstellen
        let namespaceLink;
        if (namespace) {
            namespaceLink = `/${namespace}:Hauptseite`;
        } else {
            namespaceLink = '/Hauptseite';
        }

        // HTML für den Header erstellen
        let headerHTML = '';
        
        // Wenn "_intern" im Namespace ist, zusätzlichen "Intern verlassen" Link hinzufügen
        if (hasIntern) {
            const namespaceWithoutIntern = namespace.replace(/_intern/i, '');
            const exitLink = `/wiki/${namespaceWithoutIntern}:Hauptseite`;
            headerHTML += `<div class="exit-intern-link"><a href="${exitLink}">Intern verlassen</a></div>`;
        }
        
        // Normalen Namespace-Link hinzufügen
        headerHTML += `<a href="/wiki${namespaceLink}" style="color: inherit; text-decoration: none;">${namespaceName}</a>`;

        // Header mit dem neuen HTML ersetzen
        header.innerHTML = headerHTML;
        
        // Markieren, dass wir diesen Header bereits bearbeitet haben
        header.setAttribute('data-intern-processed', 'true');

        // Hover-Effekt für den Namespace-Link hinzufügen
        const mainLink = header.querySelector('a[href*="' + namespaceLink + '"]');
        if (mainLink) {
            mainLink.addEventListener('mouseenter', function() {
                this.style.textDecoration = 'underline';
            });
            mainLink.addEventListener('mouseleave', function() {
                this.style.textDecoration = 'none';
            });
        }
    }

    // MutationObserver einrichten
    function setupObserver() {
        const targetNode = document.getElementById('subpage-tree-pnl-head');
        
        if (targetNode) {
            // Einmal initial ausführen
            updateSubpageHeader();
            
            // Observer für zukünftige Änderungen
            const observer = new MutationObserver(function(mutations) {
                // Wenn der Header geändert wurde, unser Attribut entfernen und neu verarbeiten
                const header = document.getElementById('subpage-tree-pnl-head');
                if (header && !header.hasAttribute('data-intern-processed')) {
                    updateSubpageHeader();
                }
            });
            
            observer.observe(targetNode, {
                childList: true,
                subtree: true,
                characterData: true
            });
        }
    }

    // Nach dem Laden der Seite ausführen
    $(document).ready(function() {
        setTimeout(setupObserver, 100);
        setTimeout(setupObserver, 500);
        setTimeout(setupObserver, 1000);
    });

    // Auch nach AJAX-Updates ausführen
    $(document).ajaxComplete(function() {
        setTimeout(setupObserver, 100);
    });

    // MediaWiki Hook
    mw.hook('wikipage.content').add(function() {
        setTimeout(setupObserver, 100);
    });
})();
// Entferne "Hauptseite/" aus Linktexten
function cleanPageLinks() {
    // Alle Links finden, die "Hauptseite/" im Text haben
    const links = document.querySelectorAll('a[href*="Hauptseite/"]');
    links.forEach(function(link) {
        // Nur den sichtbaren Text ändern, nicht den href
        if (link.textContent.includes('Hauptseite/')) {
            link.textContent = link.textContent.replace('Hauptseite/', '');
        }
    });
}

// JavaScript nach dem Laden der Seite ausführen
$(document).ready(function() {
    cleanPageLinks();
});

// Auch nach AJAX-Updates ausführen (für dynamische Inhalte)
$(document).ajaxComplete(function() {
    cleanPageLinks();
});

$(function(){
    // In allen Category-Ausgaben: jede LI, die einen <a class="new"> enthält, entfernen
    $('.smw-columnlist-container a.new').each(function(){
        $(this).closest('li').remove();
    });
});

$(function(){
    // 1. Rote Links raus (wie gehabt)
    $('.smw-columnlist-container a.new').each(function(){
        $(this).closest('li').remove();
    });

    // 2. Jetzt jede Buchstaben-Überschrift entfernen, deren Liste leer ist
    $('.smw-column-header').each(function(){
        var $header = $(this),
            $ul = $header.next('ul');
        if ($ul.length && $ul.children('li').length === 0) {
            $ul.remove();
            $header.remove();
        }
    });
});

// attachments immer in neuem Tab öffnen
(function () {
    // Hilfs-Funktion, die alle neuen Attachment-Links anpasst
    function updateAttachmentLinks() {
        // Alle Download-Links in der Datei-Liste
        $('.attachments-filelist a.oojsplus-data-gridWidget-url-button')
            .attr('target','_blank')
            .attr('rel','noopener noreferrer');
    }

    // beim Seiten-Load einmal ausführen
    $(updateAttachmentLinks);

    // und mit MutationObserver auf nachträglich geladene Links achten
    var container = document.querySelector('.attachments-filelist');
    if (container) {
        new MutationObserver(function (mutations) {
            updateAttachmentLinks();
        }).observe(container, {
            childList: true,
            subtree: true
        });
    }
})();

/* Startseiten-Menü: ohne Expander, #subpage-tree-pnl ausblenden, kein Einrücken unten */
(function (mw, $) {
    'use strict';

    function isMainView() {
        return mw.config.get('wgIsMainPage') && mw.config.get('wgAction') === 'view';
    }

    // NEUE Funktion: Prüft ob Benutzer angemeldet ist
    function isLoggedIn() {
        return !mw.user.isAnon();
    }

    function hideSubpageTreePanel($scope) {
        // Nur ausführen wenn auf Hauptseite UND angemeldet
        if (!isMainView() || !isLoggedIn()) return;

        // global (nur auf Startseite, weil Funktion nur hier läuft)
        mw.util.addCSS('#subpage-tree-pnl{display:none!important;}');

        // sofort im aktuellen/neu geladenen Bereich
        ($scope || $(document)).find('#subpage-tree-pnl').hide().attr('aria-hidden', 'true');
    }

    function injectHomeMenu($root) {
        // Nur ausführen wenn auf Hauptseite UND angemeldet
        if (!isMainView() || !isLoggedIn()) return;

        if (document.getElementById('home-static-menu')) return; // Duplikate vermeiden

        var $container = ($root || $(document)).find('#sb-pri-cnt:visible').last();
        if (!$container.length) return;

        const menuHtml = `<div id="home-static-menu" class="home-static-menu">
            <div class="enhanced-sidebar-cnt">
                <div id="9a659-pnl" class="card w-100 bg-transp tree-component test">
                    <div id="9a659-head" class="card-header menu-title">Themen</div>
                    <ul id="9a659-menu" class="mws-tree root w-100 bg-transp" role="tree" aria-labelledby="9a659-head" tabindex="0">
                        <li id="43568" class="mws-tree-item internal" role="treeitem">
                            <div><a id="43568-label" class="mws-tree-item-label" href="/wiki/Verein:Hauptseite">Verein</a></div>
                        </li>
                        <li id="12180" class="mws-tree-item internal" role="treeitem">
                            <div><a id="12180-label" class="mws-tree-item-label" href="/wiki/Arbeitsorganisation:Hauptseite">Arbeitsorganisation</a></div>
                        </li>
                        <li id="94668" class="mws-tree-item internal" role="treeitem">
                            <div><a id="94668-label" class="mws-tree-item-label" href="/wiki/Angebote:Hauptseite">Angebote</a></div>
                        </li>
                        <li id="16759" class="mws-tree-item internal" role="treeitem">
                            <div><a id="16759-label" class="mws-tree-item-label" href="/wiki/Gruppenarbeit:Hauptseite">Gruppenarbeit</a></div>
                        </li>
                        <li id="20ee3" class="mws-tree-item internal" role="treeitem">
                            <div><a id="20ee3-label" class="mws-tree-item-label" href="/wiki/Mitarbeit:Hauptseite">Mitarbeit</a></div>
                        </li>
                        <li id="d5272" class="mws-tree-item internal" role="treeitem">
                            <div><a id="d5272-label" class="mws-tree-item-label" href="/wiki/Kommunikation:Hauptseite">Kommunikation</a></div>
                        </li>
                        <li id="48945" class="mws-tree-item internal" role="treeitem">
                            <div><a id="48945-label" class="mws-tree-item-label" href="/wiki/QM:Hauptseite">QM</a></div>
                        </li>
                        <li id="27eea" class="mws-tree-item internal" role="treeitem">
                            <div><a id="27eea-label" class="mws-tree-item-label" href="/wiki/Mitglieder:Hauptseite">Mitglieder</a></div>
                        </li>
                        <li id="3f70b" class="mws-tree-item internal" role="treeitem">
                            <div><a id="3f70b-label" class="mws-tree-item-label" href="/wiki/wikiHilfe:Anleitung">wikiHilfe</a></div>
                        </li>
                    </ul>
                </div>
            </div>
        </div>`;

        $container.append(menuHtml);

        // Safety: Falls andere Skripte Expander nachträglich hinzufügen
        $('#home-static-menu .mws-tree-expander').remove();

        // Einrückung Top-Level neutralisieren (nur in unserem Menü)
        mw.util.addCSS(`
            #home-static-menu #9a659-menu {
                padding-left: 0 !important;
                margin-left: 0 !important;
            }
            #home-static-menu #9a659-menu > li {
                margin-left: 0 !important;
            }
            #home-static-menu #9a659-menu > li > div {
                padding-left: 0 !important;
                margin-left: 0 !important;
            }
            #home-static-menu #9a659-menu > li .mws-tree-item-label {
                padding-left: 0 !important;
                margin-left: 0 !important;
            }
        `);
    }

    // DOM ready
    $(function () {
        injectHomeMenu();
        hideSubpageTreePanel();
    });

    // Dynamisch nachgeladene Inhalte (Discovery, Ajax, Tabs)
    mw.hook('wikipage.content').add(function ($content) {
        injectHomeMenu($content);
        hideSubpageTreePanel($content);
    });

    // Fallback, falls #sb-pri-cnt später kommt
    var tries = 0, max = 10;
    var iv = setInterval(function () {
        if (document.getElementById('sb-pri-cnt') || ++tries >= max) {
            clearInterval(iv);
            injectHomeMenu();
            hideSubpageTreePanel();
        }
    }, 300);

})(mediaWiki, jQuery);