// Inspired by the Stylus app: // NOTE: This file is moved to /opt/rosenrot, so editing it here doesn't have direct effects on the runtime!! // Main part of the code: switch on the domain and select the corresponding style var styles = null; // console.log(document.domain); switch (document.domain) { case "forum.effectivealtruism.org": styles = ` /* .Layout-main { margin-left: 100px; } .SingleColumnSection-root { width: 1000px !important; max-width: 1400px !important; padding-left: 100px !important; } .NavigationStandalone-sidebar { display: none; } .intercom-lightweight-app{ display: none; } */ `; break; case "nationstates.net": styles = ` .adidentifier { display: none; } `; break; case "mail.proton.me": styles = ` /* .item-container-row.read, .item-container.read { background-color: white; } .item-container-row.unread, .item-container.unread { background-color: #E8E8E8; } .selection .item-container-row.item-is-selected, .item-container.item-is-selected { background-color: var(--selection-background-color) !important; } zoom: 0.625 !important; */ `; break; case "forum.nunosempere.com": styles = ` body { zoom: 0.625 !important; } `; break; case "search.brave.com": styles = ` .download-button, a[href^="https://brave.com/download/"], .download-cta { display: none !important; } `; break; case "search.nunosempere.com": styles = ` /* body { zoom: 1.8; } */ footer { display: none; } `; break; case "reddit.com": // fallthrough case "old.reddit.com": styles = ` /* kill sidebar ads */ .ad-container, a[href^="https://alb.reddit.com"] a[href="/premium"], [data-promoted^="true"], #eu-cookie-policy, .infobar-toaster-container, .listingsignupbar, .native-ad-container, .native-sidebar-ad, .premium-banner-outer, .promotedlink, .promoted { display: none !important; } `; break; case "twitter.com": case "x.com": styles = ` /* hide promoted tweets */ :has(meta[property="og:site_name"][content="Twitter"]) [data-testid="cellInnerDiv"]:has(svg + [dir="auto"]) { display: none; } [data-testid^="placementTracking"] { display: none; } /* hide what's happening section */ :has(meta[property="og:site_name"][content="Twitter"]) [aria-label="Timeline: Trending now"] { display: none !important; } [data-testid^="sidebarColumn"] { display: none !important; } /* Hide DMs v2 */ [data-testid^="DMDrawerHeader"] { display: none; } /* Tweak main column */ [data-testid^="primaryColumn"] { min-width: 900px; max-width: 900px; } [data-testid^="cellInnerDiv"] { min-width: 700px; max-width: 700px; } [aria-label^="Timeline: Conversation"]{ margin-left: 145px; } [data-testid^="DMDrawer"]{ display: none; } /* Delete a few unused or annoying elements */ [aria-label^="Verified Orgs"] { display: none; } [aria-label^="Lists"] { display: none; } [aria-label^="Communities"] { display: none; } [aria-label^="Primary"] { margin-top: 50px; } [role^="progressbar"]{ display: none; } /* hide video */ [data-testid^="videoPlayer"] { display: none !important; } /* No change of colors in hover: seemed like a good idea but it fucks up going back and forth *:hover { background-color: white !important; background-color: inherit !important; transition: none !important; } */ /* Hide go to top button */ [aria-label^="New posts are available. Push the period key to go to the them."]{ display: none; } /* No transparency at the top */ [aria-live^="polite"]{ background: white !important; } `; break; case "": break; default: console.log(`Domain: ${document.domain}`); console.log("No custom style"); } if (styles != null) { var styleSheet = document.createElement("style"); styleSheet.innerText = styles; document.head.appendChild(styleSheet); console.log("Style changed"); } // Extra: Replace default alert with new function // whose style can be changed! window.alert = (message) => { let alertDiv = document.getElementById("customAlert"); if (!alertDiv) { const html = `

`; document.body.insertAdjacentHTML("beforeend", html); alertDiv = document.getElementById("customAlert"); document.getElementById("alertOkButton").onclick = () => { alertDiv.classList.remove("visible"); document.removeEventListener("keydown", dismissAlert); }; } const dismissAlert = (event) => { if ( event.key === "Enter" /*&& event.ctrlKey*/ && alertDiv.classList.contains("visible") ) { alertDiv.classList.remove("visible"); document.removeEventListener("keydown", dismissAlert); } }; document.addEventListener("keydown", dismissAlert); document.getElementById("alertMessage").textContent = message; alertDiv.classList.add("visible"); }; // Extra: hide video players on twitter if (document.domain == "twitter.com" || document.domain == "x.com") { // Function to hide the grandparent of video players // takes 0.014ms to run, so performance is not the concern here. // timed with console.time, console.timeEnd function hideVideoPlayerGrandparent() { document .querySelectorAll('[data-testid="videoPlayer"]') .forEach(function (videoPlayer) { var grandparentElement = videoPlayer.parentElement.parentElement.parentElement.parentElement .parentElement.parentElement; var newTextElement = document.createElement("div"); newTextElement.textContent = " [ twitter video ] "; newTextElement.style["margin-top"] = "10px"; newTextElement.style["margin-left"] = "10px"; newTextElement.style["margin-bottom"] = "10px"; grandparentElement.replaceWith(newTextElement); }); } // Create a new MutationObserver instance var observer = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { if (mutation.addedNodes.length) { hideVideoPlayerGrandparent(); // Call the function to hide video players } }); }); // Options for the observer (which mutations to observe) var config = { childList: true, subtree: true }; // Start observing the target node for configured mutations observer.observe(document.body, config); // Call the function initially to hide any video players on initial load hideVideoPlayerGrandparent(); } // document.body.style.visibility = "visible"; // Add some code to filter out articles for Sentinel function filterDetailsByKeywordHide(keyword) { // Get all the
elements on the page const detailsElements = document.querySelectorAll("details"); // Loop through each
element detailsElements.forEach((element) => { // Find the

element inside the

that follows the first

(assumed to be the summary here) const summaryElement = element.querySelector("h3 + p"); // Check if the summary text includes the keyword (case-insensitive match) if ( summaryElement && summaryElement.textContent.toLowerCase().includes(keyword.toLowerCase()) ) { // If the keyword is found, hide this
element element.style.display = "none"; } }); } console.log("Hello world");