Mediawiki:common.js

Вернуться

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


var AprilFoolsPrankModule = {
var AprilPrankSlideModule = {
    started: false,
    closing: false,
     overlay: null,
     overlay: null,
    imageLayer: null,
     audio: null,
     audio: null,
    stopAudioTimer: null,
    started: false,
    isAnimating: false,


     init: function () {
     init: function () {
Строка 2232: Строка 2232:
         this.started = true;
         this.started = true;


         if (!window.mw || !mw.config || !mw.config.get('wgIsMainPage')) {
         if (!window.mw || !mw.config || !mw.config.get('wgIsMainPage')) return;
            return;
        }


         var params = new URLSearchParams(window.location.search);
         var params = new URLSearchParams(window.location.search);
         var prankByFlag = params.get('prank') === '1';
         var isPrankMode = params.has('prank');
 
        var now = new Date();
        var isAprilFirst = now.getMonth() === 3 && now.getDate() === 1;


         var enableForAll = false;
         if (!isPrankMode && !isAprilFirst) return;


         if (!prankByFlag && !enableForAll) {
         if (!isPrankMode && sessionStorage.getItem('april-prank-shown') === '1') return;
             return;
        if (!isPrankMode) {
             sessionStorage.setItem('april-prank-shown', '1');
         }
         }


         this.injectStyles();
         this.injectStyles();
         this.createOverlay();
         this.createOverlay();
        this.lockPageScroll();
     },
     },


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


         var style = document.createElement('style');
         var style = document.createElement('style');
         style.id = 'april-fools-prank-styles';
         style.id = 'april-prank-slide-styles';
         style.textContent =
         style.textContent =
             '#april-fools-prank-overlay{' +
             '#april-prank-overlay{' +
                 'position:fixed;' +
                 'position:fixed;' +
                 'inset:0;' +
                 'inset:0;' +
                 'z-index:2147483647;' +
                 'z-index:2147483647;' +
                 'background:#000;' +
                 'background:#000;' +
                 'overflow-y:auto;' +
                 'overflow:hidden;' +
                'overflow-x:hidden;' +
                'cursor:pointer;' +
                 'transform:translateY(0);' +
                 'transform:translateY(0);' +
                 'transition:transform 5s linear;' +
                 'transition:transform 5000ms linear;' +
             '}' +
             '}' +
             '#april-fools-prank-overlay.closing{' +
             '#april-prank-overlay.april-prank-hide{' +
                 'transform:translateY(-100%);' +
                 'transform:translateY(-100%);' +
             '}' +
             '}' +
             '#april-fools-prank-image{' +
             '#april-prank-overlay .april-prank-scroll{' +
                'width:100%;' +
                'height:100%;' +
                'overflow:auto;' +
                'cursor:pointer;' +
                '-webkit-overflow-scrolling:touch;' +
            '}' +
            '#april-prank-overlay .april-prank-scroll img{' +
                 'display:block;' +
                 'display:block;' +
                 'width:100vw;' +
                 'width:100%;' +
                'min-height:100vh;' +
                 'height:auto;' +
                 'height:auto;' +
                 'object-fit:cover;' +
                 'max-width:none;' +
                 'object-position:top center;' +
                 'user-select:none;' +
                '-webkit-user-drag:none;' +
                'pointer-events:none;' +
             '}';
             '}';
         document.head.appendChild(style);
         document.head.appendChild(style);
Строка 2283: Строка 2290:
     createOverlay: function () {
     createOverlay: function () {
         var overlay = document.createElement('div');
         var overlay = document.createElement('div');
         overlay.id = 'april-fools-prank-overlay';
         overlay.id = 'april-prank-overlay';


         var img = document.createElement('img');
         var scroller = document.createElement('div');
         img.id = 'april-fools-prank-image';
         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';


         overlay.appendChild(img);
        var image = document.createElement('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.imageLayer = img;
        this.audio = new Audio('https://zvukogram.com/mp3/40/stone-plate.mp3');
        this.audio.preload = 'auto';


         var self = this;
         var self = this;
         overlay.addEventListener('click', function () {
         scroller.addEventListener('click', function () {
             self.closeWithSound();
             self.startSlideOut();
         }, { once: true });
         });
     },
     },


     closeWithSound: function () {
     startSlideOut: function () {
         if (this.closing || !this.overlay) return;
         if (!this.overlay || this.isAnimating) return;
         this.closing = true;
         this.isAnimating = true;


         try {
         this.playSoundStrict5s();
            this.audio.currentTime = 0;
            this.audio.play();
        } catch (e) {
        }


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


        var self = this;
         this.overlay.addEventListener('transitionend', function handleTransitionEnd(e) {
         this.overlay.addEventListener('transitionend', function handleEnd(e) {
             if (e.propertyName !== 'transform') return;
             if (e.propertyName !== 'transform') return;
             self.overlay.removeEventListener('transitionend', handleEnd);
             self.overlay.removeEventListener('transitionend', handleTransitionEnd);
             self.unlockPageScroll();
             self.stopSoundNow();
             if (self.overlay && self.overlay.parentNode) {
             if (self.overlay && self.overlay.parentNode) {
                 self.overlay.parentNode.removeChild(self.overlay);
                 self.overlay.parentNode.removeChild(self.overlay);
Строка 2328: Строка 2331:
     },
     },


     lockPageScroll: function () {
     playSoundStrict5s: function () {
         document.documentElement.style.overflow = 'hidden';
         this.stopSoundNow();
         document.body.style.overflow = 'hidden';
 
        var audio = new Audio('https://zvukogram.com/mp3/40/stone-plate.mp3');
        audio.preload = 'auto';
         audio.loop = false;
        audio.volume = 1;
 
        this.audio = audio;
 
        var self = this;
        audio.play().catch(function () {
            // Браузер мог заблокировать автозвук; по клику обычно воспроизводится.
        });
 
        this.stopAudioTimer = setTimeout(function () {
            self.stopSoundNow();
        }, 5000);
     },
     },


     unlockPageScroll: function () {
     stopSoundNow: function () {
         document.documentElement.style.overflow = '';
         if (this.stopAudioTimer) {
         document.body.style.overflow = '';
            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;
        }
     }
     }
};
};
     function initAllModules() {
     function initAllModules() {
         SidebarModule.init();
         SidebarModule.init();