MediaWiki:Common.js: Difference between revisions

From Medalist Wiki
(toggle prayge)
 
No edit summary
 
(22 intermediate revisions by the same user not shown)
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
/* Add spoiler warning popup for first-time visitors */
// MediaWiki:Common.js
mw.loader.using(['mediawiki.api', 'mediawiki.util'], function() {
mw.loader.using(['mediawiki.api', 'mediawiki.util'], function() {
     // Create toggle button in user menu
     // Debug mode - set to true to always show the popup
     $(function() {
    var debugMode = false;
         var $toggleButton = $('<li id="content-toggle"><span>Toggle Content Mode</span></li>');
   
         var $toggleMenu = $('<ul class="content-toggle-menu">' +
    // Check if user has seen the warning before (or if in debug mode)
             '<li data-mode="anime">Caught up to Anime</li>' +
     if (debugMode || !mw.cookie.get('spoilerWarningShown')) {
             '<li data-mode="manga">Caught up to Manga</li>' +
        // Create styles for light/dark mode
            '</ul>');
         var style = document.createElement('style');
          
         style.textContent = '@media (prefers-color-scheme: dark) { ' +
        $('#p-personal ul').append($toggleButton);
             '.spoiler-warning { background: #202020 !important; color: #ffffff !important; }' +
        $toggleButton.append($toggleMenu);
             '.spoiler-warning .subtext { color: #bbbbbb !important; }' +
       
        '} ' +
        // Get user's current preference from localStorage
         '@media (prefers-color-scheme: light) { ' +
        var currentMode = localStorage.getItem('contentMode') || 'anime';
            '.spoiler-warning { background: #ffffff !important; color: #000000 !important; }' +
        updateContentDisplay(currentMode);
            '.spoiler-warning .subtext { color: #666666 !important; }' +
       
        '}';
        // Handle toggle clicks
        document.head.appendChild(style);
        $('.content-toggle-menu li').on('click', function() {
            var mode = $(this).data('mode');
            localStorage.setItem('contentMode', mode);
            updateContentDisplay(mode);
        });
    });
});


function updateContentDisplay(mode) {
        // Create overlay
    // Hide all spoiler content first
        var overlay = document.createElement('div');
    $('.manga-content, .anime-content').hide();
        overlay.style.position = 'fixed';
   
        overlay.style.top = '0';
    // Show content based on selected mode
         overlay.style.left = '0';
    if (mode === 'manga') {
         overlay.style.right = '0';
         $('.manga-content, .anime-content').show();
        overlay.style.bottom = '0';
    } else {
        overlay.style.background = 'rgba(0, 0, 0, 0.5)';
         $('.anime-content').show();
        overlay.style.zIndex = '9999';
    }
        overlay.style.cursor = 'pointer';
   
    // Update active state in menu
    $('.content-toggle-menu li').removeClass('active');
    $('.content-toggle-menu li[data-mode="' + mode + '"]').addClass('active');
}


// MediaWiki:Common.css
        // Create popup container
#content-toggle {
        var popup = document.createElement('div');
    position: relative;
        popup.className = 'spoiler-warning';
    cursor: pointer;
        popup.style.position = 'fixed';
}
        popup.style.top = '50%';
        popup.style.left = '50%';
        popup.style.transform = 'translate(-50%, -50%)';
        popup.style.padding = '20px';
        popup.style.textAlign = 'center';
        popup.style.zIndex = '10000';
        popup.style.maxWidth = '400px';
        popup.style.borderRadius = '8px';
        popup.style.boxShadow = '0 2px 10px rgba(0,0,0,0.1)';


.content-toggle-menu {
        // Create the main text with "spoilers" in normal weight
    display: none;
        var message = document.createElement('div');
    position: absolute;
        message.style.marginBottom = '5px';
    background: #fff;
        message.style.fontSize = '14px';
    border: 1px solid #a2a9b1;
       
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);
        var textBefore = document.createTextNode('This wiki contains ');
    z-index: 1000;
        var spoilersSpan = document.createElement('span');
    padding: 5px 0;
        spoilersSpan.textContent = 'spoilers';
    min-width: 160px;
        var textAfter = document.createTextNode(' for the manga until the latest chapter.');
}
       
        message.appendChild(textBefore);
        message.appendChild(spoilersSpan);
        message.appendChild(textAfter);


#content-toggle:hover .content-toggle-menu {
        // Create subtext
    display: block;
        //var subMessage = document.createElement('div');
}
        //subMessage.textContent = 'By continuing, you agree to accept the risk of spoilers.';
        //subMessage.style.fontSize = '12px';
        //subMessage.className = 'subtext';
        //subMessage.style.marginBottom = '5px';


.content-toggle-menu li {
        // Create "click anywhere" text
    padding: 5px 15px;
        var clickText = document.createElement('div');
    cursor: pointer;
        clickText.textContent = 'Click anywhere to continue.';
}
        clickText.style.fontSize = '14px';
        clickText.className = 'spoiler';


.content-toggle-menu li:hover {
        // Function to close popup and set cookie
    background: #eaecf0;
        function closePopup() {
}
            // Set cookie to expire in 365 days
            mw.cookie.set('spoilerWarningShown', '1', {
                expires: 365 * 24 * 60 * 60,
                path: '/'
            });
            // Remove popup, overlay, and style
            document.body.removeChild(popup);
            document.body.removeChild(overlay);
            document.head.removeChild(style);
        }


.content-toggle-menu li.active {
        // Add click handlers
    background: #36c;
        overlay.onclick = closePopup;
    color: #fff;
        popup.onclick = function(e) {
}
            e.stopPropagation(); // Prevent clicks on popup from triggering overlay click
            closePopup();
        };


/* Template for marking content */
        // Add debug text if in debug mode
<div class="manga-content">
        if (debugMode) {
This content is only visible when "Caught up to Manga" is selected
            var debugText = document.createElement('div');
</div>
            debugText.textContent = '(Debug Mode Active)';
            debugText.style.fontSize = '10px';
            debugText.className = 'subtext';
            popup.appendChild(debugText);
        }


<div class="anime-content">
        // Assemble and show popup
This content is visible to all users
        popup.appendChild(message);
</div>
      // popup.appendChild(subMessage);
        popup.appendChild(clickText);
        document.body.appendChild(overlay);
        document.body.appendChild(popup);
    }
});

Latest revision as of 02:29, 8 February 2025

/* Add spoiler warning popup for first-time visitors */
mw.loader.using(['mediawiki.api', 'mediawiki.util'], function() {
    // Debug mode - set to true to always show the popup
    var debugMode = false;
    
    // Check if user has seen the warning before (or if in debug mode)
    if (debugMode || !mw.cookie.get('spoilerWarningShown')) {
        // Create styles for light/dark mode
        var style = document.createElement('style');
        style.textContent = '@media (prefers-color-scheme: dark) { ' +
            '.spoiler-warning { background: #202020 !important; color: #ffffff !important; }' +
            '.spoiler-warning .subtext { color: #bbbbbb !important; }' +
        '} ' +
        '@media (prefers-color-scheme: light) { ' +
            '.spoiler-warning { background: #ffffff !important; color: #000000 !important; }' +
            '.spoiler-warning .subtext { color: #666666 !important; }' +
        '}';
        document.head.appendChild(style);

        // Create overlay
        var overlay = document.createElement('div');
        overlay.style.position = 'fixed';
        overlay.style.top = '0';
        overlay.style.left = '0';
        overlay.style.right = '0';
        overlay.style.bottom = '0';
        overlay.style.background = 'rgba(0, 0, 0, 0.5)';
        overlay.style.zIndex = '9999';
        overlay.style.cursor = 'pointer';

        // Create popup container
        var popup = document.createElement('div');
        popup.className = 'spoiler-warning';
        popup.style.position = 'fixed';
        popup.style.top = '50%';
        popup.style.left = '50%';
        popup.style.transform = 'translate(-50%, -50%)';
        popup.style.padding = '20px';
        popup.style.textAlign = 'center';
        popup.style.zIndex = '10000';
        popup.style.maxWidth = '400px';
        popup.style.borderRadius = '8px';
        popup.style.boxShadow = '0 2px 10px rgba(0,0,0,0.1)';

        // Create the main text with "spoilers" in normal weight
        var message = document.createElement('div');
        message.style.marginBottom = '5px';
        message.style.fontSize = '14px';
        
        var textBefore = document.createTextNode('This wiki contains ');
        var spoilersSpan = document.createElement('span');
        spoilersSpan.textContent = 'spoilers';
        var textAfter = document.createTextNode(' for the manga until the latest chapter.');
        
        message.appendChild(textBefore);
        message.appendChild(spoilersSpan);
        message.appendChild(textAfter);

        // Create subtext
        //var subMessage = document.createElement('div');
        //subMessage.textContent = 'By continuing, you agree to accept the risk of spoilers.';
        //subMessage.style.fontSize = '12px';
        //subMessage.className = 'subtext';
        //subMessage.style.marginBottom = '5px';

        // Create "click anywhere" text
        var clickText = document.createElement('div');
        clickText.textContent = 'Click anywhere to continue.';
        clickText.style.fontSize = '14px';
        clickText.className = 'spoiler';

        // Function to close popup and set cookie
        function closePopup() {
            // Set cookie to expire in 365 days
            mw.cookie.set('spoilerWarningShown', '1', {
                expires: 365 * 24 * 60 * 60,
                path: '/'
            });
            // Remove popup, overlay, and style
            document.body.removeChild(popup);
            document.body.removeChild(overlay);
            document.head.removeChild(style);
        }

        // Add click handlers
        overlay.onclick = closePopup;
        popup.onclick = function(e) {
            e.stopPropagation(); // Prevent clicks on popup from triggering overlay click
            closePopup();
        };

        // Add debug text if in debug mode
        if (debugMode) {
            var debugText = document.createElement('div');
            debugText.textContent = '(Debug Mode Active)';
            debugText.style.fontSize = '10px';
            debugText.className = 'subtext';
            popup.appendChild(debugText);
        }

        // Assemble and show popup
        popup.appendChild(message);
       // popup.appendChild(subMessage);
        popup.appendChild(clickText);
        document.body.appendChild(overlay);
        document.body.appendChild(popup);
    }
});