Diferencia entre revisiones de «MediaWiki:Vector.js»

De Tenarius RO Wiki
Ir a la navegación Ir a la búsqueda
 
Sin resumen de edición
 
Línea 1: Línea 1:
/* Todo código JavaScript escrito aquí se cargará para todos los usuarios de la apariencia Vector */
/* ==========================================================
/* ==========================================================
TENARIUS RO - BOTON MENU MOVIL SIDEBAR
TENARIUS RO - MENU MOVIL SIDEBAR CORREGIDO
Pegar en MediaWiki:Vector.js
Pegar en MediaWiki:Vector.js
Este JS:
- Detecta celular/tablet.
- Agrega body.tenarius-mobile-mode.
- Crea botón flotante Menu.
- Abre/cierra el sidebar.
========================================================== */
========================================================== */
(function () {
(function () {
Línea 11: Línea 16:
             document.addEventListener('DOMContentLoaded', fn);
             document.addEventListener('DOMContentLoaded', fn);
         }
         }
    }
    function isMobileOrTablet() {
        var width = window.innerWidth || document.documentElement.clientWidth || screen.width;
        var coarse = false;
        try {
            coarse = window.matchMedia &&
                (window.matchMedia('(hover: none) and (pointer: coarse)').matches ||
                window.matchMedia('(max-device-width: 1024px)').matches);
        } catch (e) {}
        return width <= 1024 || coarse;
     }
     }


     ready(function () {
     ready(function () {
         if (document.getElementById('tenarius-mobile-sidebar-button')) {
         var panel = document.getElementById('mw-panel');
        if (!panel) {
             return;
             return;
         }
         }


         var panel = document.getElementById('mw-panel');
         function updateMode() {
         if (!panel) {
            if (isMobileOrTablet()) {
                document.body.classList.add('tenarius-mobile-mode');
            } else {
                document.body.classList.remove('tenarius-mobile-mode');
                document.body.classList.remove('tenarius-sidebar-open');
            }
        }
 
        updateMode();
        window.addEventListener('resize', updateMode);
 
         if (document.getElementById('tenarius-mobile-sidebar-button')) {
             return;
             return;
         }
         }
Línea 53: Línea 83:
         }
         }


         button.addEventListener('click', toggleMenu);
         button.addEventListener('click', function () {
            updateMode();
            toggleMenu();
        });
 
         overlay.addEventListener('click', closeMenu);
         overlay.addEventListener('click', closeMenu);


Línea 63: Línea 97:


         panel.addEventListener('click', function (event) {
         panel.addEventListener('click', function (event) {
             var target = event.target;
             var node = event.target;
             if (target && target.tagName && target.tagName.toLowerCase() === 'a') {
             while (node && node !== panel) {
                closeMenu();
                if (node.tagName && node.tagName.toLowerCase() === 'a') {
                    closeMenu();
                    break;
                }
                node = node.parentNode;
             }
             }
         });
         });

Revisión actual - 05:34 16 jun 2026

/* ==========================================================
TENARIUS RO - MENU MOVIL SIDEBAR CORREGIDO
Pegar en MediaWiki:Vector.js

Este JS:
- Detecta celular/tablet.
- Agrega body.tenarius-mobile-mode.
- Crea botón flotante Menu.
- Abre/cierra el sidebar.
========================================================== */
(function () {
    function ready(fn) {
        if (document.readyState !== 'loading') {
            fn();
        } else {
            document.addEventListener('DOMContentLoaded', fn);
        }
    }

    function isMobileOrTablet() {
        var width = window.innerWidth || document.documentElement.clientWidth || screen.width;
        var coarse = false;

        try {
            coarse = window.matchMedia &&
                (window.matchMedia('(hover: none) and (pointer: coarse)').matches ||
                 window.matchMedia('(max-device-width: 1024px)').matches);
        } catch (e) {}

        return width <= 1024 || coarse;
    }

    ready(function () {
        var panel = document.getElementById('mw-panel');
        if (!panel) {
            return;
        }

        function updateMode() {
            if (isMobileOrTablet()) {
                document.body.classList.add('tenarius-mobile-mode');
            } else {
                document.body.classList.remove('tenarius-mobile-mode');
                document.body.classList.remove('tenarius-sidebar-open');
            }
        }

        updateMode();
        window.addEventListener('resize', updateMode);

        if (document.getElementById('tenarius-mobile-sidebar-button')) {
            return;
        }

        var button = document.createElement('button');
        button.id = 'tenarius-mobile-sidebar-button';
        button.type = 'button';
        button.innerHTML = 'Menu';
        button.setAttribute('aria-label', 'Abrir o cerrar menu de navegacion');
        button.setAttribute('aria-expanded', 'false');

        var overlay = document.createElement('div');
        overlay.id = 'tenarius-mobile-sidebar-overlay';

        function closeMenu() {
            document.body.classList.remove('tenarius-sidebar-open');
            button.setAttribute('aria-expanded', 'false');
            button.innerHTML = 'Menu';
        }

        function openMenu() {
            document.body.classList.add('tenarius-sidebar-open');
            button.setAttribute('aria-expanded', 'true');
            button.innerHTML = 'Cerrar';
        }

        function toggleMenu() {
            if (document.body.classList.contains('tenarius-sidebar-open')) {
                closeMenu();
            } else {
                openMenu();
            }
        }

        button.addEventListener('click', function () {
            updateMode();
            toggleMenu();
        });

        overlay.addEventListener('click', closeMenu);

        document.addEventListener('keydown', function (event) {
            if (event.key === 'Escape') {
                closeMenu();
            }
        });

        panel.addEventListener('click', function (event) {
            var node = event.target;
            while (node && node !== panel) {
                if (node.tagName && node.tagName.toLowerCase() === 'a') {
                    closeMenu();
                    break;
                }
                node = node.parentNode;
            }
        });

        document.body.appendChild(overlay);
        document.body.appendChild(button);
    });
})();