// ==UserScript==
// @name Tumblr revert vertical navigation update
// @license MIT
// @version 2.0
// @description Reverts the vertical navigation layout copied from Twitter back to the original Tumblr layout
// @author dragongirlsnout
// @match https://www.tumblr.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=tumblr.com
// @grant none
// @require https://code.jquery.com/jquery-3.6.4.min.js
// @namespace https://greasyfork.org/users/1134421
// ==/UserScript==
/* globals tumblr */
'use strict';
getUtilities().then(({ keyToClasses, keyToCss, tr }) => {
var $ = window.jQuery;
var $styleElement = $("<style id='__s'>");
$styleElement.appendTo("html");
$styleElement.text(`
#__h {
display: flex;
margin: auto;
max-width: 1716px;
padding: 0 20px 0;
align-items: center;
height: 55px;
}
#__in {
padding: 8px;
font-weight: bold;
display: flex;
align-items: center;
justify-content: space-between;
}
#__in h1 {
color: rgb(var(--white));
font-size: 1.2em;
display: inline;
}
#__c ul {
margin: 4px;
padding: 0;
background: RGB(var(--white));
border-radius: 3px;
}
#__c li {
list-style-type: none;
padding: 8px 12px;
border-bottom: 1px solid rgba(var(--black),.07);
display: flex;
align-items: center;
justify-content: space-between;
}
#__c li:first-of-type {
background: rgba(var(--black),.07);
padding: 12px 12px;
font-weight: bold;
}
${keyToCss("addFreeCtaBanner")} { display: none !important; }
${keyToCss("createPost")} {
width: 44px;
margin-left: 10px;
}
${keyToCss("createPost")} > a {
border-radius: 3px !important;
padding: 5px 12px !important;
}
${keyToCss("navigationLinks")} svg { scale: 1.4; }
${keyToCss("navigationLinks")} {
display: flex;
flex-basis: 100%;
margin: 0;
}
${keyToCss("navigationLinks")} > ${keyToCss("navItem")} { border: none !important; }
@media (max-width: 980px) {
${keyToCss("logoContainer")} {
scale: 0.75;
padding: 16px 16px 0px;
}
${keyToCss("navigationLinks")} {
justify-content: center;
}
${keyToCss("mobileLayout")} {
display: flex;
justify-content: center;
}
}
@media (min-width: 990px) {
${keyToCss("searchSidebarItem")} {
max-width: 550px;
height: unset;
padding: 0 8px;
}
${keyToCss("navigation")} { border: none; }
${keyToCss("post")} ${keyToCss("stickyContainer")} ${keyToCss("avatar")}${keyToCss("newDesktopLayout")} {
top: calc(70px + var(--dashboard-tabs-header-height,0px))
}
${keyToCss("searchShadow")} { background: none; }
${keyToCss("blogTile")} { list-style-type: none; }
${keyToCss("subNav")} {
background: RGB(var(--white));
scrollbar-color: rgba(var(--black),.4)rgba(var(--white),.1);
color: RGB(var(--black));
position: absolute;
border-radius: 4px;
margin-top: 48px;
}
${keyToCss("bluespaceLayout")} > ${keyToCss("newDesktopLayout")} {
border: none !important;
margin-top: 40px;
}
${keyToCss("navigationLinks")} {
justify-content: flex-end;
}
${keyToCss("notificationBadgeIn")} { top: -70% !important; }
${keyToCss("timelineHeader")} { border: none; }
${keyToCss("mainContentWrapper")} {
min-width: unset !important;
flex-basis: unset !important;
}
${keyToCss("main")} { border: none !important; }
${keyToCss("navigationWrapper")} { display: none !important; }
${keyToCss("navSubHeader")} {
display: flex;
align-items: center;
justify-content: space-between;
background: rgba(var(--black),.07);
height: 36px;
padding: 4px 12px 4px 12px;
color: rgba(var(--black),.65);
}
${keyToCss("navSubHeader")} a { text-decoration: none; }
${keyToCss("navSubHeader")} + ul {
width: 100%;
padding: 0 !important;
}
${keyToCss("timelineHeaderNavInner")} { "justify-content", "center"; }
${keyToCss("sidebar")} {
margin-left: 30px !important;
position: sticky;
top: 54px;
height: fit-content;
}
${keyToCss("sidebar")} aside { width: 320px; }
${keyToCss("about")}${keyToCss("inSidebar")}${keyToCss("usesNewDimensions")} {
position: fixed;
height: 20px;
bottom: 0;
}
${keyToCss("searchbarContainer")} {
padding: 0;
border: none;
margin: 0;
}
#account_subnav {
height: 85vh;
width: 240px;
overflow-y: scroll;
overflox-x: hidden;
overscroll-behavior: none;
scrollbar-width: thin;
}
#settings_subnav {
height: fit-content;
z-index: 1;
top: 96px;
left: 8px;
border: 2px solid rgba(var(--black),.14);
}
${keyToCss("subNav")} a,${keyToCss("subNav")} ${keyToCss("childWrapper")},${keyToCss("blogDescription")} * { color: RGB(var(--black)) !important; }
${keyToCss("subNav")} ${keyToCss("endChildWrapper")},${keyToCss("subNav")} ${keyToCss("count")},${keyToCss("reorderButton")} { color: rgba(var(--black),.65) !important; }
${keyToCss("navSubHeader")} a { color: rgba(var(--black),.65); }
{ color: rgba(var(--black),.65) !important; }
${keyToCss("subNav")} > ${keyToCss("navItem")}, ${keyToCss("accountStats")} li {
list-style-type: none;
border-bottom: 1px solid rgba(var(--black),.07);
}
${keyToCss("subNav")} use { --icon-color-primary: rgba(var(--black),.65) }
${keyToCss("subNav")} > ${keyToCss("navItem")}:hover, ${keyToCss("accountStats")} li:hover {
background-color: rgba(var(--black),.07);
}
${keyToCss("subNav")} svg { scale: 1; }
${keyToCss("navInfo")} ${keyToCss("childWrapper")} {
display: flex;
align-items: center;
}
#settings_button_new ${keyToCss("navLink")} { justify-content: flex-start; }
${keyToCss("heading")} {
position: sticky;
top: 0;
height: 36px;
width: 240px !important;
background: RGB(var(--white));
z-index: 1;
padding: 5px 20px 5px 10px;
display: flex;
align-items: center;
justify-content: space-between;
font-size: .875rem;
color: rgba(var(--black),.65) !important;
line-height: 1.5;
box-sizing: border-box;
}
${keyToCss("heading")}::before {
position: absolute;
top: 0;
right: 0;
width: 100%;
height: 36px;
content: "";
background: rgba(var(--black),.07);
pointer-events: none;
}
${keyToCss("childWrapper")} > svg {
margin-right: 10px;
}
@media (max-width: 1150px) {
${keyToCss("navItem")} ${keyToCss("buttonInner")} { padding: 8px 16px !important; }
}
}
`);
const waitFor = (selector, retried = 0,) => new Promise((resolve, reject) => {
if ($(selector).length) {resolve()}
else if (retried < 25) {requestAnimationFrame(() => waitFor(selector, retried + 1).then(resolve))}
else {reject()}
});
function storageAvailable(type) { //thanks mdn web docs!
let storage;
try {
storage = window[type];
const x = "__storage_test__";
storage.setItem(x, x);
storage.removeItem(x);
return true;
} catch (e) {
return (
e instanceof DOMException &&
// everything except Firefox
(e.code === 22 ||
// Firefox
e.code === 1014 ||
// test name field too, because code might not be present
// everything except Firefox
e.name === "QuotaExceededError" ||
// Firefox
e.name === "NS_ERROR_DOM_QUOTA_REACHED") &&
// acknowledge QuotaExceededError only if there's something already stored
storage &&
storage.length !== 0
);
}
}
function newSearch () {
console.log("no search bar found, creating new search bar");
var $search = $(`
<div class="${keyToClasses("searchSidebarItem").join(" ")}" style="max-width: 550px; width: 100%;" >
<div class="${keyToClasses("formContainer").join(" ")}">
<span data-testid="controlled-popover-wrapper" class="${keyToClasses("targetWrapper").join(" ")}">
<span class="${keyToClasses("targetWrapper").join(" ")}">
<form method="GET" action="/search" role="search" class="${keyToClasses("form").join(" ")}">
<div class="${keyToClasses("searchbarContainer").join(" ")}">
<div class="${keyToClasses("searchIcon").join(" ")}">
<svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" role="presentation" >
<use href="#managed-icon__search"></use>
</svg>
</div>
<input
name="q"
type="text"
autocomplete="off"
aria-label="${tr("Search")}"
class="${keyToClasses("searchbar").join(" ")}"
placeholder="Search Tumblr"
autocapitalize="sentences"
value=""
/>
</div>
</form>
</span>
</span>
</div>
</div>
`);
$("#__h").append($search);
}
function updatePreferences(arr) {
localStorage.setItem("configPreferences", JSON.stringify(arr))
}
function checkboxEvent(id, value) {
if (id === "__c1") {
$(keyToCss("timelineHeader")).toggle(!value);
}
else if (id === "__c2") {
$(keyToCss("sidebarItem")).has(keyToCss("recommendedBlogs")).toggle(!value);
}
else if (id === "__c3") {
$(keyToCss("sidebarItem")).has(keyToCss("radar")).toggle(!value);
}
else if (id === "__c4") {
$(keyToCss("navItem")).has('use[href="#managed-icon__explore"]').toggle(!value);
}
else if (id === "__c5") {
$(keyToCss("navItem")).has('use[href="#managed-icon__shop"]').toggle(!value);
}
else if (id === "__c6") {
$(keyToCss("navItem")).has('use[href="#managed-icon__live-video"]').add($(keyToCss("navItem")).has('use[href="#managed-icon__coins"]')).toggle(!value);
}
else if (id === "__c7") {
$(keyToCss("navItem")).has('use[href="#managed-icon__earth"]').toggle(!value);
}
else if (id === "__c8") {
$(keyToCss("navItem")).has('use[href="#managed-icon__sparkle"]').toggle(!value);
}
}
async function $unfuck ($styleElement) {
if ($(keyToCss("headerWrapper")).length) {
console.log("no need to unfuck");
if (!$("#__h").length) {$("#__s").remove()}
return
}
if (["/dashboard", "/"].includes(location.pathname) && $(keyToCss("timeline")).attr("data-timeline") === "/v2/tabs/for_you") {
window.tumblr.navigate("/dashboard/following");
return
}
else {console.log("unfucking dashboard...")}
var configPreferences = [
{type: "checkbox", value: "checked"},
{type: "checkbox", value: "checked"},
{type: "checkbox", value: "checked"},
{type: "checkbox", value: "checked"},
{type: "checkbox", value: "checked"},
{type: "checkbox", value: "checked"},
{type: "checkbox", value: "checked"},
{type: "checkbox", value: "checked"},
{type: "range", value: "0"}
];
if (storageAvailable("localStorage")) {
if (!localStorage.getItem("configPreferences")) {
updatePreferences(configPreferences)
}
else {
configPreferences = JSON.parse(localStorage.getItem("configPreferences"));
}
}
if (!$(keyToCss("navigationLinks")).length) {
console.log("page not loaded, retrying...");
throw "page not loaded";
}
var match = [
"",
"dashboard",
"settings",
"blog",
"domains",
"search",
"likes",
"following",
"inbox",
"tagged",
"explore",
"reblog"
];
var $nav = $(keyToCss("navigationLinks")).eq(0);
var $content = ""
var $main = $(keyToCss("newDesktopLayout")).eq(0);
var $bar = $("<nav>", {class: keyToClasses("headerWrapper").join(" "), id: "__hw"});
var $header = $("<header>", {id: "__h"});
var $logo = $(keyToCss("logoContainer")).eq(0);
var $create = $(keyToCss("createPost")).eq(0);
var $heading = $(`<div class="${keyToClasses("heading").join(" ")}"><h3>Account</h3></div>`);
var $likeIcon = $(`<svg xmlns="http://www.w3.org/2000/svg" height="18" width="20" role="presentation" style="--icon-color-primary: rgba(var(--black), 0.65);"><use href="#managed-icon__like-filled"></use></svg>`);
var $followingIcon = $(`<svg xmlns="http://www.w3.org/2000/svg" height="21" width="20" role="presentation" style="--icon-color-primary: rgba(var(--black), 0.65);"><use href="#managed-icon__following"></use></svg>`);
var $starIcon = $(`<svg xmlns="http://www.w3.org/2000/svg" height="21" width="20" role="presentation" style="--icon-color-primary: rgba(var(--black), 0.65);"><use href="#managed-icon__star-outline"></use></svg>`);
var $helpIcon = $(`<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" role="presentation" style="--icon-color-primary: rgba(var(--black), 0.65);"><use href="#managed-icon__posts-ask"></use></svg>`);
var $coinsIcon = $(`<svg xmlns="http://www.w3.org/2000/svg" height="21" width="20" role="presentation" style="--icon-color-primary: rgba(var(--black), 0.65);"><use href="#managed-icon__coins"></use></svg>`);
var $keyboardIcon = $(`<svg xmlns="http://www.w3.org/2000/svg" height="12" width="20" role="presentation" style="--icon-color-primary: rgba(var(--black), 0.65);"><use href="#managed-icon__keyboard"></use></svg>`);
var $paletteIcon = $(`<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" role="presentation" style="--icon-color-primary: rgba(var(--black), 0.65);"><use href="#managed-icon__palette"></use></svg>`);
var $info = $(`
<div id="__in">
<h1>dashboard unfucker v2.0</h1>
<a href="https://github.com/enchanted-sword/dashboard-unfucker/tree/main">
<svg xmlns="http://www.w3.org/2000/svg" height="22" width="22" role="presentation" style="--icon-color-primary: rgba(var(--white),.65);">
<use href="#managed-icon__embed"></use>
</svg>
</a>
<button id="__cb">
<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" role="presentation" style="--icon-color-primary: rgba(var(--white), 0.65);">
<use href="#managed-icon__settings"></use>
</svg>
</button>
</div>
`);
var $config = $(`
<div id="__c">
<ul>
<li>
<span>configuration</span>
</li>
<li>
<span>hide dashboard tabs</span>
<input class="configInput" type="checkbox" id="__c1" name="0" ${configPreferences[0].value}>
</li>
<li>
<span>hide recommended blogs</span>
<input class="configInput" type="checkbox" id="__c2" name="1" ${configPreferences[1].value}>
</li>
<li>
<span>hide tumblr radar</span>
<input class="configInput" type="checkbox" id="__c3" name="2" ${configPreferences[2].value}>
</li>
<li>
<span>hide explore</span>
<input class="configInput" type="checkbox" id="__c4" name="3" ${configPreferences[3].value}>
</li>
<li>
<span>hide tumblr shop</span>
<input class="configInput" type="checkbox" id="__c5" name="4" ${configPreferences[4].value}>
</li>
<li>
<span>hide tumblr live</span>
<input class="configInput" type="checkbox" id="__c6" name="5" ${configPreferences[5].value}>
</li>
<li>
<span>hide domains</span>
<input class="configInput" type="checkbox" id="__c7" name="6" ${configPreferences[6].value}>
</li>
<li>
<span>hide ad-free</span>
<input class="configInput" type="checkbox" id="__c8" name="7" ${configPreferences[7].value}>
</li>
<li>
<span>content positioning</span>
<input class="configInput" type="range" id="c9" name="8" min="-500" max="500" step="1" value="${configPreferences[8].value}">
</li>
</ul>
</div>
`);
$("html").append($info);
$("html").append($config);
$config.hide();
$("#__cb").on("click", () => {
if ($config.is(":hidden")) {
$("#__cb svg").css("--icon-color-primary", "rgb(var(--white))");
}
else {$("#__cb svg").css("--icon-color-primary", "rgba(var(--white),.65)")}
$config.toggle();
});
$(".configInput").on("change", function () {
if($(this).attr("type") === "checkbox") {
configPreferences[Number($(this).attr("name"))].value = $(this).is(":checked") ? "checked" : "";
checkboxEvent($(this).attr("id"), $(this).is(":checked"));
}
else {
configPreferences[Number($(this).attr("name"))].value = $(this).val();
if ($(keyToCss("main")).length) {
$(keyToCss("main")).css("margin-left", `${$(this).val()}px`);
}
}
updatePreferences(configPreferences);
});
$(keyToCss("timelineHeader")).toggle(!$("#__c1").is(":checked"));
waitFor(keyToCss("sidebarItem")).then(() => {
$(keyToCss("sidebarItem")).eq(0).toggle(!$("#__c2").is(":checked"));
$(keyToCss("sidebarItem")).eq(1).toggle(!$("#__c3").is(":checked"));
});
$(keyToCss("navItem")).has('use[href="#managed-icon__explore"]').toggle(!$("#__c4").is(":checked"));
$(keyToCss("navItem")).has('use[href="#managed-icon__shop"]').toggle(!$("#__c5").is(":checked"));
$(keyToCss("navItem")).has('use[href="#managed-icon__live-video"]').add($(keyToCss("navItem")).has('use[href="#managed-icon__coins"]')).toggle(!$("#__c6").is(":checked"));
$(keyToCss("navItem")).has('use[href="#managed-icon__earth"]').toggle(!$("#__c7").is(":checked"));
$(keyToCss("navItem")).has('use[href="#managed-icon__sparkle"]').toggle(!$("#__c8").is(":checked"));
$main.css("margin", $("#__c9").val());
$create.detach();
$(keyToCss("bluespaceLayout")).prepend($bar);
$logo.detach()
$bar.append($header)
$header.append($logo);
if (match.includes(location.pathname.split("/")[1])) {
waitFor(keyToCss("searchSidebarItem")).then(() => {
var $search = $(keyToCss("searchSidebarItem")).eq(0);
$search.insertAfter($logo);
$(keyToCss("sidebarItem")).has(keyToCss("recommendedBlogs")).toggle(!$("#__c2").is(":checked"));
$(keyToCss("sidebarItem")).has(keyToCss("radar")).toggle(!$("#__c3").is(":checked"));
});
$content = $(keyToCss("main")).eq(0);
if (["/dashboard", "/"].includes(location.pathname)) {
waitFor(keyToCss("timelineOptionsWrapper")).then(() => {
if ($(keyToCss("timelineOptionsItemWrapper")).first().has("a[href='/dashboard/stuff_for_you']").length ? true : false) {
var $forYou = $(keyToCss("timelineOptionsItemWrapper")).has("a[href='/dashboard/stuff_for_you']");
var $following = $(keyToCss("timelineOptionsItemWrapper")).has("a[href='/dashboard/following']");
$forYou.insertAfter($following);
}
});
}
}
else {
$content = $(`${keyToCss("mainContentWrapper")} ${keyToCss("container")}`).eq(0);
newSearch();
}
if (["search", "tagged"].includes(location.pathname.split("/")[1])) {
$content.css("max-width", "fit-content");
}
$header.append($nav);
$header.append($create);
$main.prepend($content)
var $navItems = $nav.children();
var $home = $navItems.has('use[href="#managed-icon__home"]');
var $inbox = $navItems.has('use[href="#managed-icon__mail"]');
var $messages = $navItems.has('use[href="#managed-icon__messaging"]');
$inbox.insertAfter($home);
$messages.insertAfter($inbox);
var $subnav = $(keyToCss("subNav"));
$create.find("a").eq(0).html('<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" role="presentation"><use href="#managed-icon__post"></use></svg>');
$(document).on("click", () => {
if ($(`${keyToCss("subNav")}:hover`).length) {return}
if ($subnav.eq(0).attr("hidden") ? false : true) {
document.getElementById("account_button").click();
}
if ($subnav.eq(1).attr("hidden") ? false : true) {
document.getElementById("settings_button").click();
}
});
var $accountSubnav = $("#account_subnav");
$accountSubnav.prepend($heading);
$heading.append($(keyToCss("logoutButton")));
$(`a[href="/likes"] ${keyToCss("childWrapper")}`).prepend($likeIcon);
$(`a[href="/following"] ${keyToCss("childWrapper")}`).prepend($followingIcon);
var $settings = $(`
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<button class="${keyToClasses("button")[0]} ${keyToClasses("navLinkButtonWrapper").join(" ")}">
<span class="${keyToClasses("buttonInner").join(" ")} ${keyToClasses("navLink").join(" ")}" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" role="presentation">
<use href="#managed-icon__settings"></use>
</svg>
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Settings</span>
<span class="${keyToClasses("buttonInner").join(" ")} ${keyToClasses("caret").join(" ")}" id="settings_caret" style="transition: transform 200ms ease-in-out 0s;">
<svg xmlns="http://www.w3.org/2000/svg" height="12" width="12" role="presentation">
<use href="#managed-icon__caret-thin"></use>
</svg>
</span>
</div>
</span>
</button>
</li>
`);
var $settingsSubmenu = $(`
<ul class="${keyToClasses("accountStats").join(" ")}" id="settings_submenu_new" style="margin: 0;">
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<a class="${keyToClasses("navLink").join(" ")}" href="/settings/account">
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Account</span>
</span>
</div>
</a>
</li>
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<a class="${keyToClasses("navLink").join(" ")}" href="/settings/dashboard">
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Dashboard</span>
</div>
</a>
</li>
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<a class="${keyToClasses("navLink").join(" ")}" href="/settings/notifications">
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Notifications</span>
</div>
</a>
</li>
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<a class="${keyToClasses("navLink").join(" ")}" href="/settings/domains">
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Domains</span>
</div>
</a>
</li>
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<a class="${keyToClasses("navLink").join(" ")}" href="/settings/ad-free-browsing">
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Ad-Free Browsing</span>
</div>
</a>
</li>
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<a class="${keyToClasses("navLink").join(" ")}" href="/settings/purchases">
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Payment & purchases</span>
</div>
</a>
</li>
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<a class="${keyToClasses("navLink").join(" ")}" href="/settings/subscriptions">
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Post+ subscriptions</span>
</div>
</a>
</li>
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<a class="${keyToClasses("navLink").join(" ")}" href="/settings/apps">
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Apps</span>
</div>
</a>
</li>
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<a class="${keyToClasses("navLink").join(" ")}" href="/settings/privacy">
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Privacy</span>
</div>
</a>
</li>
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<a class="${keyToClasses("navLink").join(" ")}" href="/settings/labs">
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Labs</span>
</div>
</a>
</li>
<li class="${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}">
<a class="${keyToClasses("navLink").join(" ")}" href="/settings/gifts">
<div class="${keyToClasses("navInfo").join(" ")}">
<span class="${keyToClasses("childWrapper").join(" ")}">Gifts</span>
</div>
</a>
</li>
</ul>
`);
$settings.insertAfter($subnav.children("li").has("span:contains('Following')"));
$settingsSubmenu.insertAfter($settings);
$settingsSubmenu.hide();
$settings.on("click", () => {
if ($settingsSubmenu.is(":hidden")) {
$("#settings_caret").css("transform", "rotate(180deg)");
}
else {$("#settings_caret").css("transform", "rotate(0deg)")}
$settingsSubmenu.toggle();
});
var $domains = $navItems.has('use[href="#managed-icon__earth"]');
var $adFree = $navItems.has('use[href="#managed-icon__sparkle"]');
var $shop = $navItems.has('use[href="#managed-icon__shop"]')
$domains.insertAfter($settingsSubmenu);
$adFree.insertAfter($domains);
$shop.insertAfter($adFree);
$("#settings_button").hide();
$(`a[href="/changes"] ${keyToCss("childWrapper")}`).prepend($starIcon);
$(`a[href="/help"] ${keyToCss("childWrapper")}`).prepend($helpIcon);
$(`a[href="/live/shop"] ${keyToCss("childWrapper")}`).prepend($coinsIcon);
$(`button span:contains("Keyboard shortcuts")`).eq(0).prepend($keyboardIcon);
var $paletteWrapper = $("<li>", {class: `${keyToClasses("navItem").join(" ")} ${keyToClasses("newDesktopLayout").join(" ")}`});
var $palette = $(`button[aria-label="${tr("Change palette")}"]`);
$paletteWrapper.insertAfter($subnav.children("li").has("span:contains('Keyboard shortcuts')"));
$paletteWrapper.append($palette);
$palette.children("span").eq(0).prepend($paletteIcon);
if (["blog", "likes", "following"].includes(location.pathname.split("/")[1])) { document.getElementById("account_button").click(); }
$header.append($("<nav>"));
waitFor(keyToCss("sidebar")).then(() => {
$(keyToCss("sidebar")).prepend($config);
$(keyToCss("sidebar")).prepend($info);
});
$(`${keyToCss("startChildWrapper")} + ${keyToCss("navInfo")}`).not(`#account_subnav div`).hide();
console.log("dashboard fixed!");
}
$unfuck();
window.tumblr.on('navigation', () => requestAnimationFrame(function() {
$unfuck().catch((e) => {
window.setTimeout($unfuck, 400)
});
}));
});
async function getUtilities () {
let retries = 0;
while (retries++ < 1000 && (typeof tumblr === "undefined" || typeof tumblr.getCssMap === "undefined" || typeof tumblr.languageData === "undefined")) {
await new Promise((resolve) => setTimeout(resolve));
}
const cssMap = await tumblr.getCssMap();
const keyToClasses = (...keys) => keys.flatMap(key => cssMap[key]).filter(Boolean);
const keyToCss = (...keys) => `:is(${keyToClasses(...keys).map(className => `.${className}`).join(", ")})`;
const tr = (string) => `${window.tumblr.languageData.translations[string] || string}`
return { keyToClasses, keyToCss, tr };
}