// ==UserScript==
// @name JanitorAI CSS Toggle
// @namespace http://tampermonkey.net/
// @version 0.1.1
// @description Toggles JanitorAI custom CSS
// @author IWasTheSyntaxError
// @match https://janitorai.com/*
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
let alreadyReloaded = true;
let alreadyReloadedContrast = true;
let isMenuVisible = false;
let isCustomCssDisabled = localStorage.getItem('janitorAICustomCssDisabled') === 'true';
let isHighTextContrast = localStorage.getItem('janitorAIHighContrast') === 'true';
let controlPanel = null;
let controlsContainer = null;
const isAllowedPage = () => {
const path = window.location.pathname;
return path.startsWith('/characters') || path === '/my_characters' || path.startsWith('/profiles/');
};
const isChatsPage = () => window.location.pathname.startsWith('/chats');
const toggleMenu = () => {
isMenuVisible = !isMenuVisible;
updateElementsVisibility();
updateControlText();
};
const toggleCustomCss = () => {
isCustomCssDisabled = !isCustomCssDisabled;
localStorage.setItem('janitorAICustomCssDisabled', isCustomCssDisabled);
applyCustomCssToggle();
updateControlText();
};
const toggleCustomContrast = () => {
isHighTextContrast = !isHighTextContrast;
localStorage.setItem('janitorAIHighContrast', isHighTextContrast);
applyHighContrastText();
updateControlText();
};
const applyHighContrastText = () => {
if (isHighTextContrast){
alreadyReloadedContrast = false;
const elements = document.querySelectorAll('p, h1, h2, h3, h4, h5');
elements.forEach(element => {
element.style.color = 'white';
element.style.backgroundColor = 'black';
});
const allElements = document.querySelectorAll('*');
allElements.forEach(element => {
if (element.childNodes.length > 0) {
element.childNodes.forEach(node => {
if (node.nodeType === Node.TEXT_NODE && node.nodeValue.trim() !== "") {
node.parentNode.style.color = 'white';
node.parentNode.style.backgroundColor = 'black';
}
});
}
});
} else {
if(!alreadyReloadedContrast){
location.reload();
alreadyReloadedContrast = true;
}
}
}
const applyCustomCssToggle = () => {
if (isCustomCssDisabled) {
alreadyReloaded = false;
removeCustomStyles();
const parentElement = document.querySelector('.css-1bn1yyx');
if(parentElement){
const childElements = parentElement.querySelectorAll('*');
for (let i = 0; i < childElements.length; i++) {
if (childElements[i].nodeName === "STYLE") {
childElements[i].parentNode.removeChild(childElements[i]);
}
}
const background = document.querySelector(".css-14l6kwv").firstChild;background.style.background = "none";
}const char = document.querySelector(".css-fu9q4m");
if(!char){
const main = document.querySelector(".css-lo240v");
const elementsWithStyle = main.querySelectorAll('[style]');elementsWithStyle.forEach(element => {
element.removeAttribute('style');
});
} else {
const elementsWithStyle = char.querySelectorAll('[style]');elementsWithStyle.forEach(element => {
element.removeAttribute('style');
});
};
} else {
if(!alreadyReloaded){
location.reload();
alreadyReloaded = true;
}
}
};
const removeCustomStyles = () => {
const styles = document.querySelectorAll('body style');
styles.forEach(style => style.remove());
};
const updateControlText = () => {
const cssToggleText = document.getElementById('css-toggle-text');
const cssToggleContrast = document.getElementById('css-toggle-contrast');
if (cssToggleText) {
cssToggleText.textContent = `Custom CSS: ${isCustomCssDisabled ? 'OFF' : 'ON'}`;
cssToggleText.style.color = isCustomCssDisabled ? '#ccc' : '#fff';
}
if (cssToggleContrast) {
cssToggleContrast.textContent = `High Contrast Text: ${isHighTextContrast ? 'ON' : 'OFF'}`;
cssToggleContrast.style.color = isHighTextContrast ? '#fff' : '#ccc';
}
};
const createControlPanel = () => {
if (controlPanel) return;
controlPanel = document.createElement('div');
controlPanel.id = 'janitor-control-panel';
Object.assign(controlPanel.style, {
position: 'fixed',
top: '75px',
left: '10px',
zIndex: '100000',
display: 'flex',
flexDirection: 'column',
gap: '5px',
alignItems: 'flex-start'
});
const settingsButton = document.createElement('button');
settingsButton.id = 'token-filter-toggle';
settingsButton.textContent = '⚙️';
Object.assign(settingsButton.style, {
width: '30px',
height: '30px',
padding: '0',
backgroundColor: 'rgba(74, 74, 74, 0.7)',
color: '#fff',
border: 'none',
borderRadius: '5px',
cursor: 'pointer',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
fontSize: '16px',
transition: 'background-color 0.2s'
});
settingsButton.addEventListener('click', toggleMenu);
controlsContainer = document.createElement('div');
controlsContainer.id = 'controls-container';
Object.assign(controlsContainer.style, {
display: 'none',
flexDirection: 'column',
gap: '5px',
backgroundColor: 'rgba(74, 74, 74, 0.7)',
padding: '5px',
borderRadius: '5px',
zIndex: '100001'
});
const cssToggleContrast = document.createElement('span');
cssToggleContrast.id = 'css-toggle-contrast';
cssToggleContrast.style.cursor = 'pointer';
cssToggleContrast.style.fontSize = '12px';
cssToggleContrast.addEventListener('click', toggleCustomContrast);
const cssToggleText = document.createElement('span');
cssToggleText.id = 'css-toggle-text';
cssToggleText.style.cursor = 'pointer';
cssToggleText.style.fontSize = '12px';
cssToggleText.addEventListener('click', toggleCustomCss);
controlsContainer.appendChild(cssToggleContrast);
controlsContainer.appendChild(cssToggleText);
controlPanel.appendChild(settingsButton);
controlPanel.appendChild(controlsContainer);
document.body.appendChild(controlPanel);
updateControlText();
};
const updateElementsVisibility = () => {
const shouldShow = isAllowedPage() && !isChatsPage();
if (controlPanel) controlPanel.style.display = shouldShow ? 'flex' : 'none';
if (controlsContainer) controlsContainer.style.display = shouldShow && isMenuVisible ? 'flex' : 'none';
};
const initialize = () => {
createControlPanel();
updateElementsVisibility();
if (isAllowedPage() && !isChatsPage()) {
applyCustomCssToggle();
new MutationObserver(() => {
applyCustomCssToggle();
}).observe(document.body, { childList: true, subtree: true });
const originalAppendChild = Element.prototype.appendChild;
Element.prototype.appendChild = function(node) {
if (isCustomCssDisabled && node.tagName === 'STYLE' && this.tagName === 'HEAD') {
return node;
}
return originalAppendChild.call(this, node);
};
}
};
const tryInitialize = () => {
if (document.body) {
initialize();
let lastPath = window.location.pathname;
setInterval(() => {
if (lastPath !== window.location.pathname) {
lastPath = window.location.pathname;
updateElementsVisibility();
if (isAllowedPage() && !isChatsPage()) {
applyCustomCssToggle();
}
}
}, 500);
} else {
setTimeout(tryInitialize, 1000);
}
};
tryInitialize();
})();