// ==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) // @downloadURL none // ==/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(); })();