Greasy Fork

Greasy Fork is available in English.

UESP Enhanced Dark Mode Toggle with State Persistence

Adds a button to toggle a fully enhanced dark theme on UESP, with state persistence using localStorage.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         UESP Enhanced Dark Mode Toggle with State Persistence
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Adds a button to toggle a fully enhanced dark theme on UESP, with state persistence using localStorage.
// @author       SignedBytes
// @match        https://en.uesp.net/wiki/*
// @grant        none
// @license      CC BY 4.0
// @copyright    2024 SignedBytes (gasper.app)
// ==/UserScript==

(function () {
    'use strict';

    const DARK_THEME_KEY = 'darkThemeEnabledUESP'; // Key for storing state in localStorage

    function addDarkTheme() {
        const darkStyle = document.createElement('style');
        darkStyle.id = 'dark-theme-style';
        darkStyle.innerHTML = `
            /* General body styling, remove background image */
            body, #content {
                background-color: #000000 !important;
                background-image: none !important; /* Disables the background image */
                color: #e0e0e0 !important;
            }

            /* Header and navigation bar */
            #header, #p-navigation, #p-search, .mw-body {
                background-color: #1a1a1a !important;
                color: #e0e0e0 !important;
                border-bottom: 1px solid #444 !important;
            }

            /* Logo styling */
            #uespMainLogo {
                background-color: #1a1a1a !important;
                border: 1px solid #444 !important;
            }

            /* Sidebar sections */
            #column-one, #p-tb, #p-logo, .portlet, .pBody {
                background-color: #1a1a1a !important;
                color: #e0e0e0 !important;
                border: none !important;
            }

            /* Sidebar links */
            #p-logo a, #p-navigation a, #p-search a, .portlet a {
                color: #bb86fc !important;
            }
            #p-logo a:hover, #p-navigation a:hover, #p-search a:hover, .portlet a:hover {
                color: #ffffff !important;
            }

            /* Main content links */
            a, .mw-body a {
                color: #bb86fc !important;
            }
            a:hover, .mw-body a:hover {
                color: #ffffff !important;
            }

            /* Tables, infoboxes, and navigation tables */
            .wikitable,table.wikitable > tr > th, table.wikitable > * > tr > th, #genMidColor, .infobox, .mw-body-content table, .sidebar-content, .toc, .mw-headline,
            .navbox, .navbox-inner, .navbox-group, .navbox-title, .navbox-list {
                background-color: #1a1a1a !important;
                color: #e0e0e0 !important;
                border: 1px solid #444 !important;
            }

            /* Table of Contents number styling */
            .tocnumber {
                color: #bb86fc !important; /* Matches the links */
            }

            /* Navigation table titles and headers */
            .navbox-title, .navbox-group {
                background-color: #333 !important;
                color: #e0e0e0 !important;
            }
            .navbox-list a {
                color: #bb86fc !important;
            }
            .navbox-list a:hover {
                color: #ffffff !important;
            }

            /* Footer note in navigation boxes */
            .navbox-abovebelow {
                background-color: #1a1a1a !important;
                color: #dcdcdc !important;
                border-top: 1px solid #444 !important;
            }
            .navbox-abovebelow b {
                color: #ffffff !important;
            }

            /* Action menu background */
            #p-cactions ul li a {
                background: #333 !important;
                color: #e0e0e0 !important;
            }
            #p-cactions ul li.selected a {
                background: #444 !important;
                color: #ffffff !important;
            }

            /* Category links section */
            #catlinks {
                background-color: #1a1a1a !important;
                color: #e0e0e0 !important;
                border-top: 1px solid #444 !important;
            }
            #catlinks a {
                color: #bb86fc !important;
            }
            #catlinks a:hover {
                color: #ffffff !important;
            }

            /* Headers */
            h1, h2, h3, h4, h5, h6, .mw-headline {
                color: #ffffff !important;
            }

            /* Featured Article Div */
            #uespFADiv {
                background-color: #1a1a1a !important;
                border: 1px solid #444 !important;
                color: #e0e0e0 !important;
            }

            /* News Div */
            #uespNewsDiv {
                background-color: #1a1a1a !important;
                border: 1px solid #444 !important;
                color: #e0e0e0 !important;
            }

            /* Footer */
            #footer, .footer-portlet {
                background-color: #1a1a1a !important;
                color: #e0e0e0 !important;
            }

            /* Popups */
            .mwe-popups {
                background-color: #1a1a1a !important;
            }

            /* Buttons */
            .btn, #searchButton {
                background-color: #333 !important;
                color: #e0e0e0 !important;
                border: 1px solid #555 !important;
            }
            .btn:hover, #searchButton:hover {
                background-color: #555 !important;
                color: #ffffff !important;
            }

            /* Tooltip content */
            .tooltip {
                background-color: #333 !important;
                color: #e0e0e0 !important;
                border: 1px solid #555 !important;
            }

            /* Pagination and breadcrumbs */
            .pagination li a, .pagination li span, .breadcrumb {
                background-color: #333 !important;
                color: #e0e0e0 !important;
                border: 1px solid #555 !important;
            }

            /* Links in tables and lists */
            .wikitable a, .toc a {
                color: #bb86fc !important;
            }

            /* Navbar links */
            .navbar a {
                color: #bb86fc !important;
            }

            /* Table borders */
            th, td {
                border: 1px solid #444 !important;
                color: #e0e0e0 !important;
            }

            /* Background for headings and infobox headers */
            .wikitable th, .infobox th, .sidebar-heading {
                background-color: #333 !important;
                color: #e0e0e0 !important;
            }

            /* Thumbnail images and captions */
            .thumbinner {
                background-color: #1a1a1a !important;
                color: #e0e0e0 !important;
                border: 1px solid #444 !important;
            }
            .thumbcaption, .magnify {
                background-color: #1a1a1a !important;
                color: #dcdcdc !important;
            }

            /* Additional thumbnail styling */
            div.thumb div {
                background-color: #1a1a1a !important;
                border: 1px solid #444 !important;
                color: #e0e0e0 !important;
            }

            /* Quote boxes */
            .quotebox {
                background-color: #1e1e1e !important;
                color: #dcdcdc !important;
                border: 1px solid #444 !important;
            }

            /* Links within quote boxes */
            .quotebox a {
                color: #bb86fc !important;
            }
            .quotebox a:hover {
                color: #ffffff !important;
            }
        `;
        document.head.appendChild(darkStyle);
    }

    function removeDarkTheme() {
        const darkStyle = document.getElementById('dark-theme-style');
        if (darkStyle) {
            darkStyle.remove();
        }
    }

    function toggleDarkTheme() {
        const isDarkThemeEnabled = localStorage.getItem(DARK_THEME_KEY) === 'true';
        if (isDarkThemeEnabled) {
            removeDarkTheme();
            localStorage.setItem(DARK_THEME_KEY, 'false');
        } else {
            addDarkTheme();
            localStorage.setItem(DARK_THEME_KEY, 'true');
        }
    }

    function initializeDarkTheme() {
        const isDarkThemeEnabled = localStorage.getItem(DARK_THEME_KEY) === 'true';
        if (isDarkThemeEnabled) {
            addDarkTheme();
        }
    }

    const toggleButton = document.createElement('button');
    toggleButton.textContent = 'Toggle Dark Mode';
    toggleButton.style.position = 'fixed';
    toggleButton.style.bottom = '20px';
    toggleButton.style.right = '20px';
    toggleButton.style.zIndex = '1000';
    toggleButton.style.padding = '10px 15px';
    toggleButton.style.backgroundColor = '#007bff';
    toggleButton.style.color = '#fff';
    toggleButton.style.border = 'none';
    toggleButton.style.borderRadius = '5px';
    toggleButton.style.cursor = 'pointer';
    toggleButton.style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.1)';
    toggleButton.addEventListener('click', toggleDarkTheme);

    document.body.appendChild(toggleButton);
    initializeDarkTheme();
})();