Mediawiki:common.js

Вернуться

Строка 2221: Строка 2221:
};
};


var AprilPrankSlideModule = {
var AprilPrankModule = {
    FORCE_PRANK_FOR_ALL: false, // <- поставь true, если нужно включить всем без ?prank
    ONLY_MAIN_PAGE: true,      // <- оставить true, чтобы работало только на главной
    ANIMATION_MS: 5000,
    SHOWN_SESSION_KEY: 'april-prank-shown-v2',
 
     overlay: null,
     overlay: null,
     audio: null,
     audio: null,
     stopAudioTimer: null,
     isClosing: false,
    started: false,
    isAnimating: false,


     init: function () {
     init: function () {
         if (this.started) return;
         if (this.ONLY_MAIN_PAGE && window.mw && mw.config && !mw.config.get('wgIsMainPage')) {
         this.started = true;
            return;
         }
 
        if (!this.shouldRun()) {
            return;
        }


         if (!window.mw || !mw.config || !mw.config.get('wgIsMainPage')) return;
        // Чтобы не показывалось повторно в одной вкладке
         if (sessionStorage.getItem(this.SHOWN_SESSION_KEY) === '1') {
            return;
        }
        sessionStorage.setItem(this.SHOWN_SESSION_KEY, '1');
 
        this.injectStyles();
        this.buildOverlay();
        this.bindEvents();
    },
 
    shouldRun: function () {
        if (this.FORCE_PRANK_FOR_ALL) {
            return true;
        }


         var params = new URLSearchParams(window.location.search);
         var params = new URLSearchParams(window.location.search);
         var isPrankMode = params.has('prank');
         if (!params.has('prank')) {
 
            return false;
        var now = new Date();
         }
         var isAprilFirst = now.getMonth() === 3 && now.getDate() === 1;


         if (!isPrankMode && !isAprilFirst) return;
         var value = (params.get('prank') || '').trim().toLowerCase();


         if (!isPrankMode && sessionStorage.getItem('april-prank-shown') === '1') return;
        // Работает для ?prank, ?prank=1, ?prank=true, ?prank=on, ?prank=yes
        if (!isPrankMode) {
         if (value === '' || value === '1' || value === 'true' || value === 'on' || value === 'yes') {
            sessionStorage.setItem('april-prank-shown', '1');
            return true;
         }
         }


         this.injectStyles();
         return false;
        this.createOverlay();
     },
     },


     injectStyles: function () {
     injectStyles: function () {
         if (document.getElementById('april-prank-slide-styles')) return;
         if (document.getElementById('april-prank-styles')) {
            return;
        }


         var style = document.createElement('style');
         var style = document.createElement('style');
         style.id = 'april-prank-slide-styles';
         style.id = 'april-prank-styles';
         style.textContent =
         style.textContent =
             '#april-prank-overlay{' +
             '#april-prank-overlay {' +
                 'position:fixed;' +
                 'position: fixed;' +
                 'inset:0;' +
                 'inset: 0;' +
                 'z-index:2147483647;' +
                 'z-index: 2147483647;' +
                 'background:#000;' +
                 'background: #000;' +
                 'overflow:hidden;' +
                 'overflow: auto;' +
                 'transform:translateY(0);' +
                 'cursor: pointer;' +
                 'transition:transform 5000ms linear;' +
                 'transform: translateY(0);' +
            '}' +
                'will-change: transform;' +
            '#april-prank-overlay.april-prank-hide{' +
                'transform:translateY(-100%);' +
             '}' +
             '}' +
             '#april-prank-overlay .april-prank-scroll{' +
             '#april-prank-overlay.closing {' +
                 'width:100%;' +
                 'transition: transform 5000ms linear;' +
                 'height:100%;' +
                 'transform: translateY(-100%);' +
                'overflow:auto;' +
                'cursor:pointer;' +
                '-webkit-overflow-scrolling:touch;' +
             '}' +
             '}' +
             '#april-prank-overlay .april-prank-scroll img{' +
             '#april-prank-overlay img {' +
                 'display:block;' +
                 'display: block;' +
                 'width:100%;' +
                 'width: 100%;' +
                 'height:auto;' +
                 'height: auto;' +
                 'max-width:none;' +
                 'min-height: 100vh;' +
                 'user-select:none;' +
                'object-fit: cover;' +
                 '-webkit-user-drag:none;' +
                 'user-select: none;' +
                 'pointer-events:none;' +
                 '-webkit-user-drag: none;' +
                 'pointer-events: none;' +
             '}';
             '}';
         document.head.appendChild(style);
         document.head.appendChild(style);
     },
     },


     createOverlay: function () {
     buildOverlay: function () {
         var overlay = document.createElement('div');
         var overlay = document.createElement('div');
         overlay.id = 'april-prank-overlay';
         overlay.id = 'april-prank-overlay';


         var scroller = document.createElement('div');
         var img = document.createElement('img');
         scroller.className = 'april-prank-scroll';
         img.src = 'https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png';
        img.alt = 'Wikipedia homepage screenshot';


        var image = document.createElement('img');
         overlay.appendChild(img);
        image.src = 'https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png';
        image.alt = 'Wikipedia homepage prank';
 
        scroller.appendChild(image);
         overlay.appendChild(scroller);
         document.body.appendChild(overlay);
         document.body.appendChild(overlay);


         this.overlay = overlay;
         this.overlay = overlay;
        this.audio = new Audio('https://zvukogram.com/mp3/40/stone-plate.mp3');
        this.audio.preload = 'auto';
    },


    bindEvents: function () {
         var self = this;
         var self = this;
         scroller.addEventListener('click', function () {
         if (!this.overlay) {
             self.startSlideOut();
            return;
         });
        }
 
        this.overlay.addEventListener('click', function () {
             self.startClose();
         }, { passive: true });
     },
     },


     startSlideOut: function () {
     startClose: function () {
         if (!this.overlay || this.isAnimating) return;
         if (this.isClosing || !this.overlay) {
         this.isAnimating = true;
            return;
         }


         this.playSoundStrict5s();
         this.isClosing = true;
 
        if (this.audio) {
            this.audio.currentTime = 0;
            this.audio.play().catch(function () {
                // Браузер может заблокировать autoplay — клик уже есть, обычно играет
            });
        }
 
        this.overlay.classList.add('closing');


         var self = this;
         var self = this;
        this.overlay.classList.add('april-prank-hide');


         this.overlay.addEventListener('transitionend', function handleTransitionEnd(e) {
         setTimeout(function () {
             if (e.propertyName !== 'transform') return;
             if (self.audio) {
            self.overlay.removeEventListener('transitionend', handleTransitionEnd);
                self.audio.pause();
            self.stopSoundNow();
                 self.audio.currentTime = 0;
            if (self.overlay && self.overlay.parentNode) {
                 self.overlay.parentNode.removeChild(self.overlay);
             }
             }
            self.overlay = null;
         }, this.ANIMATION_MS);
         });
    },


    playSoundStrict5s: function () {
        this.overlay.addEventListener('transitionend', function onEnd(e) {
        this.stopSoundNow();
            if (e.propertyName !== 'transform') {
                return;
            }


        var audio = new Audio('https://zvukogram.com/mp3/40/stone-plate.mp3');
            self.overlay.removeEventListener('transitionend', onEnd);
        audio.preload = 'auto';
        audio.loop = false;
        audio.volume = 1;


        this.audio = audio;
            if (self.overlay && self.overlay.parentNode) {
                self.overlay.parentNode.removeChild(self.overlay);
            }


        var self = this;
            self.overlay = null;
        audio.play().catch(function () {
            // Браузер мог заблокировать автозвук; по клику обычно воспроизводится.
         });
         });
        this.stopAudioTimer = setTimeout(function () {
            self.stopSoundNow();
        }, 5000);
    },
    stopSoundNow: function () {
        if (this.stopAudioTimer) {
            clearTimeout(this.stopAudioTimer);
            this.stopAudioTimer = null;
        }
        if (this.audio) {
            try {
                this.audio.pause();
                this.audio.currentTime = 0;
                this.audio.removeAttribute('src');
                this.audio.load();
            } catch (e) {}
            this.audio = null;
        }
     }
     }
};
};
Строка 2380: Строка 2385:
         // LawCalculatorModule.init();
         // LawCalculatorModule.init();
         EquipmentFilterModule.init();
         EquipmentFilterModule.init();
         AprilPrankSlideModule.init();
         AprilPrankModule.init();
     }
     }