// ==UserScript== // @name GitHub Toggle Wiki Sidebar // @version 1.0.3 // @description A userscript that adds a button to toggle the GitHub Wiki sidebar // @license https://creativecommons.org/licenses/by-sa/4.0/ // @namespace https://github.com/Mottie // @include https://github.com/* // @run-at document-idle // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @author Rob Garrison // @downloadURL none // ==/UserScript== (() => { "use strict"; // disable click targeting of button SVG internals GM_addStyle(".ghtws-button > * { pointer-events: none; }"); // sidebar state let isHidden = false, toggleIcon = ""; function addToggle() { if (document.querySelector("#wiki-wrapper") && !document.querySelector(".ghtws-button")) { let el = document.querySelector(".gh-header-actions") || document.querySelector(".gh-header-title"); const button = document.createElement("div"); button.className = "btn btn-sm tooltipped tooltipped-s ghtws-button"; button.innerHTML = toggleIcon; button.setAttribute("aria-label", "Toggle Sidebar"); if (el.nodeName === "H1") { // non-editable wiki pages button.style.float = "right"; el = el.parentNode; } // editable wikis have a "header-actions" area // prepend button el.insertBefore(button, el.childNodes[0]); if (isHidden) { toggleSidebar(); } } } function toggleSidebar() { const sidebar = document.querySelector("#wiki-rightbar"), wrapper = sidebar && sidebar.parentNode; if (sidebar) { if (isHidden) { sidebar.style.display = "none"; wrapper.classList.remove("has-rightbar"); } else { sidebar.style.display = ""; wrapper.classList.add("has-rightbar"); } GM_setValue("sidebar-state", isHidden); } } function toggleEvent(event) { const target = event.target; if (target && target.classList.contains("ghtws-button")) { isHidden = !isHidden; toggleSidebar(); } } function init() { isHidden = GM_getValue("sidebar-state", false); document.querySelector("body").addEventListener("click", toggleEvent); addToggle(); } document.addEventListener("pjax:end", addToggle); init(); })();