MediaWiki:Common.js: Unterschied zwischen den Versionen

Aus Phoenix-Larp Wiki

Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Zeile 31: Zeile 31:
   });
   });
});
});


mw.loader.using(['mediawiki.util']).done(function () {
mw.loader.using(['mediawiki.util']).done(function () {
   var bpMobile = '(max-width: 768px)';
   var bp = '(max-width: 768px)';
   var mql = window.matchMedia(bpMobile);
   var mql = window.matchMedia(bp);


   var originalParent, placeholder, moved = false;
  // Zustände merken
   var moved = false;
  var $srcBody = null;          // #p-usertools .mw-portlet-body (Quelle)
  var $dstBody = null;          // #p-usertools-mobile .mw-portlet-body (Ziel im Menü)
  var $movedItems = $();        // jQuery-Collection der verschobenen Kindelemente
  var placeholder = null;      // Platzhalter-Kommentar an ursprünglicher Position


   function ensurePortlet() {
   function getOrCreateDestination() {
     // Linke Spalte (Off-Canvas), darin sitzt bei Anisa die Navigation
     // Menü-Spalte (Off-Canvas) – in Anisa ist das die linke Spalte
     var $col = $('#column-navigation');
     var $col = $('#column-navigation');
     if (!$col.length) return null;
     if (!$col.length) return null;


     // Wenn noch kein Portlet für user-tools existiert: anlegen
     // Bevorzugt innerhalb von #mw-navigation arbeiten, wenn vorhanden
     var $portlet = $('#p-usertools');
    var $mwNav = $('#mw-navigation');
    var $container = $mwNav.length ? $mwNav : $col;
 
    // Ziel-Portlet anlegen, falls nicht vorhanden
     var $portlet = $('#p-usertools-mobile');
     if (!$portlet.length) {
     if (!$portlet.length) {
       $portlet = $('<div id="p-usertools" class="portal"></div>');
       $portlet = $(
      $portlet.append('<h3>Benutzer</h3><div class="body"></div>');
        '<div id="p-usertools-mobile" class="mw-portlet">' +
       // Sinnvoll weit oben einhängen – direkt unter Logo/Navigation
          '<h3>Benutzer</h3>' +
      // Entweder in #mw-navigation oder direkt ans Ende von #column-navigation
          '<div class="mw-portlet-body"></div>' +
      var $mwNav = $('#mw-navigation');
        '</div>'
      if ($mwNav.length) { $mwNav.prepend($portlet); }
      );
       else { $col.prepend($portlet); }
       // Sinnvoll weit oben einfügen
       $container.prepend($portlet);
     }
     }
     return $portlet.find('.body');
     return $portlet.find('.mw-portlet-body');
   }
   }


   function moveIntoMenu() {
   function moveBodyChildrenIntoMenu() {
     if (moved) return;
     if (moved) return;
    var $userTools = $('#user-tools');
    if (!$userTools.length) return;


     // Merke ursprünglichen Ort, um bei Desktop zurückzusetzen
     $srcBody = $('#p-usertools .mw-portlet-body');
     originalParent = $userTools.parent()[0];
     if (!$srcBody.length) return; // Quelle existiert nicht → nichts tun
     placeholder = document.createComment('user-tools-placeholder');
 
     $userTools.before(placeholder);
     $dstBody = getOrCreateDestination();
     if (!$dstBody || !$dstBody.length) return;


     var $target = ensurePortlet();
    // Kinder der Source-Body ermitteln (nur echte Kindelemente, Whitespace vermeiden)
     if (!$target) return;
     var children = $srcBody.contents().filter(function () {
      // Knoten: ELEMENT_NODE (1) oder Text mit sichtbarem Inhalt
      return this.nodeType === 1 || (this.nodeType === 3 && this.nodeValue.trim().length > 0);
    });
     if (!children.length) return; // nichts zu verschieben
 
    // Platzhalter an der Originalposition, um die spätere Rückkehr zu erleichtern
    placeholder = document.createComment('p-usertools-body-placeholder');
    $srcBody[0].appendChild(placeholder);
 
    // Inhalte abklemmen und ins Ziel hängen (nicht klonen, Zustände behalten)
    $movedItems = $(children).detach();
    $dstBody.append($movedItems);


    // Verschieben (nicht klonen, damit Zustände/Links konsistent bleiben)
    $userTools.appendTo($target);
     moved = true;
     moved = true;
    // ARIA/Erreichbarkeit
    $userTools.attr({
      'role': 'navigation',
      'aria-label': 'Benutzerwerkzeuge'
    });
   }
   }


   function moveBackToHeader() {
   function moveBackToOriginalBody() {
     if (!moved) return;
     if (!moved) return;
     var $userTools = $('#user-tools');
     if (!$srcBody || !$srcBody.length || !$movedItems.length) {
    if (!$userTools.length || !placeholder) return;
      // Failsafe: Reset interner Flags
      moved = false;
      $movedItems = $();
      placeholder = null;
      return;
    }
 
    // Zurück in die ursprüngliche Body
    $movedItems.detach().appendTo($srcBody);
 
    // Ziel-Portlet optional aufräumen, wenn leer
    if ($dstBody && $dstBody.length && !$dstBody.children().length) {
      var $portlet = $dstBody.closest('#p-usertools-mobile');
      if ($portlet.length) $portlet.remove();
    }
 
    // Platzhalter entfernen
    if (placeholder && placeholder.parentNode) {
      placeholder.parentNode.removeChild(placeholder);
    }


     // Zurück an die ursprüngliche Position
     // Reset
     $(placeholder).after($userTools);
     moved = false;
     $(placeholder).remove();
     $movedItems = $();
     placeholder = null;
     placeholder = null;
     moved = false;
     $dstBody = null;
   }
   }


   function apply() {
   function apply() {
     if (mql.matches) moveIntoMenu();
     if (mql.matches) {
     else moveBackToHeader();
      // Mobile → nur Body-Inhalte verschieben
      moveBodyChildrenIntoMenu();
     } else {
      // Desktop → zurückschieben
      moveBackToOriginalBody();
    }
   }
   }


   // Erster Lauf + bei Breakpoint-Wechsel
   // initial und bei Breakpoint-Wechsel
   apply();
   apply();
   if (mql.addEventListener) mql.addEventListener('change', apply);
   if (mql.addEventListener) mql.addEventListener('change', apply);
   else mql.addListener(apply); // ältere Browser
   else mql.addListener(apply);


   // Failsafe: bei Artikel-/Ajax-Navigation erneut prüfen
   // Bei AJAX/Soft-Navigation (z. B. nach Seitenwechsel per PJAX) erneut anwenden
   mw.hook('wikipage.content').add(apply);
   mw.hook('wikipage.content').add(apply);
});
});

Version vom 9. Oktober 2025, 08:46 Uhr

/* Das folgende JavaScript wird für alle Benutzer geladen. */
mw.loader.using(['mediawiki.util']).done(function () {
  // Nur auf schmalen Screens aktiv
  if (!window.matchMedia('(max-width: 768px)').matches) return;

  // Burger-Button einfügen (mit ARIA)
  var $btn = $('<button class="mw-burger" aria-label="Menü" aria-controls="column-navigation" aria-expanded="false"><span></span></button>');
  $('body').append($btn);

  // Overlay zum Schließen
  var $overlay = $('<div class="nav-overlay" tabindex="-1" aria-hidden="true"></div>');
  $('body').append($overlay);

  function closeMenu() {
    $('body').removeClass('nav-open');
    $btn.attr('aria-expanded', 'false');
  }
  function toggleMenu() {
    var open = !$('body').hasClass('nav-open');
    $('body').toggleClass('nav-open', open);
    $btn.attr('aria-expanded', String(open));
  }

  $btn.on('click', toggleMenu);
  $overlay.on('click', closeMenu);
  $(document).on('keydown', function (e) { if (e.key === 'Escape') closeMenu(); });

  // Schließt das Menü, wenn Viewport wieder breit wird
  window.matchMedia('(min-width: 769px)').addEventListener('change', function (mql) {
    if (mql.matches) closeMenu();
  });
});





mw.loader.using(['mediawiki.util']).done(function () {
  var bp = '(max-width: 768px)';
  var mql = window.matchMedia(bp);

  // Zustände merken
  var moved = false;
  var $srcBody = null;          // #p-usertools .mw-portlet-body (Quelle)
  var $dstBody = null;          // #p-usertools-mobile .mw-portlet-body (Ziel im Menü)
  var $movedItems = $();        // jQuery-Collection der verschobenen Kindelemente
  var placeholder = null;       // Platzhalter-Kommentar an ursprünglicher Position

  function getOrCreateDestination() {
    // Menü-Spalte (Off-Canvas) – in Anisa ist das die linke Spalte
    var $col = $('#column-navigation');
    if (!$col.length) return null;

    // Bevorzugt innerhalb von #mw-navigation arbeiten, wenn vorhanden
    var $mwNav = $('#mw-navigation');
    var $container = $mwNav.length ? $mwNav : $col;

    // Ziel-Portlet anlegen, falls nicht vorhanden
    var $portlet = $('#p-usertools-mobile');
    if (!$portlet.length) {
      $portlet = $(
        '<div id="p-usertools-mobile" class="mw-portlet">' +
          '<h3>Benutzer</h3>' +
          '<div class="mw-portlet-body"></div>' +
        '</div>'
      );
      // Sinnvoll weit oben einfügen
      $container.prepend($portlet);
    }
    return $portlet.find('.mw-portlet-body');
  }

  function moveBodyChildrenIntoMenu() {
    if (moved) return;

    $srcBody = $('#p-usertools .mw-portlet-body');
    if (!$srcBody.length) return; // Quelle existiert nicht → nichts tun

    $dstBody = getOrCreateDestination();
    if (!$dstBody || !$dstBody.length) return;

    // Kinder der Source-Body ermitteln (nur echte Kindelemente, Whitespace vermeiden)
    var children = $srcBody.contents().filter(function () {
      // Knoten: ELEMENT_NODE (1) oder Text mit sichtbarem Inhalt
      return this.nodeType === 1 || (this.nodeType === 3 && this.nodeValue.trim().length > 0);
    });
    if (!children.length) return; // nichts zu verschieben

    // Platzhalter an der Originalposition, um die spätere Rückkehr zu erleichtern
    placeholder = document.createComment('p-usertools-body-placeholder');
    $srcBody[0].appendChild(placeholder);

    // Inhalte abklemmen und ins Ziel hängen (nicht klonen, Zustände behalten)
    $movedItems = $(children).detach();
    $dstBody.append($movedItems);

    moved = true;
  }

  function moveBackToOriginalBody() {
    if (!moved) return;
    if (!$srcBody || !$srcBody.length || !$movedItems.length) {
      // Failsafe: Reset interner Flags
      moved = false;
      $movedItems = $();
      placeholder = null;
      return;
    }

    // Zurück in die ursprüngliche Body
    $movedItems.detach().appendTo($srcBody);

    // Ziel-Portlet optional aufräumen, wenn leer
    if ($dstBody && $dstBody.length && !$dstBody.children().length) {
      var $portlet = $dstBody.closest('#p-usertools-mobile');
      if ($portlet.length) $portlet.remove();
    }

    // Platzhalter entfernen
    if (placeholder && placeholder.parentNode) {
      placeholder.parentNode.removeChild(placeholder);
    }

    // Reset
    moved = false;
    $movedItems = $();
    placeholder = null;
    $dstBody = null;
  }

  function apply() {
    if (mql.matches) {
      // Mobile → nur Body-Inhalte verschieben
      moveBodyChildrenIntoMenu();
    } else {
      // Desktop → zurückschieben
      moveBackToOriginalBody();
    }
  }

  // initial und bei Breakpoint-Wechsel
  apply();
  if (mql.addEventListener) mql.addEventListener('change', apply);
  else mql.addListener(apply);

  // Bei AJAX/Soft-Navigation (z. B. nach Seitenwechsel per PJAX) erneut anwenden
  mw.hook('wikipage.content').add(apply);
});