您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Sketchful dark theme improvements
/* eslint-disable no-undef */ // ==UserScript== // @name Dark Mode+ // @match https://sketchful.io/ // @grant none // @version 1.3.1 // @description Sketchful dark theme improvements // @author bebell // @run-at body-end // jshint esversion: 6 // @namespace https://greasyfork.org/users/281093 // ==/UserScript== let grayCanvas = localStorage.grayCanvas ? JSON.parse(localStorage.grayCanvas) : true; const pageHTML = document.querySelector('html'); const canvas = document.querySelector('#canvas'); const ctx = canvas.getContext('2d'); const themes = document.querySelector('#menuSettingsTheme'); const brightnessLayer = document.createElement('div'); const settingsContainer = document.querySelector( '#menuSettings > div.row.justify-content-center > div' ); wrap(canvas, brightnessLayer); const styleRules = [ '.dark .table { color: white !important; }', '.table { color: black !important; }', '.dark { background-color: #1d1f22 !important; }', '.dark .table th, html.dark .table thead, html.dark .table td { border-color: #454d55 !important; }', '.table th, .table thead, .table td { border-color: #dee2e6 !important; }', '.dark .table.table-striped tbody tr:nth-of-type(odd) { background-color: rgba(255,255,255,.05)!important; }', '.table.table-striped tbody tr:nth-of-type(odd) { background-color: rgba(0,0,0,.05)!important; }', '.dark #gameChatList li:not(.chatAdmin) b { color: #BBB }', '#gameChatList li:not(.chatAdmin) b { color: black }', '.dark .gameAvatarRank { color: #148FA2 }', '.dark #gameWinners li b { color: white !important }', '.dark .gameSticky { color: white !important }', '#gameSticky font { color: black!important }', '.dark #gameSticky font { color: #eee!important }' ]; const sheet = window.document.styleSheets[window.document.styleSheets.length - 1]; styleRules.forEach((rule) => sheet.insertRule(rule)); let btn; const stored = localStorage.dark; let darkMode = stored ? JSON.parse(stored) : JSON.parse(localStorage.getItem('settings')).dark; if (darkMode) pageHTML.classList.add('dark'); else pageHTML.classList.remove('dark'); brightnessLayer.style.filter = darkMode ? `brightness(${localStorage.canvasBrightness})` || '' : ''; themes.onchange = (e) => { if (e.target.value === 'Dark' && !grayCanvas) { pageHTML.classList.add('dark'); e.stopImmediatePropagation(); } }; document.querySelector('#menu > div.menuNav > ul > li:nth-child(5) > a').onclick = () => { themes.value = darkMode ? 'Dark' : 'Light'; }; function wrap(toWrap, wrapper) { toWrap.parentNode.appendChild(wrapper); wrapper.appendChild(toWrap); return wrapper; } function darkClassObserver(mutations) { for (const mutation of mutations) { if (mutation.attributeName !== 'class') return; darkMode = pageHTML.classList.contains('dark'); localStorage.dark = darkMode; brightnessLayer.style.filter = darkMode ? `brightness(${localStorage.canvasBrightness})` || '' : ''; fixColors(); grayCanvas && toggleCanvasDarkMode(); } } const gameObserver = new MutationObserver(darkClassObserver); gameObserver.observe(pageHTML, { attributes: true }); (function addBrightnessSlider() { const sliderContainer = document .querySelector('#menuSettingsVolumeIcon') .parentNode.cloneNode(true); sliderContainer.getElementsByTagName('h5')[0].textContent = 'Canvas Brightness'; const icon = sliderContainer.firstChild; icon.remove(); const newIcon = document.createElement('img'); newIcon.setAttribute('style', 'width: 64px; height: 64px'); newIcon.setAttribute('class', 'mr-3 lazy'); newIcon.src = 'https://i.imgur.com/GkVJWun.gif'; const slider = sliderContainer.querySelector('#menuSettingsVolume'); slider.value = localStorage.canvasBrightness || 1; slider.onchange = changeBrightness; sliderContainer.insertBefore(newIcon, sliderContainer.firstChild); const grayCanvasToggle = document.createElement('div'); grayCanvasToggle.setAttribute( 'style', 'display: flex; justify-content: space-between' ); const label = document.createElement('label'); label.style.fontSize = '20px'; label.textContent = 'Gray Canvas'; const btnSwitch = document.createElement('label'); const input = document.createElement('input'); const span = document.createElement('span'); span.setAttribute('class', 'slider round'); input.type = 'checkbox'; input.checked = grayCanvas; input.onchange = () => { grayCanvas = input.checked; localStorage.grayCanvas = grayCanvas; if (!grayCanvas && darkMode) { themes[0].selected = true; themes.dispatchEvent(new Event('change')); pageHTML.classList.add('dark'); themes.value = darkMode ? 'Dark' : 'Light'; } }; btnSwitch.setAttribute('class', 'switch'); btnSwitch.append(input, span); grayCanvasToggle.append(label, btnSwitch); settingsContainer.append(sliderContainer, grayCanvasToggle); })(); (function toggleButtons() { btn = document.querySelector('#saveButton').cloneNode(); btn.style.right = '100px'; btn.setAttribute('data-original-title', 'Toggle Theme'); btn.title = 'Toggle Theme'; updateToggleStyle(); btn.onclick = toggleDarkMode; document.querySelector('#gameInterface').append(btn); })(); function changeBrightness() { brightnessLayer.style.filter = `brightness(${this.value})`; localStorage.canvasBrightness = this.value; } function updateToggleStyle() { btn.style.backgroundImage = darkMode ? 'url(https://i.imgur.com/imL02Mq.gif)' : 'url(https://i.imgur.com/2ZdZ9oh.gif)'; } function toggleDarkMode() { if (!grayCanvas) { pageHTML.classList.toggle('dark'); } else { themes[darkMode ? 0 : 1].selected = true; themes.dispatchEvent(new Event('change')); } } function toggleCanvasDarkMode() { const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height); const data = imgData.data; for (let i = 0; i < data.length; i += 4) { const [r, g, b] = [data[i], data[i + 1], data[i + 2]]; if (r === 255 && g === 255 && b === 255 && darkMode) { const color = 68; data[i] = color; data[i + 1] = color; data[i + 2] = color; } else if (r === 68 && g === 68 && b === 68 && !darkMode) { const color = 255; data[i] = color; data[i + 1] = color; data[i + 2] = color; } } ctx.putImageData(imgData, 0, 0); } function fixColors() { let names = document.getElementsByClassName('gameAvatarName'); updateToggleStyle(); if (!names.length) {names = document.getElementsByClassName('gameSettingsAvatarName');} for (const name of names) { if (darkMode && name.style.color === 'black') { name.style.color = '#ccc'; } else if (!darkMode && name.style.color === 'rgb(204, 204, 204)') { name.style.color = 'black'; } } } const colorObserver = new MutationObserver(() => { fixColors(); }); colorObserver.observe(document.querySelector('#gamePlayersList'), { childList: true });