// ==UserScript==
// @name DarkDLNure
// @namespace http://dl.nure.ua
// @version 1.4.2
// @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-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-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",
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', '');
}
)