- // ==UserScript==
- // @name RGB Script Manager
- // @namespace http://tampermonkey.net/
- // @version 1.0
- // @description Control panel for RGB scripts with page load alerts
- // @author Jyomama28
- // @match *://*/*
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_registerMenuCommand
- // ==/UserScript==
-
- (function() {
- 'use strict';
-
- const rgbTyperEnabled = GM_getValue('rgbTyperEnabled', true);
- const rgbCursorEnabled = GM_getValue('rgbCursorEnabled', true);
- const pageAlertsEnabled = GM_getValue('pageAlertsEnabled', true);
-
- function initRGBTyper() {
- const style = document.createElement('style');
- style.innerHTML = `
- @keyframes rgbText {
- 0% { color: rgb(255, 0, 0); }
- 33% { color: rgb(0, 255, 0); }
- 66% { color: rgb(0, 0, 255); }
- 100% { color: rgb(255, 0, 0); }
- }
- .rgb-animated {
- animation: rgbText 3s linear infinite;
- }
- `;
- document.head.appendChild(style);
-
- function handleInput(event) {
- const element = event.target;
- if (
- element.tagName === 'INPUT' ||
- element.tagName === 'TEXTAREA' ||
- element.getAttribute('contenteditable') === 'true'
- ) {
- element.classList.add('rgb-animated');
- if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {
- element.style.animation = 'rgbText 3s linear infinite';
- }
- }
- }
-
- const observer = new MutationObserver((mutations) => {
- mutations.forEach((mutation) => {
- mutation.addedNodes.forEach((node) => {
- if (node.nodeType === 1) {
- const inputs = node.querySelectorAll('input, textarea, [contenteditable="true"]');
- inputs.forEach(input => {
- input.addEventListener('input', handleInput);
- });
- }
- });
- });
- });
-
- observer.observe(document.body, {
- childList: true,
- subtree: true
- });
-
- document.querySelectorAll('input, textarea, [contenteditable="true"]').forEach(input => {
- input.addEventListener('input', handleInput);
- });
- }
-
- function initRGBCursor() {
- const cursor = document.createElement('div');
- cursor.id = 'rainbow-cursor';
-
- const trailCount = 20;
- const trail = [];
-
- for (let i = 0; i < trailCount; i++) {
- const dot = document.createElement('div');
- dot.className = 'rainbow-trail-dot';
- document.body.appendChild(dot);
- trail.push({
- element: dot,
- x: 0,
- y: 0
- });
- }
-
- const style = document.createElement('style');
- style.innerHTML = `
- html, body {
- cursor: none !important;
- }
-
- #rainbow-cursor {
- position: fixed;
- pointer-events: none;
- width: 10px;
- height: 10px;
- background: white;
- border-radius: 50%;
- box-shadow: 0 0 5px rgba(0,0,0,0.5);
- z-index: 9999;
- transform: translate(-50%, -50%);
- }
-
- .rainbow-trail-dot {
- position: fixed;
- pointer-events: none;
- width: 8px;
- height: 8px;
- border-radius: 50%;
- z-index: 9998;
- transform: translate(-50%, -50%);
- opacity: 0.8;
- transition: width 0.1s, height 0.1s;
- }
- `;
- document.head.appendChild(style);
- document.body.appendChild(cursor);
-
- let mouseX = 0;
- let mouseY = 0;
-
- document.addEventListener('mousemove', (e) => {
- mouseX = e.clientX;
- mouseY = e.clientY;
- cursor.style.left = mouseX + 'px';
- cursor.style.top = mouseY + 'px';
- });
-
- function updateTrail() {
- for (let i = trail.length - 1; i > 0; i--) {
- trail[i].x = trail[i-1].x;
- trail[i].y = trail[i-1].y;
- }
-
- trail[0].x = mouseX;
- trail[0].y = mouseY;
-
- trail.forEach((dot, index) => {
- const hue = (Date.now() / 20 + index * 10) % 360;
- dot.element.style.left = dot.x + 'px';
- dot.element.style.top = dot.y + 'px';
- dot.element.style.backgroundColor = `hsl(${hue}, 100%, 50%)`;
-
- const size = 8 - (index * 0.3);
- if (size > 0) {
- dot.element.style.width = size + 'px';
- dot.element.style.height = size + 'px';
- dot.element.style.opacity = 1 - (index / trail.length);
- }
- });
-
- requestAnimationFrame(updateTrail);
- }
-
- updateTrail();
-
- window.addEventListener('blur', () => {
- cursor.style.display = 'none';
- trail.forEach(dot => {
- dot.element.style.display = 'none';
- });
- });
-
- window.addEventListener('focus', () => {
- cursor.style.display = 'block';
- trail.forEach(dot => {
- dot.element.style.display = 'block';
- });
- });
- }
-
- function showPageAlert() {
- if (pageAlertsEnabled) {
- alert('Thank you for using my RGB scripts! Enjoy your colorful browsing experience!');
- }
- }
-
- function createMenu() {
- const menu = document.createElement('div');
- menu.id = 'rgb-script-menu';
-
- const style = document.createElement('style');
- style.innerHTML = `
- #rgb-script-menu {
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- background: linear-gradient(135deg, #1a1a1a, #333);
- border-radius: 10px;
- padding: 20px;
- box-shadow: 0 0 20px rgba(0,0,0,0.5);
- z-index: 10000;
- color: white;
- font-family: Arial, sans-serif;
- min-width: 300px;
- border: 2px solid transparent;
- animation: rgbBorder 3s linear infinite;
- display: none;
- }
-
- @keyframes rgbBorder {
- 0% { border-color: rgb(255, 0, 0); }
- 33% { border-color: rgb(0, 255, 0); }
- 66% { border-color: rgb(0, 0, 255); }
- 100% { border-color: rgb(255, 0, 0); }
- }
-
- #rgb-script-menu h2 {
- margin-top: 0;
- text-align: center;
- color: white;
- animation: rgbText 3s linear infinite;
- }
-
- @keyframes rgbText {
- 0% { color: rgb(255, 0, 0); }
- 33% { color: rgb(0, 255, 0); }
- 66% { color: rgb(0, 0, 255); }
- 100% { color: rgb(255, 0, 0); }
- }
-
- .menu-button {
- background: linear-gradient(135deg, #444, #222);
- color: white;
- border: none;
- padding: 10px 15px;
- margin: 5px;
- border-radius: 5px;
- cursor: pointer;
- width: 100%;
- transition: all 0.3s;
- }
-
- .menu-button:hover {
- background: linear-gradient(135deg, #555, #333);
- transform: translateY(-2px);
- }
-
- .toggle-on {
- background: linear-gradient(135deg, #4CAF50, #2E7D32);
- }
-
- .toggle-off {
- background: linear-gradient(135deg, #F44336, #C62828);
- }
-
- .tab-content {
- display: none;
- }
-
- .tab-content.active {
- display: block;
- }
-
- .tab-buttons {
- display: flex;
- margin-bottom: 10px;
- }
-
- .tab-button {
- flex: 1;
- padding: 8px;
- background: #444;
- border: none;
- color: white;
- cursor: pointer;
- }
-
- .tab-button.active {
- background: #666;
- }
-
- .close-button {
- position: absolute;
- top: 5px;
- right: 5px;
- background: none;
- border: none;
- color: white;
- font-size: 20px;
- cursor: pointer;
- }
- `;
- document.head.appendChild(style);
-
- menu.innerHTML = `
- <button class="close-button">×</button>
- <h2>RGB Script Manager</h2>
-
- <div class="tab-buttons">
- <button class="tab-button active" data-tab="main">Main</button>
- <button class="tab-button" data-tab="about">About</button>
- <button class="tab-button" data-tab="help">Help</button>
- </div>
-
- <div id="main-tab" class="tab-content active">
- <button id="toggle-typer" class="menu-button ${rgbTyperEnabled ? 'toggle-on' : 'toggle-off'}">
- RGB Typer: ${rgbTyperEnabled ? 'ON' : 'OFF'}
- </button>
-
- <button id="toggle-cursor" class="menu-button ${rgbCursorEnabled ? 'toggle-on' : 'toggle-off'}">
- RGB Cursor: ${rgbCursorEnabled ? 'ON' : 'OFF'}
- </button>
-
- <button id="toggle-alerts" class="menu-button ${pageAlertsEnabled ? 'toggle-on' : 'toggle-off'}">
- Page Alerts: ${pageAlertsEnabled ? 'ON' : 'OFF'}
- </button>
- </div>
-
- <div id="about-tab" class="tab-content">
- <p>RGB Script Manager v1.0</p>
- <p>Created by Jyomama28</p>
- <p>Control your RGB scripts with this handy panel.</p>
- </div>
-
- <div id="help-tab" class="tab-content">
- <p><strong>Hotkey:</strong> Press \` (backtick) to toggle this menu</p>
- <p><strong>RGB Typer:</strong> Animates text in input fields with RGB colors</p>
- <p><strong>RGB Cursor:</strong> Replaces your cursor with a rainbow trail</p>
- <p><strong>Page Alerts:</strong> Shows a welcome message on new pages</p>
- </div>
- `;
-
- document.body.appendChild(menu);
-
- const closeButton = menu.querySelector('.close-button');
- closeButton.addEventListener('click', () => {
- menu.style.display = 'none';
- });
-
- const tabButtons = menu.querySelectorAll('.tab-button');
- tabButtons.forEach(button => {
- button.addEventListener('click', () => {
- tabButtons.forEach(btn => btn.classList.remove('active'));
- button.classList.add('active');
-
- const tabId = button.getAttribute('data-tab') + '-tab';
- document.querySelectorAll('.tab-content').forEach(content => {
- content.classList.remove('active');
- });
- document.getElementById(tabId).classList.add('active');
- });
- });
-
- const toggleTyper = menu.querySelector('#toggle-typer');
- toggleTyper.addEventListener('click', () => {
- const newState = !GM_getValue('rgbTyperEnabled', true);
- GM_setValue('rgbTyperEnabled', newState);
- toggleTyper.textContent = `RGB Typer: ${newState ? 'ON' : 'OFF'}`;
- toggleTyper.className = `menu-button ${newState ? 'toggle-on' : 'toggle-off'}`;
- if (newState) initRGBTyper();
- });
-
- const toggleCursor = menu.querySelector('#toggle-cursor');
- toggleCursor.addEventListener('click', () => {
- const newState = !GM_getValue('rgbCursorEnabled', true);
- GM_setValue('rgbCursorEnabled', newState);
- toggleCursor.textContent = `RGB Cursor: ${newState ? 'ON' : 'OFF'}`;
- toggleCursor.className = `menu-button ${newState ? 'toggle-on' : 'toggle-off'}`;
- if (newState) initRGBCursor();
- });
-
- const toggleAlerts = menu.querySelector('#toggle-alerts');
- toggleAlerts.addEventListener('click', () => {
- const newState = !GM_getValue('pageAlertsEnabled', true);
- GM_setValue('pageAlertsEnabled', newState);
- toggleAlerts.textContent = `Page Alerts: ${newState ? 'ON' : 'OFF'}`;
- toggleAlerts.className = `menu-button ${newState ? 'toggle-on' : 'toggle-off'}`;
- });
-
- return menu;
- }
-
- let menu = null;
- let menuVisible = false;
-
- function toggleMenu() {
- if (!menu) {
- menu = createMenu();
- }
-
- menuVisible = !menuVisible;
- menu.style.display = menuVisible ? 'block' : 'none';
- }
-
- document.addEventListener('keydown', (e) => {
- if (e.key === '`' || e.key === '~') {
- toggleMenu();
- }
- });
-
- if (rgbTyperEnabled) initRGBTyper();
- if (rgbCursorEnabled) initRGBCursor();
-
- window.addEventListener('load', showPageAlert);
- window.addEventListener('hashchange', showPageAlert);
- window.addEventListener('popstate', showPageAlert);
- })();