Jump to content

MediaWiki:Mobile.js: Difference between revisions

From Vanipedia
Kashya (talk | contribs)
No edit summary
Kashya (talk | contribs)
No edit summary
Line 1: Line 1:
/* Mobile and Desktop VaniSearch Input Replacement */
/* STANDALONE VANI-SEARCH CAPTURE-PHASE BYPASS */
(function() {
(function() {
     function replaceSearchForms() {
     function initVaniMobileSearch() {
        // 1. Mobile (Minerva): Replace the entire form with a div so Minerva listeners cannot fire
         var header = document.querySelector('.minerva-header');
         var minervaForm = document.querySelector('form.minerva-search-form');
         if (!header || header.dataset.vaniBound) return;
         if (minervaForm) {
        header.dataset.vaniBound = 'true';
            var searchWrap = document.createElement('div');
            searchWrap.className = 'vani-mobile-search-box';


            var cleanInput = document.createElement('input');
        // 1. Clean out Minerva's default search form completely to stop its event listeners
            cleanInput.type = 'text';
        var oldForm = header.querySelector('.minerva-search-form');
            cleanInput.name = 'search';
        if (oldForm) oldForm.remove();
            cleanInput.className = 'vani-clean-search-input';
            cleanInput.placeholder = 'Search Vanipedia';
            cleanInput.autocomplete = 'off';


            var goBtn = document.createElement('button');
        // 2. Create a fresh, independent search container
            goBtn.type = 'button';
        var container = document.createElement('div');
            goBtn.className = 'vani-inline-go';
        container.className = 'vani-independent-search';
            goBtn.innerHTML = '🔍';
        container.style.cssText = 'flex: 1 1 auto !important; display: flex !important; align-items: center !important; position: relative !important; margin: 0 8px !important;';


            function runMobileSearch(e) {
        var input = document.createElement('input');
                if (e) {
        input.type = 'text';
                    e.preventDefault();
        input.className = 'vani-clean-search-input';
                    e.stopPropagation();
        input.placeholder = 'Search Vanipedia';
                }
        input.autocomplete = 'off';
                var val = cleanInput.value.trim();
        input.style.cssText = 'width: 100% !important; height: 32px !important; background: #1f3e45 !important; color: #ffffff !important; -webkit-text-fill-color: #ffffff !important; border: 1.5px solid #f5d77f !important; border-radius: 16px !important; padding: 2px 32px 2px 12px !important; font-size: 15px !important; outline: none !important; box-sizing: border-box !important;';
                if (val !== '') {
 
                    window.location.href = '/wiki/Special:VaniSearch?search=' + encodeURIComponent(val);
        var btn = document.createElement('button');
                }
        btn.type = 'button';
            }
        btn.innerHTML = '🔍';
        btn.style.cssText = 'position: absolute !important; right: 8px !important; top: 50% !important; transform: translateY(-50%) !important; background: none !important; border: none !important; font-size: 15px !important; cursor: pointer !important; padding: 0 !important; line-height: 1 !important; z-index: 20 !important;';


            goBtn.addEventListener('click', runMobileSearch);
        function executeSearch(e) {
             cleanInput.addEventListener('keydown', function(e) {
             if (e) {
                e.preventDefault();
                 e.stopPropagation();
                 e.stopPropagation();
                 if (e.key === 'Enter' || e.keyCode === 13) {
                 e.stopImmediatePropagation();
                    runMobileSearch(e);
             }
                }
             var val = input.value.trim();
             });
             if (val !== '') {
 
                window.location.href = '/wiki/Special:VaniSearch?search=' + encodeURIComponent(val);
             searchWrap.appendChild(cleanInput);
            }
             searchWrap.appendChild(goBtn);
            minervaForm.parentNode.replaceChild(searchWrap, minervaForm);
         }
         }


         // 2. Desktop (Vector): Route Enter key and add right-side icon
         btn.addEventListener('click', executeSearch, true);
        var desktopForm = document.querySelector('#p-search form, form#searchform');
        if (desktopForm && !desktopForm.classList.contains('minerva-search-form') && !desktopForm.dataset.vaniBound) {
            desktopForm.dataset.vaniBound = 'true';
            desktopForm.setAttribute('action', '/wiki/Special:VaniSearch');


            var dInput = desktopForm.querySelector('input[type="search"], input[name="search"], #searchInput');
        // Capture phase event interception: Stops Minerva from ever knowing you clicked or typed
            if (dInput) {
        ['click', 'focus', 'focusin', 'touchstart', 'input', 'keydown'].forEach(function(eventType) {
                dInput.setAttribute('autocomplete', 'off');
            input.addEventListener(eventType, function(e) {
                var wrap = dInput.parentElement;
                e.stopPropagation(); // Stops Minerva's listener from triggering
                if (wrap && !wrap.querySelector('.vani-inline-go')) {
                if (eventType === 'keydown' && (e.key === 'Enter' || e.keyCode === 13)) {
                    wrap.style.position = 'relative';
                     executeSearch(e);
                    var dBtn = document.createElement('button');
                    dBtn.type = 'button';
                    dBtn.className = 'vani-inline-go';
                    dBtn.innerHTML = '🔍';
                    dBtn.addEventListener('click', function(e) {
                        e.preventDefault();
                        var val = dInput.value.trim();
                        if (val !== '') {
                            window.location.href = '/wiki/Special:VaniSearch?search=' + encodeURIComponent(val);
                        }
                    });
                     wrap.appendChild(dBtn);
                 }
                 }
            }, true); // true = Capture phase (runs before Minerva)
        });


                dInput.addEventListener('keydown', function(e) {
        container.appendChild(input);
                    if (e.key === 'Enter' || e.keyCode === 13) {
        container.appendChild(btn);
                        e.preventDefault();
 
                        e.stopImmediatePropagation();
        // Insert right after the burger menu button
                        var val = dInput.value.trim();
        var burger = header.querySelector('.navigation-drawer, #mw-mf-main-menu-button');
                        if (val !== '') {
        if (burger && burger.nextSibling) {
                            window.location.href = '/wiki/Special:VaniSearch?search=' + encodeURIComponent(val);
            header.insertBefore(container, burger.nextSibling);
                        }
        } else {
                    }
            header.appendChild(container);
                }, true);
            }
         }
         }
     }
     }


     if (document.readyState === 'loading') {
     if (document.readyState === 'loading') {
         document.addEventListener('DOMContentLoaded', replaceSearchForms);
         document.addEventListener('DOMContentLoaded', initVaniMobileSearch);
     } else {
     } else {
         replaceSearchForms();
         initVaniMobileSearch();
     }
     }
     setTimeout(replaceSearchForms, 250);
     setTimeout(initVaniMobileSearch, 300);
     setTimeout(replaceSearchForms, 800);
     setTimeout(initVaniMobileSearch, 1000);
})();
})();

Revision as of 02:10, 13 November 2026

/* STANDALONE VANI-SEARCH CAPTURE-PHASE BYPASS */
(function() {
    function initVaniMobileSearch() {
        var header = document.querySelector('.minerva-header');
        if (!header || header.dataset.vaniBound) return;
        header.dataset.vaniBound = 'true';

        // 1. Clean out Minerva's default search form completely to stop its event listeners
        var oldForm = header.querySelector('.minerva-search-form');
        if (oldForm) oldForm.remove();

        // 2. Create a fresh, independent search container
        var container = document.createElement('div');
        container.className = 'vani-independent-search';
        container.style.cssText = 'flex: 1 1 auto !important; display: flex !important; align-items: center !important; position: relative !important; margin: 0 8px !important;';

        var input = document.createElement('input');
        input.type = 'text';
        input.className = 'vani-clean-search-input';
        input.placeholder = 'Search Vanipedia';
        input.autocomplete = 'off';
        input.style.cssText = 'width: 100% !important; height: 32px !important; background: #1f3e45 !important; color: #ffffff !important; -webkit-text-fill-color: #ffffff !important; border: 1.5px solid #f5d77f !important; border-radius: 16px !important; padding: 2px 32px 2px 12px !important; font-size: 15px !important; outline: none !important; box-sizing: border-box !important;';

        var btn = document.createElement('button');
        btn.type = 'button';
        btn.innerHTML = '🔍';
        btn.style.cssText = 'position: absolute !important; right: 8px !important; top: 50% !important; transform: translateY(-50%) !important; background: none !important; border: none !important; font-size: 15px !important; cursor: pointer !important; padding: 0 !important; line-height: 1 !important; z-index: 20 !important;';

        function executeSearch(e) {
            if (e) {
                e.preventDefault();
                e.stopPropagation();
                e.stopImmediatePropagation();
            }
            var val = input.value.trim();
            if (val !== '') {
                window.location.href = '/wiki/Special:VaniSearch?search=' + encodeURIComponent(val);
            }
        }

        btn.addEventListener('click', executeSearch, true);

        // Capture phase event interception: Stops Minerva from ever knowing you clicked or typed
        ['click', 'focus', 'focusin', 'touchstart', 'input', 'keydown'].forEach(function(eventType) {
            input.addEventListener(eventType, function(e) {
                e.stopPropagation(); // Stops Minerva's listener from triggering
                if (eventType === 'keydown' && (e.key === 'Enter' || e.keyCode === 13)) {
                    executeSearch(e);
                }
            }, true); // true = Capture phase (runs before Minerva)
        });

        container.appendChild(input);
        container.appendChild(btn);

        // Insert right after the burger menu button
        var burger = header.querySelector('.navigation-drawer, #mw-mf-main-menu-button');
        if (burger && burger.nextSibling) {
            header.insertBefore(container, burger.nextSibling);
        } else {
            header.appendChild(container);
        }
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initVaniMobileSearch);
    } else {
        initVaniMobileSearch();
    }
    setTimeout(initVaniMobileSearch, 300);
    setTimeout(initVaniMobileSearch, 1000);
})();