MediaWiki:Common.js: Różnice pomiędzy wersjami

Z Oświetleniowo
Przejdź do nawigacji Przejdź do wyszukiwania
Nie podano opisu zmian
Znacznik: Wycofane
Nie podano opisu zmian
 
(Nie pokazano 2 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
/* Umieszczony tutaj kod JavaScript zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */
// Dark Mode Manager with Cookie Storage
 
(function() {
// Funkcja przełączania trybu ciemnego
     'use strict';
function toggleDarkMode() {
     var body = document.body;
    var isDarkMode = body.classList.contains('dark-mode');
      
      
     if (isDarkMode) {
     const DARK_MODE_CLASS = 'skin-dark-mode';
         body.classList.remove('dark-mode');
    const COOKIE_NAME = 'mw_dark_mode';
        localStorage.setItem('darkMode', 'disabled');
    const COOKIE_EXPIRE_DAYS = 365;
         updateToggleButton('🌙 Tryb ciemny');
   
    } else {
    class DarkModeManager {
         body.classList.add('dark-mode');
        constructor() {
        localStorage.setItem('darkMode', 'enabled');
            this.init();
        updateToggleButton('☀️ Tryb jasny');
        }
    }
       
}
        init() {
 
            this.applySavedPreference();
// Aktualizacja tekstu przycisku
            this.processTemplateMarkers();
function updateToggleButton(text) {
            this.createFixedToggle();
    var toggleButton = document.getElementById('dark-mode-toggle');
            this.watchForDynamicContent();
    if (toggleButton) {
        }
        toggleButton.textContent = text;
       
        // Cookie management
        setCookie(name, value, days) {
            const date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            const expires = "expires=" + date.toUTCString();
            document.cookie = name + "=" + value + ";" + expires + ";path=/";
        }
       
        getCookie(name) {
            const nameEQ = name + "=";
            const ca = document.cookie.split(';');
            for(let i = 0; i < ca.length; i++) {
                let c = ca[i];
                while (c.charAt(0) === ' ') c = c.substring(1, c.length);
                if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
            }
            return null;
        }
       
        isDarkMode() {
            const cookie = this.getCookie(COOKIE_NAME);
            return cookie === 'true';
        }
       
        setDarkMode(enabled) {
            this.setCookie(COOKIE_NAME, enabled, COOKIE_EXPIRE_DAYS);
            this.applyDarkMode(enabled);
            this.updateAllToggleButtons(enabled);
         }
       
        toggle() {
            this.setDarkMode(!this.isDarkMode());
        }
       
        applyDarkMode(enabled) {
            if (enabled) {
                document.documentElement.classList.add(DARK_MODE_CLASS);
            } else {
                document.documentElement.classList.remove(DARK_MODE_CLASS);
            }
            this.protectImages();
        }
       
        applySavedPreference() {
            const isDark = this.isDarkMode();
            this.applyDarkMode(isDark);
        }
       
        protectImages() {
            const images = document.querySelectorAll('img, .image, .thumbimage, .mw-file-element');
            images.forEach(img => {
                img.style.filter = 'none';
                img.style.backgroundColor = 'transparent';
            });
        }
       
        processTemplateMarkers() {
            this.replaceCustomElements();
        }
       
        replaceCustomElements() {
            const customElements = document.querySelectorAll('dark-toggle');
            customElements.forEach(element => {
                element.innerHTML = this.createToggleButtonHTML(this.isDarkMode());
                setTimeout(() => {
                    const button = element.querySelector('button');
                    if (button) {
                        button.addEventListener('click', () => this.toggle());
                    }
                }, 0);
            });
         }
       
        createToggleButtonHTML(isDark) {
            const icon = isDark ? '☀️' : '🌙';
            const text = isDark ? ' Light Mode' : ' Dark Mode';
            const modeClass = isDark ? 'light' : '';
           
            return `<button class="dark-mode-toggle-button ${modeClass}">
                <span class="toggle-icon">${icon}</span>
                <span class="toggle-text">${text}</span>
            </button>`;
        }
          
        createFixedToggle() {
            const existingToggle = document.getElementById('darkModeToggleFixed');
            if (existingToggle) existingToggle.remove();
           
            const button = document.createElement('button');
            button.id = 'darkModeToggleFixed';
            button.className = `dark-mode-toggle-fixed ${this.isDarkMode() ? 'light' : ''}`;
            button.innerHTML = this.isDarkMode() ?
                '<span class="toggle-icon">☀️</span><span class="toggle-text">Light Mode</span>' :
                '<span class="toggle-icon">🌙</span><span class="toggle-text">Dark Mode</span>';
            button.title = this.isDarkMode() ? 'Switch to light mode' : 'Switch to dark mode';
           
            button.addEventListener('click', () => this.toggle());
            document.body.appendChild(button);
        }
       
        updateAllToggleButtons(isDark) {
            const inlineButtons = document.querySelectorAll('.dark-mode-toggle-button');
            inlineButtons.forEach(button => {
                const icon = button.querySelector('.toggle-icon');
                const text = button.querySelector('.toggle-text');
               
                if (isDark) {
                    icon.textContent = '☀️';
                    text.textContent = ' Light Mode';
                    button.classList.add('light');
                } else {
                    icon.textContent = '🌙';
                    text.textContent = ' Dark Mode';
                    button.classList.remove('light');
                }
            });
           
            const fixedButton = document.getElementById('darkModeToggleFixed');
            if (fixedButton) {
                const icon = fixedButton.querySelector('.toggle-icon');
                const text = fixedButton.querySelector('.toggle-text');
               
                if (isDark) {
                    icon.textContent = '☀️';
                    text.textContent = 'Light Mode';
                    fixedButton.classList.add('light');
                    fixedButton.title = 'Switch to light mode';
                } else {
                    icon.textContent = '🌙';
                    text.textContent = 'Dark Mode';
                    fixedButton.classList.remove('light');
                    fixedButton.title = 'Switch to dark mode';
                }
            }
        }
       
        watchForDynamicContent() {
            const observer = new MutationObserver((mutations) => {
                mutations.forEach((mutation) => {
                    if (mutation.addedNodes.length) {
                        mutation.addedNodes.forEach((node) => {
                            if (node.nodeType === Node.ELEMENT_NODE) {
                                if (node.querySelector && node.querySelector('dark-toggle')) {
                                    this.replaceCustomElements();
                                }
                            }
                        });
                    }
                });
            });
           
            observer.observe(document.body, {
                childList: true,
                subtree: true
            });
        }
     }
     }
}
// Sprawdzenie zapisanego ustawienia
function checkSavedMode() {
    var savedMode = localStorage.getItem('darkMode');
    var body = document.body;
    var toggleButton = document.getElementById('dark-mode-toggle');
      
      
     if (savedMode === 'enabled') {
    // Initialize when DOM is ready
         body.classList.add('dark-mode');
     if (document.readyState === 'loading') {
         updateToggleButton('☀️ Tryb jasny');
         document.addEventListener('DOMContentLoaded', () => {
            window.DarkModeManager = new DarkModeManager();
         });
     } else {
     } else {
         updateToggleButton('🌙 Tryb ciemny');
         window.DarkModeManager = new DarkModeManager();
     }
     }
}
})();
 
// Tworzenie przycisku
function createToggleButton() {
    // Sprawdź czy przycisk już istnieje
    if (document.getElementById('dark-mode-toggle')) {
        return;
    }
   
    var toggleButton = document.createElement('button');
    toggleButton.id = 'dark-mode-toggle';
    toggleButton.textContent = '🌙 Tryb ciemny';
    toggleButton.onclick = toggleDarkMode;
   
    // Dodaj style dla przycisku
    toggleButton.style.position = 'fixed';
    toggleButton.style.top = '10px';
    toggleButton.style.right = '10px';
    toggleButton.style.zIndex = '10000';
    toggleButton.style.background = 'var(--button-bg)';
    toggleButton.style.color = 'var(--text-color)';
    toggleButton.style.border = '1px solid var(--border-color)';
    toggleButton.style.padding = '5px 10px';
    toggleButton.style.cursor = 'pointer';
    toggleButton.style.borderRadius = '3px';
    toggleButton.style.fontSize = '12px';
   
    document.body.appendChild(toggleButton);
}
 
// Inicjalizacja po załadowaniu strony
mw.hook('wikipage.content').add(function() {
    createToggleButton();
    checkSavedMode();
});
 
// Alternatywna inicjalizacja dla starszych wersji MediaWiki
$(document).ready(function() {
    createToggleButton();
    checkSavedMode();
});

Aktualna wersja na dzień 15:23, 16 paź 2025

// Dark Mode Manager with Cookie Storage
(function() {
    'use strict';
    
    const DARK_MODE_CLASS = 'skin-dark-mode';
    const COOKIE_NAME = 'mw_dark_mode';
    const COOKIE_EXPIRE_DAYS = 365;
    
    class DarkModeManager {
        constructor() {
            this.init();
        }
        
        init() {
            this.applySavedPreference();
            this.processTemplateMarkers();
            this.createFixedToggle();
            this.watchForDynamicContent();
        }
        
        // Cookie management
        setCookie(name, value, days) {
            const date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            const expires = "expires=" + date.toUTCString();
            document.cookie = name + "=" + value + ";" + expires + ";path=/";
        }
        
        getCookie(name) {
            const nameEQ = name + "=";
            const ca = document.cookie.split(';');
            for(let i = 0; i < ca.length; i++) {
                let c = ca[i];
                while (c.charAt(0) === ' ') c = c.substring(1, c.length);
                if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
            }
            return null;
        }
        
        isDarkMode() {
            const cookie = this.getCookie(COOKIE_NAME);
            return cookie === 'true';
        }
        
        setDarkMode(enabled) {
            this.setCookie(COOKIE_NAME, enabled, COOKIE_EXPIRE_DAYS);
            this.applyDarkMode(enabled);
            this.updateAllToggleButtons(enabled);
        }
        
        toggle() {
            this.setDarkMode(!this.isDarkMode());
        }
        
        applyDarkMode(enabled) {
            if (enabled) {
                document.documentElement.classList.add(DARK_MODE_CLASS);
            } else {
                document.documentElement.classList.remove(DARK_MODE_CLASS);
            }
            this.protectImages();
        }
        
        applySavedPreference() {
            const isDark = this.isDarkMode();
            this.applyDarkMode(isDark);
        }
        
        protectImages() {
            const images = document.querySelectorAll('img, .image, .thumbimage, .mw-file-element');
            images.forEach(img => {
                img.style.filter = 'none';
                img.style.backgroundColor = 'transparent';
            });
        }
        
        processTemplateMarkers() {
            this.replaceCustomElements();
        }
        
        replaceCustomElements() {
            const customElements = document.querySelectorAll('dark-toggle');
            customElements.forEach(element => {
                element.innerHTML = this.createToggleButtonHTML(this.isDarkMode());
                setTimeout(() => {
                    const button = element.querySelector('button');
                    if (button) {
                        button.addEventListener('click', () => this.toggle());
                    }
                }, 0);
            });
        }
        
        createToggleButtonHTML(isDark) {
            const icon = isDark ? '☀️' : '🌙';
            const text = isDark ? ' Light Mode' : ' Dark Mode';
            const modeClass = isDark ? 'light' : '';
            
            return `<button class="dark-mode-toggle-button ${modeClass}">
                <span class="toggle-icon">${icon}</span>
                <span class="toggle-text">${text}</span>
            </button>`;
        }
        
        createFixedToggle() {
            const existingToggle = document.getElementById('darkModeToggleFixed');
            if (existingToggle) existingToggle.remove();
            
            const button = document.createElement('button');
            button.id = 'darkModeToggleFixed';
            button.className = `dark-mode-toggle-fixed ${this.isDarkMode() ? 'light' : ''}`;
            button.innerHTML = this.isDarkMode() ? 
                '<span class="toggle-icon">☀️</span><span class="toggle-text">Light Mode</span>' :
                '<span class="toggle-icon">🌙</span><span class="toggle-text">Dark Mode</span>';
            button.title = this.isDarkMode() ? 'Switch to light mode' : 'Switch to dark mode';
            
            button.addEventListener('click', () => this.toggle());
            document.body.appendChild(button);
        }
        
        updateAllToggleButtons(isDark) {
            const inlineButtons = document.querySelectorAll('.dark-mode-toggle-button');
            inlineButtons.forEach(button => {
                const icon = button.querySelector('.toggle-icon');
                const text = button.querySelector('.toggle-text');
                
                if (isDark) {
                    icon.textContent = '☀️';
                    text.textContent = ' Light Mode';
                    button.classList.add('light');
                } else {
                    icon.textContent = '🌙';
                    text.textContent = ' Dark Mode';
                    button.classList.remove('light');
                }
            });
            
            const fixedButton = document.getElementById('darkModeToggleFixed');
            if (fixedButton) {
                const icon = fixedButton.querySelector('.toggle-icon');
                const text = fixedButton.querySelector('.toggle-text');
                
                if (isDark) {
                    icon.textContent = '☀️';
                    text.textContent = 'Light Mode';
                    fixedButton.classList.add('light');
                    fixedButton.title = 'Switch to light mode';
                } else {
                    icon.textContent = '🌙';
                    text.textContent = 'Dark Mode';
                    fixedButton.classList.remove('light');
                    fixedButton.title = 'Switch to dark mode';
                }
            }
        }
        
        watchForDynamicContent() {
            const observer = new MutationObserver((mutations) => {
                mutations.forEach((mutation) => {
                    if (mutation.addedNodes.length) {
                        mutation.addedNodes.forEach((node) => {
                            if (node.nodeType === Node.ELEMENT_NODE) {
                                if (node.querySelector && node.querySelector('dark-toggle')) {
                                    this.replaceCustomElements();
                                }
                            }
                        });
                    }
                });
            });
            
            observer.observe(document.body, {
                childList: true,
                subtree: true
            });
        }
    }
    
    // Initialize when DOM is ready
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => {
            window.DarkModeManager = new DarkModeManager();
        });
    } else {
        window.DarkModeManager = new DarkModeManager();
    }
})();