您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Comick Client (Alpha)
// ==UserScript== // @name Comick Client // @namespace https://github.com/Nublord33/Comick-CLient // @version 0.1 // @description Comick Client (Alpha) // @author Nublord33/SkibidiSKid(joke name) // @match https://comick.io/* // @license Apache license 2.0 // @grant none // ==/UserScript== (function() { 'use strict'; const SOLID_COLOR = '#121318'; // Original solid background color const SECONDARY_COLOR = '#212328'; // Secondary color const OTHER_COLOR = '#3a3f47'; // New color for specific <a> elements const ICON_COLOR = '#e38783'; // Icon color for <path> elements with fill-rule="evenodd" const FONT_COLOR = '#e5e7eb'; // Font color const FONT_STYLE = 'JetBrains Mono, monospace'; // Font style // Class name variables with dots for CSS selectors const COMICK_STATUS = '.flex-1.mt-0.py-3.px-2.h-12.border.border-gray-300.dark\\:bg-gray-700.dark\\:border-gray-700.rounded'; const BUTTON_CLASS = '.md\\:w-96.h-12.btn.px-2.py-3.flex-1'; const A_CLASS = '.flex-1.md\\:w-96.h-12.btn.btn-primary.px-2.py-3.flex.items-center.rounded.flex.flex-1'; const SELECT_SECONDARY_CLASS = '.cursor-pointer.pl-2.pr-6.py-1.border.border-gray-300.rounded.dark\\:border-gray-600'; const TABLE_CLASS = '.table-fixed.w-full.whitespace-nowrap'; const UL_CLASS = '.scrollbox.dark\\:scrollbox-dark.mt-3.mb-3.flex.flex-wrap.max-h-32.md\\:max-h-48.xl\\:max-h-48.overflow-y-auto.items-center.scrollbar-thin.scrollbar-thumb-gray-300.scrollbar-track-gray-100.dark\\:scrollbar-thumb-gray-600.dark\\:scrollbar-track-gray-700.scrollbar-thumb-rounded'; const COMICK_TOPBAR = '.flex.items-center.justify-between.space-x-2.px-3.sm\\:px-6.lg\\:px-8.py-2.lg\\:border-b.border-gray-100.dark\\:border-gray-700.max-sm\\:overflow-x-auto.drop-shadow-sm.bg-white\\/95.dark\\:bg-gray-800\\/95'; const BUTTON_SECONDARY_CLASS = '.btn.w-full.text-center.text-xs.px-0.border-none'; const SCROLLBOX_CLASS = '.max-h-64.overflow-y-auto.scrollbox.dark\\:scrollbox-dark.scrollbar-thin.scrollbar-thumb-gray-300.scrollbar-track-gray-100.dark\\:scrollbar-thumb-gray-600.dark\\:scrollbar-track-gray-700.scrollbar-thumb-rounded.mt-1'; // Long class selectors as variables const COMIC_DESC = '.comic-desc.xl\\:h-auto.max-h-96.overflow-y-auto.scrollbox.dark\\:scrollbox-dark.scrollbar-thin.scrollbar-thumb-gray-300.scrollbar-track-gray-100.dark\\:scrollbar-thumb-gray-600.dark\\:scrollbar-track-gray-700.scrollbar-thumb-rounded.my-3.md\\:my-5.prose.prose-hr\\:my-3.dark\\:prose-invert.max-w-none.prose-table\\:w-auto'; const SCROLLBOX_CLASS_1 = '.scrollbox.dark\\:scrollbox-dark.mt-3.mb-3.flex.flex-wrap.max-h-32.md\\:max-h-48.xl\\:max-h-48.overflow-y-auto.items-center.scrollbar-thin.scrollbar-thumb-gray-300.scrollbar-track-gray-100.dark\\:scrollbar-thumb-gray-600.dark\\:scrollbar-track-gray-700.scrollbar-thumb-rounded'; const SCROLLBOX_CLASS_2 = '.flex.items-center.max-w-max.overflow-x-auto.scrollbox.dark\\:scrollbox-dark.scrollbar-thin.scrollbar-thumb-gray-300.scrollbar-track-gray-100.dark\\:scrollbar-thumb-gray-600.dark\\:scrollbar-track-gray-700.scrollbar-thumb-rounded.space-x-3'; //Set solid background and remove background image if not an image. function setSolidBackground(element, color) { element.style.backgroundColor = color; if (element.tagName.toLowerCase() !== 'img') { element.style.backgroundImage = 'none'; } } // Helper: Set color for <path> elements with fill-rule="evenodd" and clip-rule="evenodd" function setIconColorForPaths() { document.querySelectorAll('path').forEach(path => { path.style.color = ICON_COLOR; // Apply the icon color to all paths }); } //Apply styles to multiple selectors function applyStylesToSelectors(selectors, color) { selectors.forEach(selector => { document.querySelectorAll(selector).forEach(element => { setSolidBackground(element, color); element.style.border = 'none'; // Remove the border }); }); } // Function to apply styles to all relevant elements function applyCustomStyles() { // Apply solid background to body setSolidBackground(document.body, SOLID_COLOR); // Apply FONT_COLOR and FONT_STYLE to body document.body.style.color = FONT_COLOR; document.body.style.fontFamily = FONT_STYLE; // Apply styles to individual elements applyStylesToSelectors([BUTTON_CLASS, A_CLASS], OTHER_COLOR); applyStylesToSelectors([SELECT_SECONDARY_CLASS, COMICK_STATUS], SECONDARY_COLOR); document.querySelectorAll(TABLE_CLASS).forEach(table => { table.querySelectorAll('*').forEach(element => { if (element.tagName.toLowerCase() === 'input' && element.type === 'text' && element.placeholder === 'Goto chap') { setSolidBackground(element, SECONDARY_COLOR); // Apply secondary color return; } if (element.tagName.toLowerCase() !== 'i' || !element.classList.contains('flag-icon')) { setSolidBackground(element, SOLID_COLOR); // Apply solid color to other elements } }); }); // Apply solid background to specific content areas applyStylesToSelectors([COMIC_DESC, SCROLLBOX_CLASS_1, SCROLLBOX_CLASS_2], SOLID_COLOR); // Style list items document.querySelectorAll(UL_CLASS).forEach(ul => { ul.querySelectorAll('li[title^="Vote:"]').forEach(li => { li.style.backgroundColor = SECONDARY_COLOR; }); }); document.querySelectorAll(SCROLLBOX_CLASS_2).forEach(div => { div.querySelectorAll('.dark\\:hover\\:bg-gray-600').forEach(innerDiv => { innerDiv.style.backgroundColor = SECONDARY_COLOR; }); }); // Apply styles to secondary buttons applyStylesToSelectors([BUTTON_SECONDARY_CLASS], OTHER_COLOR); // Apply styles to scrollboxes applyStylesToSelectors([SCROLLBOX_CLASS], SOLID_COLOR); // Apply styles to the top bar applyStylesToSelectors([COMICK_TOPBAR], SECONDARY_COLOR); // Apply styles to .bg-blue-500 elements applyStylesToSelectors(['.bg-blue-500'], OTHER_COLOR); // Apply ICON_COLOR to <path> elements with fill-rule="evenodd" and clip-rule="evenodd" setIconColorForPaths(); } // Initial style application applyCustomStyles(); // Reapply styles on navigation changes const originalPushState = history.pushState; history.pushState = function(...args) { originalPushState.apply(history, args); applyCustomStyles(); }; window.addEventListener('popstate', applyCustomStyles); document.addEventListener("DOMContentLoaded", applyCustomStyles); // MutationObserver for dynamically loaded content let styleTimeout; const observer = new MutationObserver((mutationsList) => { clearTimeout(styleTimeout); styleTimeout = setTimeout(() => { for (let mutation of mutationsList) { if (mutation.type === 'childList' || mutation.type === 'attributes') { applyCustomStyles(); break; } } }, 100); }); observer.observe(document.body, { childList: true, subtree: true, attributes: true }); // Hook into fetch() to handle dynamically loaded content const originalFetch = window.fetch; window.fetch = async function(...args) { const response = await originalFetch(...args); applyCustomStyles(); return response; }; })();