DarkDLNure

Робить сайт краще, виправляє неповну темну тему. Для студентів мого вишу.

目前為 2024-02-12 提交的版本,檢視 最新版本

// ==UserScript==
// @name         DarkDLNure
// @namespace    http://dl.nure.ua
// @version      1.4.3
// @description  Робить сайт краще, виправляє неповну темну тему. Для студентів мого вишу.
// @author       Mops
// @match        https://dl.nure.ua/*
// @icon         https://dl.nure.ua/pluginfile.php/1/theme_moove/favicon/1664384975/favicon.ico
// @grant        none
// @license      MIT
// ==/UserScript==

// @ts-check

/**
 * @template T
 * @param {T | T[]} value
 * @returns {T[]}
 */
function arrify(value) {
    return Array.isArray(value) ? value : [value];
}

/**
 * @typedef {Partial<CSSStyleDeclaration & Record<string, string>>} StyleOptions
 */
/**
 * @param {StyleOptions} styles
 */
function styleDeclaration(styles) {
    return Object.entries(styles).map(([cssProperty, cssValue]) => `${cssProperty.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}:${cssValue};`).join("");
}

/**
 * @typedef StyleMap
 * @property {string | string[]} selector
 * @property {string} [parent]
 * @property {StyleOptions} styles
 */
/**
 * @param {StyleMap[]} styleMaps
 */
function createStyles(...styleMaps) {
    return styleMaps.map(
        styleMap => arrify(styleMap.selector).map(
            selector => {
                function addParent(parent) {
                    return typeof parent === "string" && parent.length > 0
                        ? `${parent} ${selector}{${styleDeclaration(styleMap.styles)}}`
                        : `${selector}{${styleDeclaration(styleMap.styles)}}`
                }
                return Array.isArray(styleMap.parent) && styleMap.parent.length > 0
                    ? styleMap.parent.map(parent => addParent(parent)).join("")
                    : addParent(styleMap.parent)
            }
        ).join("")
    ).join("\n")
}

function waitForElement(selector = "body") {
    return new Promise(resolve => {
        if (document.querySelector(selector)) {
            return resolve(document.querySelector(selector));
        }

        const observer = new MutationObserver(mutations => {
            if (document.querySelector(selector)) {
                observer.disconnect();
                resolve(document.querySelector(selector));
            }
        });

        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    });
}

Promise.all([waitForElement("html>body"), waitForElement("html>head")]).then(
    ([body, head]) => {
        let css = createStyles(
            {
                selector: ":root",
                styles: {
                    "--ddln-primary": "#292929",
                    "--ddln-secondary": "#151515",
                    "--ddln-link": "#65a9d7",
                    "--ddln-link-bright": "#617f89",
                    "--ddln-note": "#ced4da",
                },
            }
        );
        if (location.href.startsWith('https://dl.nure.ua/login/index.php')) {
            css += createStyles(
                {
                    selector: "#page",
                    styles: { background: "var(--ddln-secondary) !important" }
                },
                {
                    selector: ["a", ".btn-link", ".btn-link i"],
                    styles: { color: "var(--ddln-link) !important" }
                },
                {
                    selector: ".loginform",
                    styles: { background: "var(--ddln-primary) !important", color: "white" }
                },
                {
                    selector: ".btn-block:not(.btn-secondary)",
                    styles: { border: "none !important", color: "white !important", fontSize: "24px" }
                },
                {
                    selector: ".login-heading + .btn",
                    styles: { background: "white !important", color: "black !important" }
                },
            )
        }
        else if (location.href == 'https://dl.nure.ua/') {
            css += createStyles(
                {
                    parent: ".moove-darkmode",
                    selector: [".contact p.role"],
                    styles: { color: "var(--ddln-note) !important" }
                },
                {
                    selector: ["a", ".btn-link", ".btn-link i"],
                    styles: { color: "var(--ddln-link) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ["#page", "nav.navbar", "#topofscroll", ".summarytext > div > div"],
                    styles: { background: "var(--ddln-secondary) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ["#page-wrapper", "#page-content", "#page-content [role=main]", ".description-inner > * > *"],
                    styles: { background: "var(--ddln-primary) !important", color: "white !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: "nav.navbar *",
                    styles: { color: "white !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: "nav.navbar [role=menubar] > li > a:hover",
                    styles: { background: "var(--ddln-primary) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: "#page.drawers::-webkit-scrollbar-track",
                    styles: { background: "var(--ddln-secondary) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: "#page.drawers::-webkit-scrollbar-thumb",
                    styles: { borderColor: "var(--ddln-secondary) !important" }
                },
            )
        }
        else {

            css += createStyles(
                {
                    parent: ".moove-darkmode",
                    selector: ["a:not(.moremenu.navigation *)", "#page-footer .popover.footer .popover-body .footer-section a"],
                    styles: { color: "var(--ddln-link)" }
                },
                {
                    selector: ["#page-footer a:not(.btn):not(div)"],
                    styles: { color: "var(--ddln-link)" }
                },
                {
                    selector: ["body.moove-darkmode div #page-content .card", ".aalink.focus", "a.focus.autolink", ".aalink:focus", "a.autolink:focus", "#page-footer a:not([class]).focus", "#page-footer a:not([class]):focus", ".arrow_link.focus", ".arrow_link:focus", "a:not([class]).focus", "a:not([class]):focus", ".activityinstance > a.focus", ".activityinstance>a:focus"],
                    styles: { backgroundColor: "transparent !important", boxShadow: "none !important" }
                },
                {
                    selector: [".filemanager .fp-tableview table th > div", ".courseindex-item *"],
                    styles: { textShadow: "none", color: "white" }
                },
                {
                    selector: ".btn.footer-footer",
                    styles: { background: "var(--primary)" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [":not([role=main]) > .nav-tabs .nav-link.active"],
                    styles: { background: "transparent" }
                },
                {
                    selector: [".quizreviewsummary"],
                    styles: { background: "transparent !important" }
                },
                {
                    parent: [".quizreviewsummary", ".path-grade-report-user"],
                    selector: ["tr", "th", "td"],
                    styles: { background: "transparent !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".notification", ".popover-region-footer-container", ".drawer", ".block .block-cards .course-summaryitem", "#topofscroll"],
                    styles: { background: "var(--ddln-primary) !important", padding: "24px 15px !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".user-report-container", ".description .course-description-item", ".nav-item > .nav-link:hover", ".forumnodiscuss", ".custom-select", ".formulation", ".drawer-primary .drawercontent .list-group .list-group-item"],
                    styles: { background: "var(--ddln-secondary) !important", color: "white !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".popover-body > *", ".list-group-item", "[data-region=right-hand-drawer].drawer .footer-container"],
                    styles: { background: "var(--ddln-primary) !important", color: "white !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ".activity-header",
                    styles: { background: "var(--ddln-primary) !important", margin: "0 !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".fp-viewbar:not(.disabled) a.checked", ".btn-secondary:focus"],
                    styles: { background: "black !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ["#page-wrapper", "table tr.grouper td", ".generaltable tbody tr:nth-of-type(even)", ".activity-add", ".block-add", ".dropdown-menu", ".notification", ".bg-light", ".bg-white", "[role=main] .icons-collapse-expand:hover", "[role=main] .icons-collapse-expand:focus", ".progress"],
                    styles: { background: "var(--ddln-secondary) !important" }
                },
                {
                    selector: ".fp-iconview .fp-filename-field",
                    styles: { position: "relative !important", height: "fit-content !important" }
                },
                {
                    selector: ".fp-iconview .fp-filename-field > *",
                    styles: { background: "var(--ddln-secondary) !important", overflow: "visible", textWrap: "pretty" }
                },
                {
                    selector: ".filemanager .fp-content",
                    styles: { maxHeight: "none !important", height: "fit-content" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".filemanager .fp-tableview table th", ".filemanager .fp-tableview table td", "#region-main", ".qtype_essay_response.readonly", "button.carousel-navigation-link:hover", ".course-description-item.summarytext > * > * > *", ".moodle-dialogue-base .moodle-dialogue-wrap", ".moremenu .nav-link:hover", ".moremenu .nav-link:focus", ".forumpost.unread *", ".simplesearchform .btn-submit"],
                    styles: { background: "var(--ddln-primary) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".maincalendar .calendarmonth .clickable:hover", ".page-link", ".que .info", ".attbtn"],
                    styles: { background: "var(--ddln-secondary) !important", border: "1px solid black !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".activity-item .activity-dates"],
                    styles: { color: "var(--ddln-note)" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".activity-item .activity-completion button.btn", ".activity-item .activity-completion a[role=\"button\"].btn"],
                    styles: { backgroundColor: "transparent", border: "1px solid var(--ddln-secondary)", color: "var(--ddln-note)", padding: "4px 8px", filter: "none" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".activity-item .activity-completion button.btn:hover", ".activity-item .activity-completion a[role=\"button\"].btn:hover"],
                    styles: { borderColor: "var(--ddln-secondary)" }
                },
                {
                    selector: ".outcome.clearfix",
                    styles: { backgroundColor: "#00ff000f !important", color: "var(--success) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".generaltable td.submissionstatussubmitted", ".generaltable td.earlysubmission", ".generaltable td.submissiongraded"],
                    styles: { backgroundColor: "transparent !important", color: "var(--success) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".generaltable td.submissionnotgraded", ".generaltable td.submissionstatusdraft"],
                    styles: { backgroundColor: "transparent !important", color: "var(--danger) !important" }
                },
                {
                    selector: ".navigation .nav-link.active",
                    styles: { borderColor: "black !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ".navigation .nav-link.active",
                    styles: { borderColor: "white !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".dropdown-divider", ".nav-tabs", ".navbar.fixed-top .divider", ".bg-light"],
                    styles: { borderColor: "black !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".activity-item .activity-afterlink", ".activity-item .activity-altcontent.activity-description", ".filemanager .fp-tableview table th", ".mt-0", ".border", ".activity-navigation .larrow", ".activity-navigation .rarrow", ".course-summaryitem", ".course-section", ".activity-item:not(.activityinline)", ".forumpost", ".activity-information .activity-dates", ".moodle-dialogue-base .moodle-dialogue-wrap > *", ".moodle-dialogue-base .moodle-dialogue-wrap", ".mform fieldset", ".qnbutton", ".completion-info", ".fp-iconview .fp-thumbnail", ".forumpost.unread .row.header"],
                    styles: { borderColor: "var(--ddln-secondary) !important" }
                },
                {
                    selector: ["table th", "table td"],
                    styles: { borderColor: "var(--ddln-primary) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".popover-region-container", ".popover-region-footer-container", ".bg-white:not(.navbar):not(.card-footer)"],
                    styles: { borderColor: "var(--ddln-primary) !important" }
                },
                {
                    selector: [".nav-tabs .nav-link", ".nav-tabs .nav-link:hover", ".quizreviewsummary tr > *"],
                    styles: { border: "none !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".btn-secondary", ".btn-secondary:hover", ".fp-iconview .fp-thumbnail > img"],
                    styles: { border: "none", backgroundColor: "var(--ddln-secondary)", color: "white" }
                },
                {
                    selector: ".border",
                    styles: { borderRadius: "10px" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ["table tr:hover", "table tr:hover td", ".submissionnotgraded", "a.nav-link.active", "a.nav-link.active:hover"],
                    styles: { color: "var(--ddln-link-bright) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ["pre", "a.courseindex-link"],
                    styles: { color: "#ced4da !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ["#page-footer .column-left a.btn", ".contact p.role", ".block-cards span.categoryname", ".navbar-nav .show>.nav-link", ".navbar-nav .active>.nav-link", ".navbar-nav .nav-link.show", ".navbar-nav .nav-link.active", ".submenu .header"],
                    styles: { color: "white !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".ygtvcell .icon", ".moove-darkmode .gradeitemheader .icon", ".moove-darkmode .navbar-light .navbar-toggler", ".moove-darkmode .notification-image", ".moove-darkmode nav.fixed-top .icon:not([role=popover] *):not(.popover-region-header-actions *)", ".moove-darkmode [role=navigation] .icon", ".moove-darkmode .drawer.drawer-left .drawertoggle", ".moove-darkmode .courseindex-item:not(.pageitem):hover .icon", ".btn.drawertoggle"],
                    styles: { filter: "invert(1)" }
                },
                {
                    selector: ["[role=main] .icons-collapse-expand i", ".btn-footer-popover i"],
                    styles: { filter: "invert(0) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ".btn-outline-secondary:not(:hover)",
                    styles: { filter: "brightness(2)" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ["#page.drawers::-webkit-scrollbar-track", ".course-section .availabilityinfo"],
                    styles: { background: "var(--ddln-secondary) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: "#page.drawers::-webkit-scrollbar-thumb",
                    styles: { borderColor: "var(--ddln-secondary) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ".drawercontent::-webkit-scrollbar-track",
                    styles: { background: "var(--ddln-primary) !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ".drawercontent::-webkit-scrollbar-thumb",
                    styles: { borderColor: "var(--ddln-primary) !important" }
                },
                {
                    selector: [".course-summaryitem .row a", ".course-summaryitem .row a > .summaryimage"],
                    styles: { height: "100%" }
                },
                {
                    selector: [".pagelayout-incourse #region-main", ".drawer.drawer-right.show"],
                    styles: { padding: "0 !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: [".drawer", "#theme_boost-drawers-courseindex"],
                    styles: { padding: "0 !important" }
                },
                {
                    selector: ["[role=main] > .nav-tabs", "#region-main", "[role=main] .alert", "#user-notifications .alert"],
                    styles: { marginTop: "25px" }
                },
                {
                    selector: ["#maincontent", ".content-item-container .view-more", ".course-listitem .pl-1.pr-1:first-child"],
                    styles: { display: "none !important" }
                },
                {
                    parent: ".moove-darkmode",
                    selector: ".btn-outline-secondary",
                    styles: { padding: "6px 12px" }
                },
                {
                    selector: "notifications",
                    styles: { padding: "6px 12px" }
                },
            )
            function changeElementSelfStyles(darkmode) {
                let ftnavs = [...document.body.querySelectorAll('.fixed-top a:not([id]).nav-link') ?? []]
                if (ftnavs.length) ftnavs.forEach(ftnav => {
                    if (ftnav instanceof HTMLElement) ftnav.style.color = `${darkmode ? 'white' : 'black'} !important`
                });
            }
            changeElementSelfStyles(document.body.classList.contains('moove-darkmode'));
            waitForElement('toggle-darkmode-input').then(themeToggleButton => themeToggleButton.addEventListener(
                'click',
                () => changeElementSelfStyles(!document.body.classList.contains('moove-darkmode'))
            ))
        }
        waitForElement('[title="We stand with Ukraine"]').then(uaflag => uaflag.remove()) // this flag is so annoying
        const styleElement = document.createElement("style")
        styleElement.id = "DarkNurePlugin"
        styleElement.innerText = css
        document.head.prepend(styleElement)
        console.log('[%cDark%cDLNure%c] plugin enabled.', 'color: #55c', 'color: yellow', '');
    }
)

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址