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 INPUT (DEFEATS MINERVA FOCUS-STEALING & OVERLAY)
  ========================================================================== */
(function() {
(function() {
     function installCleanVaniSearch() {
     function replaceSearchForms() {
         // 1. Mobile Minerva Header: Replace Minerva's rigged input with a clean standalone input
         // 1. Mobile (Minerva): Replace the entire form with a div so Minerva listeners cannot fire
         var minervaForm = document.querySelector('form.minerva-search-form');
         var minervaForm = document.querySelector('form.minerva-search-form');
         if (minervaForm && !minervaForm.dataset.vaniCleanInstalled) {
         if (minervaForm) {
             minervaForm.dataset.vaniCleanInstalled = 'true';
             var searchWrap = document.createElement('div');
             minervaForm.setAttribute('action', '/wiki/Special:VaniSearch');
             searchWrap.className = 'vani-mobile-search-box';


             var searchBox = minervaForm.querySelector('.search-box');
             var cleanInput = document.createElement('input');
             if (searchBox) {
            cleanInput.type = 'text';
                // Wipe Minerva's decoy input and left icon so Minerva JS cannot hijack focus
            cleanInput.name = 'search';
                searchBox.innerHTML = '';
            cleanInput.className = 'vani-clean-search-input';
             cleanInput.placeholder = 'Search Vanipedia';
            cleanInput.autocomplete = 'off';


                var cleanInput = document.createElement('input');
            var goBtn = document.createElement('button');
                cleanInput.type = 'text';
            goBtn.type = 'button';
                cleanInput.name = 'search';
            goBtn.className = 'vani-inline-go';
                cleanInput.className = 'vani-clean-search-input';
            goBtn.innerHTML = '🔍';
                cleanInput.placeholder = 'Search Vanipedia';
                cleanInput.autocomplete = 'off';


                 var goBtn = document.createElement('button');
            function runMobileSearch(e) {
                goBtn.type = 'button';
                 if (e) {
                 goBtn.className = 'vani-inline-go';
                    e.preventDefault();
                 goBtn.innerHTML = '🔍';
                    e.stopPropagation();
                goBtn.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;';
                 }
                var val = cleanInput.value.trim();
                 if (val !== '') {
                    window.location.href = '/wiki/Special:VaniSearch?search=' + encodeURIComponent(val);
                }
            }


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


                goBtn.addEventListener('click', submitMobileVaniSearch, true);
            searchWrap.appendChild(cleanInput);
 
            searchWrap.appendChild(goBtn);
                cleanInput.addEventListener('keydown', function(e) {
            minervaForm.parentNode.replaceChild(searchWrap, minervaForm);
                    // Stop Minerva from listening to keystrokes
                    e.stopPropagation();
                    if (e.key === 'Enter' || e.keyCode === 13) {
                        submitMobileVaniSearch(e);
                    }
                }, true);
 
                // Stop clicks/focus on our input from bubbling up to Minerva's overlay launcher
                ['click', 'focus', 'focusin', 'touchstart', 'input'].forEach(function(evt) {
                    cleanInput.addEventListener(evt, function(e) {
                        e.stopPropagation();
                    }, true);
                });
 
                searchBox.appendChild(cleanInput);
                searchBox.appendChild(goBtn);
            }
         }
         }


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


Line 78: Line 60:
                     dBtn.className = 'vani-inline-go';
                     dBtn.className = 'vani-inline-go';
                     dBtn.innerHTML = '🔍';
                     dBtn.innerHTML = '🔍';
                    dBtn.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;';
                     dBtn.addEventListener('click', function(e) {
                     dBtn.addEventListener('click', function(e) {
                         e.preventDefault();
                         e.preventDefault();
Line 104: Line 85:


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

Revision as of 02:05, 13 November 2026

/* Mobile and Desktop VaniSearch Input Replacement */
(function() {
    function replaceSearchForms() {
        // 1. Mobile (Minerva): Replace the entire form with a div so Minerva listeners cannot fire
        var minervaForm = document.querySelector('form.minerva-search-form');
        if (minervaForm) {
            var searchWrap = document.createElement('div');
            searchWrap.className = 'vani-mobile-search-box';

            var cleanInput = document.createElement('input');
            cleanInput.type = 'text';
            cleanInput.name = 'search';
            cleanInput.className = 'vani-clean-search-input';
            cleanInput.placeholder = 'Search Vanipedia';
            cleanInput.autocomplete = 'off';

            var goBtn = document.createElement('button');
            goBtn.type = 'button';
            goBtn.className = 'vani-inline-go';
            goBtn.innerHTML = '🔍';

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

            goBtn.addEventListener('click', runMobileSearch);
            cleanInput.addEventListener('keydown', function(e) {
                e.stopPropagation();
                if (e.key === 'Enter' || e.keyCode === 13) {
                    runMobileSearch(e);
                }
            });

            searchWrap.appendChild(cleanInput);
            searchWrap.appendChild(goBtn);
            minervaForm.parentNode.replaceChild(searchWrap, minervaForm);
        }

        // 2. Desktop (Vector): Route Enter key and add right-side icon
        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');
            if (dInput) {
                dInput.setAttribute('autocomplete', 'off');
                var wrap = dInput.parentElement;
                if (wrap && !wrap.querySelector('.vani-inline-go')) {
                    wrap.style.position = 'relative';
                    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);
                }

                dInput.addEventListener('keydown', function(e) {
                    if (e.key === 'Enter' || e.keyCode === 13) {
                        e.preventDefault();
                        e.stopImmediatePropagation();
                        var val = dInput.value.trim();
                        if (val !== '') {
                            window.location.href = '/wiki/Special:VaniSearch?search=' + encodeURIComponent(val);
                        }
                    }
                }, true);
            }
        }
    }

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