// ==UserScript==
// @name Reddit Sidebar Toggle
// @namespace Violentmonkey Scripts
// @version 2.1
// @description Toggle Reddit's sidebar with a button and remember the state across pages.
// @author Ezio Auditore
// @icon https://www.redditstatic.com/desktop2x/img/favicon/android-icon-192x192.png
// @match *://www.reddit.com/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
// SVG icons for button
const eyeIcon = `
`;
const eyeSlashIcon = `
`;
// Helper to find the sidebar (covers most Reddit layouts)
function getSidebar() {
return document.querySelector('[data-testid="left-sidebar"], .left-sidebar, [data-testid="sidebar"]');
}
// Toggle sidebar visibility and save state
function toggleSidebarVisibility() {
const sidebar = getSidebar();
if (!sidebar) return;
const currentState = localStorage.getItem('redditSidebarHidden') === 'true';
const newState = !currentState;
sidebar.style.display = newState ? 'none' : '';
localStorage.setItem('redditSidebarHidden', newState.toString());
const toggleButton = document.getElementById('redditSidebarToggleButton');
if (toggleButton) {
toggleButton.innerHTML = newState ? eyeSlashIcon : eyeIcon;
toggleButton.setAttribute('title', newState ? 'Show Sidebar' : 'Hide Sidebar');
}
}
// Inject toggle button into the Reddit header
function injectToggleButton() {
let headerContainer = document.querySelector('.items-center.flex.h-header-large');
if (!headerContainer) headerContainer = document.querySelector('header');
if (!headerContainer) headerContainer = document.body;
if (document.getElementById('redditSidebarToggleButton')) return;
const button = document.createElement('button');
button.id = 'redditSidebarToggleButton';
button.classList.add('ml-2', 'p-2', 'rounded');
Object.assign(button.style, {
cursor: 'pointer',
marginLeft: '8px',
zIndex: '1000',
width: '36px',
height: '36px',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#ff4500',
color: '#fff',
border: 'none',
borderRadius: '8px',
boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',
transition: 'background-color 0.3s',
});
button.innerHTML = eyeIcon;
button.title = 'Hide Sidebar';
button.addEventListener('click', toggleSidebarVisibility);
headerContainer.appendChild(button);
}
// Apply initial visibility from localStorage
function applyInitialState() {
const sidebar = getSidebar();
if (!sidebar) return;
const isHidden = localStorage.getItem('redditSidebarHidden') === 'true';
sidebar.style.display = isHidden ? 'none' : '';
const toggleButton = document.getElementById('redditSidebarToggleButton');
if (toggleButton) {
toggleButton.innerHTML = isHidden ? eyeSlashIcon : eyeIcon;
toggleButton.setAttribute('title', isHidden ? 'Show Sidebar' : 'Hide Sidebar');
}
}
// Simple debounce helper
function debounce(func, delay) {
let timeout;
return function () {
clearTimeout(timeout);
timeout = setTimeout(func, delay);
};
}
// Initialize once
(function initialize() {
injectToggleButton();
applyInitialState();
})();
// Observe DOM for SPA navigation changes
const observer = new MutationObserver(debounce(() => {
injectToggleButton();
applyInitialState();
}, 300));
observer.observe(document.body, { childList: true, subtree: true });
})();