Greasy Fork is available in English.
Core library to handle webpages dom with userscripts
Этот скрипт недоступен для установки пользователем. Он является библиотекой, которая подключается к другим скриптам мета-ключом // @require https://update.greasyfork.org/scripts/464986/1182404/lucianjp-library.js
// ==UserScript== // @name lucianjp-library // @namespace lucianjp // @version 1.0.0 // @author lucianjp // @grant GM_addStyle // @description Core library to handle webpages dom with userscripts // ==/UserScript== class LucianJP_Menu { constructor() { this.menuContainer = null; this.isActive = true; } get container() { return this.menuContainer = this.menuContainer || document.querySelector('.lucianjp-menu') || this.createMenuContainer(); } createMenuContainer() { this.menuContainer = document.createElement('div'); this.menuContainer.classList.add('lucianjp-menu'); document.body.appendChild(this.menuContainer); // Handle shift keypress to show/hide the menu document.addEventListener('keydown', (event) => { if (event.key === 'Shift') { this.toggleMenu(); } }); return this.menuContainer; } add(text, onClick) { if (typeof onClick !== 'function') { console.error('LucianJP_Menu.add(): onClick argument must be a function.'); return; } const menuItem = document.createElement('div'); menuItem.innerText = text; menuItem.classList.add('lucianjp-menu-item'); menuItem.addEventListener('click', onClick); this.container.appendChild(menuItem); } toggleMenu() { this.isActive = !this.isActive; this.container.classList.toggle('lucianjp-menu-close', !this.isActive); } } const lucianjp = { observe: (t, cb, once = false) => { let complete = true; const disconnectHandler = VM.observe(document, () => { if (!complete) return true; complete = false; const node = document.querySelector(t); if (node) { cb(node); return true; } complete = true; }); if (once) ready(disconnectHandler); }, ready: callback => { if (document.readyState != "loading") callback(); else document.addEventListener("DOMContentLoaded", callback); }, menu: new LucianJP_Menu() } // Add styles GM_addStyle(` .lucianjp-menu { position: fixed; right: -6px; top: 50%; transform: translateY(-50%); z-index: 9999; transition: transform 0.3s ease-in-out; } .lucianjp-menu-close { transform: translateX(calc(100% - 20px)) translateY(-50%); } .lucianjp-menu-item { padding: 8px 16px; font-size: 14px; font-weight: bold; cursor: pointer; color: #fff; background: #007aff; border-radius: 8px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); margin: 8px 0; } .lucianjp-menu-item:hover { background: #0066cc; } `);