1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. Mira_Belle

Beiträge von Mira_Belle

  • UserCSSLoader (2025)

    • Mira_Belle
    • 4. Oktober 2025 um 23:06

    Die Einträge zum Öffnen der "userChromeShadow.css" und der "userChrome.js" werde ich auch noch vornehmen.

  • Meine Version des App-Menüs (JavaScript)

    • Mira_Belle
    • 4. Oktober 2025 um 22:57

    Habe das Menü um das Öffnen des Icons-Ordner erweitert.
    Bin aber auch noch am Basteln, um weitere Funktionen hinzuzufügen.

    Es werden Funktionen sein, die aus anderen Skripten stammen.
    Z.B. direkt Aufrufe einiger "about:"-Seiten, aber auch das Öffenen
    mittels eines Editors von diversen Dateien, z.B. userChrome.css oder z.B. prefs.js.

  • UserCSSLoader (2025)

    • Mira_Belle
    • 4. Oktober 2025 um 22:44

    Ich war mal so frei und habe das Menü erweitert!

    Wie man unschwer erkennen kann, können nun auch die Dateien "prefs.js" & "user.js" zum Bearbeiten geöffnet werden.

    JavaScript
    /* UserCSSLoader 2025-10-04
     *
     * original author: Griever -
     * https://github.com/Griever/userChromeJS/tree/master/UserCSSLoader
     *
     * Enhancements and several other changes including German translation
     * and configuration section by users aborix, Endor, bege, Speravir of
     * Camp Firefox forum - https://www.camp-firefox.de/forum/ - latest version:
     * https://www.camp-firefox.de/forum/thema/138814/?postID=1280500#post1280500
     */
    
    /****** Bedienungsanleitung ******
    
    CSS-Ordner im Chrome-Ordner erstellen, CSS-Dateien dort ablegen - speichern.
    Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css"
    enden, sind AGENT_SHEET, alle anderen außer USER_SHEET werden gelesen. Da der
    Inhalt der Datei nicht überprüft wird, darauf achten, die Angabe von @namespace
    nicht zu vergessen!
    
    Schaltfläche oder Menü wird in Navigationsleiste eingefügt (einstellbar, siehe
    Variable "position" in unten anschließender Konfiguration).
    
    Dateiordner, Dateimanager und Texteditor können in der unten anschließenden
    Konfiguration geändert werden. Die Verwendung des in "view_source.editor.path"
    angegebenen Editors ist möglich.
    
    Linksklick auf Stil, zum Aktivieren/Deaktivieren
    Mittelklick auf Stil zum Aktivieren/Deaktivieren, ohne Menü zu schließen
    Rechtsklick auf Stil zum Öffnen im Editor
    Strg+Linksklick zum Anzeigen im Dateimanager
    
    Die Tastenkombinationen können im Menü eingeblendet werden, dazu nach 
    "acceltext" suchen und den Zeilenkommentar "//" entfernen.
    
    Ein Symbol für die Schaltfläche muss in der "userChrome.css" festgelegt werden,
    Pfad zum Bild (PNG nur als Beispiel):
    * relativ zur userChrome.css
        background-image: url("Relativer/Pfad/zum/CSS_Symbol.png");
    * eine absolute Pfadangabe zum Symbol muss mit File-Protokoll-Präfix erfolgen:
        background-image: url("file:///Absoluter/Pfad/zum/CSS_Symbol.png");
    
    Absolute Zahlenwerte müssen eventuell etwas an die eigenen Gegebenheiten
    angepasst werden (größeres Symbol, anderer Rand); der Zahlenwert für Höhe
    und Breite des Menütextes ("CSS") sollte nicht größer sein als für das
    Symbol (hier 16px).
    
    #usercssloader-menu-item {
    	background-image: url("Relativer/Pfad/zum/CSS_Symbol.png");
    	background-position: center;
    	background-repeat: no-repeat;
    	background-size: 16px;
    	border-radius: var(--toolbarbutton-border-radius);
    	margin-block: 3px;
    
    	&:hover {
    		background-color: var(--toolbarbutton-hover-background);
    	}
    
    	& #usercssloader-menu > .menu-text[value="CSS"] {
    		opacity: 0;
    		width: calc(2 * var(--toolbarbutton-inner-padding) + 16px);
    		height: calc(2 * var(--toolbarbutton-inner-padding) + 16px);
    	}
    }
    
    **** Ende der Anleitung ****/
    
    (function(){
    
    /***** Konfiguration *****/
    /* Position: als frei verschiebbare-Schaltfläche = 0, als Menü anzeigen = 1 */
    let position = 0;//1
    /* Dateimanager festlegen, Beispiele:
     *    let fileManager = "C:\\Programme\\FreeCommanderXE\\FreeCommander.exe";
     *    let fileManager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE";
     * auch möglich (Achtung, nur mit fileManagerParam = "/select,"!):
     *    let fileManager = "C:\\Windows\\explorer.exe";
     * Bleibt Parameter leer, wird Standardmanager des Systems ohne Parameter
     * verwendet mit leicht eingeschränkter Funktionalität. */
    let fileManager = "C:\\Windows\\explorer.exe";
    /* eventuelle Parameter für den Dateimanager, Beispiele:
     *    let fileManagerParam = "/T";//FreeCommander oder Totalcommander
     *    let fileManagerParam = "/select,";//Windows Explorer, mit Komma korrekt!
     */
    let fileManagerParam = "/select,";
    /* manche Manager benötigen den Parameter nach der Pfadangabe,
       dann "fileManagerParamPost" auf true setzen */
    let fileManagerParamPost = false;
    /* eigener Texteditor mit Pfad - Standard leer, dann wird Wert aus
     * Einstellung "view_source.editor.path" verwendet mit Warnmeldung,
     * wenn auch dieser leer ist, Beispiel:
     *    let customEditor = "C:\\Windows\\System32\\notepad.exe"; */
    let customEditor = "C:\\Program Files\\Microsoft VS Code\\Code.exe";
    /* Unterordner für die CSS-Dateien */
    let cssFolder = "CSS";
    /* zusätzlich Chrome-Ordner im Untermenü anzeigen (true)
       oder verstecken (false) */
    let showChrome = true;
    /* Menüeintrag zum Bearbeiten der userChrome.css anzeigen (true)
       oder verstecken (false) */
    let showUserChromeCSS = true;
    /* Menüeintrag zum Bearbeiten der userContent.css anzeigen (true)
       oder verstecken (false) */
    let showUserContentCSS = true;
    /* Menüeintrag zum Bearbeiten der pref.js anzeigen (true)
       oder verstecken (false) */
    let showPrefsJS = true;
    /* Menüeintrag zum Bearbeiten der user.js anzeigen (true)
       oder verstecken (false) */
    let showUserJS = true;
    /***** Ende der Konfiguration *****/
    
    // Wenn beim Start ein weiteres Fenster (zweites Fenster) vorhanden ist, beenden
    let list = Services.wm.getEnumerator("navigator:browser");
    while(list.hasMoreElements()){ if(list.getNext() != window) return; }
    if (window.UCL) {
    	window.UCL.destroy();
    	delete window.UCL;
    }
    let menutooltip = "Linksklick: an/aus, Menü schließt\nMittelklick: an/aus, Menü bleibt offen\nRechtsklick: bearbeiten";
    if (fileManager !== "") {
    		menutooltip = menutooltip + "\nStrg+Rechtsklick: im Dateimanager anzeigen";
    }
    window.UCL = {
    	AGENT_SHEET : Ci.nsIStyleSheetService.AGENT_SHEET,
    	USER_SHEET  : Ci.nsIStyleSheetService.USER_SHEET,
    	AUTHOR_SHEET: Ci.nsIStyleSheetService.AUTHOR_SHEET,
    	readCSS: {},
    	get disabled_list() {
    		let obj = [];
    		try {
    			obj = decodeURIComponent(this.prefs.getCharPref("disabled_list")).split("|");
    		} catch(e) {}
    		delete this.disabled_list;
    		return this.disabled_list = obj;
    	},
    	get prefs() {
    		delete this.prefs;
    		return this.prefs = Services.prefs.getBranch("UserCSSLoader.");
    	},
    	get styleSheetServices() {
    		delete this.styleSheetServices;
    		return this.styleSheetServices = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
    	},
    	get FOLDER() {
    		let aFolder;
    		try {
    			// UserCSSLoader.FOLDER verwenden
    			let folderPath = this.prefs.getCharPref("FOLDER");
    			aFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
    			aFolder.initWithPath(folderPath);
    		} catch (e) {
    			aFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
    			aFolder.appendRelativePath(cssFolder);
    		}
    		if (!aFolder.exists() || !aFolder.isDirectory()) {
    			aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0o664);
    		}
    		delete this.FOLDER;
    		return this.FOLDER = aFolder;
    	},
    	get CHRMFOLDER() {
    			let cFolder;
    			try {
    					// UserCSSLoader.CHRMFOLDER verwenden
    					let CHRMfolderPath = this.prefs.getCharPref("CHRMFOLDER");
    					cFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
    					cFolder.initWithPath(CHRMfolderPath);
    			} catch (e) {
    					cFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
    			}
    			if (!cFolder.exists() || !cFolder.isDirectory()) {
    					cFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0o664);
    			}
    			delete this.CHRMFOLDER;
    			return this.CHRMFOLDER = cFolder;
    	},
    	init: function() {
    		const cssmenu = $C("menu", {
    			id: "usercssloader-menu",
    			label: "CSS",
    			tooltiptext: "UserCSSLoader\n\nLinksklick: Stylesheets anzeigen\nMittelklick: Styles importieren",
    			accesskey: "Y"
    		});
    		cssmenu.addEventListener("click", (event) => { if (event.button === 1) UCL.rebuild(); });
    		const menupopup = $C("menupopup", {
    			id: "usercssloader-menupopup"
    		});
    		cssmenu.appendChild(menupopup);
    		let menu = $C("menu", {
    			label: "Style-Loader-Menü",
    			id: "style-loader-menu",
    			accesskey: "S",
    			//acceltext: "S"
    		});
    		menupopup.appendChild(menu);
    		menupopup.appendChild($C("menuseparator"));
    		let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
    		menu.appendChild(mp);
    		let rebuildItem = $C("menuitem", {
    			label: "Styles importieren",
    			accesskey: "I",
    			//acceltext: "I"
    		});
    		rebuildItem.addEventListener("command", () => UCL.rebuild());
    		mp.appendChild(rebuildItem);
    		mp.appendChild($C("menuseparator"));
    		//
    		let createCSS = $C("menuitem", {
    			label: "CSS-Datei erstellen",
    			accesskey: "D",
    			//acceltext: "D"
    		});
    		createCSS.addEventListener("command", () => UCL.create());
    		mp.appendChild(createCSS);
    		let openFolder = $C("menuitem", {
    			label: "CSS-Ordner öffnen",
    			accesskey: "O",
    			//acceltext: "O"
    		});
    		openFolder.addEventListener("command", () => UCL.openCSSFolder());
    		mp.appendChild(openFolder);
    		if (showChrome) {
    				let openChromeFolder = $C("menuitem", {
    					label: "Chrome-Ordner öffnen",
    					accesskey: "X",
    					//acceltext: "X"
    				});
    				openChromeFolder.addEventListener("command", () => UCL.openCHRMFolder());
    				mp.appendChild(openChromeFolder);
    		}
    		if (showUserChromeCSS || showUserContentCSS)// wenigstens eine der beiden Variablen muss …
    				mp.appendChild($C('menuseparator'));// … true sein, damit Trennlinie angezeigt wird
    		if (showUserChromeCSS) {
    				let editChromeItem = $C("menuitem", {
    					label: "userChrome.css bearbeiten"
    				});
    				editChromeItem.addEventListener("command", () => UCL.editUserCSS("userChrome.css"));
    				mp.appendChild(editChromeItem);
    		}
    		if (showUserContentCSS) {
    				let editContentItem = $C("menuitem", {
    					label: "userContent.css bearbeiten"
    				});
    				editContentItem.addEventListener("command", () => UCL.editUserCSS("userContent.css"));
    				mp.appendChild(editContentItem);
    		}
    		if (showPrefsJS || showUserJS)
    			mp.appendChild($C('menuseparator')); // Trennlinie
    
    		if (showPrefsJS) {
    			let editPrefsItem = $C("menuitem", {
    				label: "prefs.js bearbeiten"
    			});
    			editPrefsItem.addEventListener("command", () => UCL.editProfileFile("prefs.js"));
    			mp.appendChild(editPrefsItem);
    		}
    		if (showUserJS) {
    			let editUserJsItem = $C("menuitem", {
    				label: "user.js bearbeiten"
    			});
    			editUserJsItem.addEventListener("command", () => UCL.editProfileFile("user.js"));
    			mp.appendChild(editUserJsItem);
    		}
    		CustomizableUI.createWidget({
    			id: 'usercssloader-menu-item',
    			type: 'custom',
    			defaultArea: CustomizableUI.AREA_NAVBAR,
    			onBuild: function(aDocument) {
    				let toolbaritem = aDocument.createXULElement('toolbaritem');
    				toolbaritem.id = 'usercssloader-menu-item';
    				toolbaritem.className = 'chromeclass-toolbar-additional';
    				return toolbaritem;
    			}
    		});
    		$('usercssloader-menu-item').appendChild(cssmenu);
    		if (position === 1) {
    				let refNode = $('helpMenu');
    				refNode.parentNode.insertBefore(cssmenu, refNode.nextSibling);
    		}
    		// Stile neu laden, ohne Menü zu öffnen
    		let key = $C("key", {
    			id: "usercssloader-rebuild-key",
    			key: "R",
    			modifiers: "alt",
    		});
    		key.addEventListener("command", () => UCL.rebuild());
    		$("mainKeyset").appendChild(key);
    		this.rebuild();
    		this.initialized = true;
    		window.addEventListener("unload", this, false);
    	},
    	uninit: function() {
    		const dis = [];
    		for (let x of Object.keys(this.readCSS)) {
    			if (!this.readCSS[x].enabled)
    				dis.push(x);
    		}
    		this.prefs.setCharPref("disabled_list", encodeURIComponent(dis.join("|")));
    		window.removeEventListener("unload", this, false);
    	},
    	destroy: function() {
    		var i = document.getElementById("usercssloader-menu");
    		if (i) i.parentNode.removeChild(i);
    		var i = document.getElementById("usercssloader-rebuild-key");
    		if (i) i.parentNode.removeChild(i);
    		this.uninit();
    	},
    	handleEvent: function(event) {
    		switch(event.type){
    			case "unload": this.uninit(); break;
    		}
    	},
    	rebuild: function() {
    		let ext = /\.css$/i;
    		let not = /\.uc\.css/i;
    		let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
    		while (files.hasMoreElements()) {
    			let file = files.getNext().QueryInterface(Ci.nsIFile);
    			if (!ext.test(file.leafName) || not.test(file.leafName)) continue;
    			let CSS = this.loadCSS(file);
    			CSS.flag = true;
    		}
    		for (let leafName of Object.keys(this.readCSS)) {
    			const CSS = this.readCSS[leafName];
    			if (!CSS.flag) {
    				CSS.enabled = false;
    				delete this.readCSS[leafName];
    			}
    			delete CSS.flag;
    			this.rebuildMenu(leafName);
    		}
    		if (this.initialized) {
    			if (typeof(StatusPanel) !== "undefined")
    				StatusPanel._label = "Styles importiert";
    			else
    				XULBrowserWindow.statusTextField.label = "Styles importiert";
    		}
    	},
    	loadCSS: function(aFile) {
    		let CSS = this.readCSS[aFile.leafName];
    		if (!CSS) {
    			CSS = this.readCSS[aFile.leafName] = new CSSEntry(aFile);
    			if (this.disabled_list.indexOf(CSS.leafName) === -1) {
    				CSS.enabled = true;
    			}
    		} else if (CSS.enabled) {
    			CSS.enabled = true;
    		}
    		return CSS;
    	},
    	rebuildMenu: function(aLeafName) {
    		let CSS = this.readCSS[aLeafName];
    		let menuitem = document.getElementById("usercssloader-" + aLeafName);
    		if (!CSS) {
    			if (menuitem)
    				menuitem.parentNode.removeChild(menuitem);
    			return;
    		}
    		if (!menuitem) {
    			menuitem = $C("menuitem", {
    				label: aLeafName,
    				id: "usercssloader-" + aLeafName,
    				class: "usercssloader-item " + (CSS.SHEET == this.AGENT_SHEET? "AGENT_SHEET" : CSS.SHEET == this.AUTHOR_SHEET? "AUTHOR_SHEET": "USER_SHEET"),
    				type: "checkbox",
    				autocheck: "false",
    				tooltiptext: menutooltip
    			});
    			menuitem.addEventListener("command", () => UCL.toggle(aLeafName));
    			menuitem.addEventListener("click", (event) => UCL.itemClick(event));
    			menuitem.addEventListener("mouseup", (event) => { if (event.button === 1) event.preventDefault(); });
    			document.getElementById("usercssloader-menupopup").appendChild(menuitem);
    		}
    		menuitem.setAttribute("checked", CSS.enabled);
    	},
    	toggle: function(aLeafName) {
    		let CSS = this.readCSS[aLeafName];
    		if (!CSS || event.ctrlKey) return;
    		CSS.enabled = !CSS.enabled;
    		this.rebuildMenu(aLeafName);
    	},
    	itemClick: function(event) {
    		let label = event.currentTarget.getAttribute("label");
    		event.preventDefault();
    		event.stopPropagation();
    		if (event.button === 0) {
    				return;
    		} else if (event.button === 1) {
    				this.toggle(label);
    		} else if (event.button === 2) {
    				if (event.ctrlKey && fileManager  !== "") {
    						UCL.showFile(label);
    				} else {
    				closeMenus(event.target);
    				this.edit(this.getFileFromLeafName(label));
    				}
    		}
    	},
    	getFileFromLeafName: function(aLeafName) {
    		let f = this.FOLDER.clone();
    		f.QueryInterface(Ci.nsIFile); // use appendRelativePath
    		f.appendRelativePath(aLeafName);
    		return f;
    	},
    	showFile: function(fname) {
    				const PathSep = AppConstants.platform === "win" ? "\\" : "/";
    				let target= this.FOLDER.path + PathSep + fname;
    				let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
    				let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    				let args = (!fileManagerParamPost) ? [fileManagerParam,target] :
    				           [target,fileManagerParam];
    				file.initWithPath(fileManager);
    				process.init(file);
    				// Verzeichnis mit anderem Dateimanager öffnen
    				process.run(false, args, args.length);
    	},
    	openCSSFolder:function(){
    		if (fileManager !== "" && fileManagerParam !== "/select,") {
    				let target = this.FOLDER.path;
    				let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
    				let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    				let args = (!fileManagerParamPost) ? [fileManagerParam,target] :
    				           [target,fileManagerParam];
    				file.initWithPath(fileManager);
    				process.init(file);
    				// Verzeichnis mit anderem Dateimanager öffnen
    				process.run(false, args, args.length);
    		} else {
    				// Verzeichnis mit Dateimanager des Systems öffnen
    				this.FOLDER.launch();
    		}
    	},
    	openCHRMFolder:function(){
    		if (fileManager !== "" && fileManagerParam !== "/select,") {
    				let target = this.CHRMFOLDER.path;
    				let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
    				let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    				let args = (!fileManagerParamPost) ? [fileManagerParam,target] :
    				           [target,fileManagerParam];
    				file.initWithPath(fileManager);
    				process.init(file);
    				// Verzeichnis mit anderem Dateimanager öffnen
    				process.run(false, args, args.length);
    		} else {
    				// Verzeichnis mit Dateimanager des Systems öffnen
    				this.CHRMFOLDER.launch();
    		}
    	},
    	editUserCSS: function(aLeafName) {
    		let file = Services.dirsvc.get("UChrm", Ci.nsIFile);
    		file.appendRelativePath(aLeafName);
    		this.edit(file);
    	},
        editProfileFile: function(filename) {
            let file = Services.dirsvc.get("ProfD", Ci.nsIFile);
            file.append(filename);
            this.edit(file);
        },
    	edit: function(aFile) {
    		let editor = (customEditor !== "") ? customEditor : Services.prefs.getCharPref("view_source.editor.path");
    		if (!editor) return alert('In der Konfiguration einen Texteditor festlegen ("customEditor") oder\n unter about:config im vorhandenen Schalter "view_source.editor.path"\n den vollständigen Editorpfad eintragen.');
    		try {
    			let UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
    			UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
    			let path = UI.ConvertFromUnicode(aFile.path);
    			let app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
    			app.initWithPath(editor);
    			let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
    			process.init(app);
    			process.run(false, [path], 1);
    		} catch (e) {}
    	},
    	create: function(aLeafName) {
    		if (!aLeafName) aLeafName = prompt("Name des Styles", dateFormat(new Date(), "%Y_%m%d_%H%M%S"));
    		if (aLeafName) aLeafName = aLeafName.replace(/\s+/g, " ").replace(/[\\/:*?\"<>|]/g, "");
    		if (!aLeafName || !/\S/.test(aLeafName)) return;
    		if (!/\.css$/.test(aLeafName)) aLeafName += ".css";
    		let file = this.getFileFromLeafName(aLeafName);
    		this.edit(file);
    	},
    	UCrebuild: function() {
    		let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
    		let query = "?" + new Date().getTime();
    		Array.slice(document.styleSheets).forEach(function(css){
    			if (!re.test(css.href)) return;
    			if (css.ownerNode) {
    				css.ownerNode.parentNode.removeChild(css.ownerNode);
    			}
    			let pi = document.createProcessingInstruction('xml-stylesheet','type="text/css" href="'+ css.href.replace(/\?.*/, '') + query +'"');
    			document.insertBefore(pi, document.documentElement);
    		});
    		UCL.UCcreateMenuitem();
    	},
    	UCcreateMenuitem: function() {
    		let sep = $("usercssloader-ucseparator");
    		let popup = sep.parentNode;
    		if (sep.nextSibling) {
    			let range = document.createRange();
    			range.setStartAfter(sep);
    			range.setEndAfter(popup.lastChild);
    			range.deleteContents();
    			range.detach();
    		}
    		let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
    		Array.slice(document.styleSheets).forEach(function(css) {
    			if (!re.test(css.href)) return;
    			let fileURL = decodeURIComponent(css.href).split("?")[0];
    			let aLeafName = fileURL.split("/").pop();
    			let m = $C("menuitem", {
    				label: aLeafName,
    				tooltiptext: fileURL,
    				id: "usercssloader-" + aLeafName,
    				type: "checkbox",
    				autocheck: "false",
    				checked: "true",
    			});
    			m.css = css;
    			m.addEventListener("command", function() {
    				if (!event.ctrlKey) {this.setAttribute("checked", !(this.css.disabled = !this.css.disabled));}
    			});
    			m.addEventListener("mouseup", function(event) {
    				if (event.button === 1) event.preventDefault();
    			});
    			m.addEventListener("click", function(event) {
    				UCL.UCItemClick(event);
    			});
    			popup.appendChild(m);
    		});
    	},
    	UCItemClick: function(event) {
    		if (event.button === 0) return;
    		event.preventDefault();
    		event.stopPropagation();
    		if (event.button === 1) {
    			event.target.doCommand();
    		}
    		else if (event.button === 2) {
    			closeMenus(event.target);
    			let fileURL = event.currentTarget.getAttribute("tooltiptext");
    			let file = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getFileFromURLSpec(fileURL);
    			this.edit(file);
    		}
    	},
    };
    function CSSEntry(aFile) {
    	this.path = aFile.path;
    	this.leafName = aFile.leafName;
    	this.lastModifiedTime = 1;
    	this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ?
    		Ci.nsIStyleSheetService.AGENT_SHEET:
    		/\.author\.css$/i.test(this.leafName)?
    			Ci.nsIStyleSheetService.AUTHOR_SHEET:
    			Ci.nsIStyleSheetService.USER_SHEET;
    }
    CSSEntry.prototype = {
    	sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
    	_enabled: false,
    	get enabled() {
    		return this._enabled;
    	},
    	set enabled(isEnable) {
    		let aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
    		aFile.initWithPath(this.path);
    		let isExists = aFile.exists(); // true, wenn die Datei bereits existiert
    		let lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
    		let isForced = this.lastModifiedTime != lastModifiedTime; //true, wenn es eine Änderung in der Datei gibt
    		let fileURL = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile);
    		let uri = Services.io.newURI(fileURL, null, null);
    		if (this.sss.sheetRegistered(uri, this.SHEET)) {
    			// Wenn diese Datei bereits gelesen wurde
    			if (!isEnable || !isExists) {
    				this.sss.unregisterSheet(uri, this.SHEET);
    			}
    			else if (isForced) {
    				// Nach Stornierung erneut einlesen
    				this.sss.unregisterSheet(uri, this.SHEET);
    				this.sss.loadAndRegisterSheet(uri, this.SHEET);
    			}
    		} else {
    			// Datei wurde nicht gelesen
    			if (isEnable && isExists) {
    				this.sss.loadAndRegisterSheet(uri, this.SHEET);
    			}
    		}
    		if (this.lastModifiedTime !== 1 && isEnable && isForced) {
    			log(this.leafName + " wurde aktualisiert");
    		}
    		this.lastModifiedTime = lastModifiedTime;
    		return this._enabled = isEnable;
    	},
    };
    UCL.init();
    function $(id) { return document.getElementById(id); }
    function $A(arr) { return Array.slice(arr); }
    function $C(name, attr) {
    	const el = document.createXULElement(name);
    	if (attr) Object.keys(attr).forEach(function(n) { el.setAttribute(n, attr[n]) });
    	return el;
    }
    function dateFormat(date, format) {
    	format = format.replace("%Y", ("000" + date.getFullYear()).substr(-4));
    	format = format.replace("%m", ("0" + (date.getMonth()+1)).substr(-2));
    	format = format.replace("%d", ("0" + date.getDate()).substr(-2));
    	format = format.replace("%H", ("0" + date.getHours()).substr(-2));
    	format = format.replace("%M", ("0" + date.getMinutes()).substr(-2));
    	format = format.replace("%S", ("0" + date.getSeconds()).substr(-2));
    	return format;
    }
    function log(mes) { console.log(mes); }
    })();
    Alles anzeigen
  • Meine Version des App-Menüs (JavaScript)

    • Mira_Belle
    • 4. Oktober 2025 um 13:11

    Problem gelöst!
    Ersetze gDevToolsBrowser.toggleToolboxCommand(window.gBrowser, Cu.now());
    durch gDevToolsBrowser.toggleToolboxCommand(window.gBrowser, performance.now());

  • userChrome.js Scripte für den Fuchs (Diskussion)

    • Mira_Belle
    • 4. Oktober 2025 um 12:49

    Ah, danke.
    Dann sind es an dem JavaScript die gleichen Änderungen, die ich schon vorgenommen hatte.

    Hier => #19 ging es los, der Anfang war gemacht.

    Meine Version des Skripts hatte ich nur deshalb abgespeckt, weil es Nutzer gibt, die mit den vielen Möglichkeiten,
    die das originale Skript von Aris bietet, einfach überfordert hatte.

  • Meine Version des App-Menüs (JavaScript)

    • Mira_Belle
    • 4. Oktober 2025 um 12:27

    Welchen Fehler wirft denn die Konsole aus?

    Zitat von FuchsFan

    Nachtrag: Sorry, das Ganze natürlich im aktuellen Nightly. :rolleyes:

    Grr, wäre wichtig gewesen!
    Muss ich mir dann noch anschauen, komme aber erst Montag dazu.


    Nachtrag!
    Habe den Fehler gefunden, aber weiß noch nicht wie ich ihn beheben kann!

    Uncaught TypeError: Cu.now is not a function

    Zeile 444 "gDevToolsBrowser.toggleToolboxCommand(window.gBrowser, Cu.now());"
    Firefox Nightly 145.0a1 (2025-10-03) (64-Bit)

  • Meine Version des App-Menüs (JavaScript)

    • Mira_Belle
    • 4. Oktober 2025 um 11:21

    Der Aufruf für die Werkzeuge für Web-Entwickler, so die eigentlich richtige Bezeichnung, lautet:

    Code
          'goEntwickler': () => {
                  var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});
                  var { gDevToolsBrowser } = require('resource://devtools/client/framework/devtools-browser');
                  gDevToolsBrowser.toggleToolboxCommand(window.gBrowser, Cu.now());
                },

    Der steht in Zeile 475 und funktioniert.

  • userChrome.js Scripte für den Fuchs (Diskussion)

    • Mira_Belle
    • 4. Oktober 2025 um 10:35

    Schön lenny2, was genau hast Du am JavaScript geändert,
    und wofür ist das CSS?

    Und eine weitere Frage, wenn das CSS für das JavaScript so wichtig ist,
    wäre es dann nicht besser "es" zu integrieren?

    Nachtrag
    Natürlich habe ich mal drübergeschaut, ja, und ich könnte das Skript auch
    genauer "untersuchen", aber das möchte ich erst einmal nicht.
    Das mache ich nur, wenn es für "mich" und meiner Version des Scrollbarskripts Vorteile,
    bzw. Verbesserungen bringt.

    Noch ein Nachtrag!
    Sehe ich das richtig, dass nur die Selektoren im JS "erneuert" wurden,
    so wie ich es gemacht habe?

    Bleibt für mich dann nur noch die Frage nach dem CSS,
    wofür ist es?

  • Aufruf extra confing menu.uc.js

    • Mira_Belle
    • 3. Oktober 2025 um 18:15
    Zitat von BarbaraZ-

    Jetzt ist alles wieder so, wies sein soll. :thumbup:

    Super, freut mich. :)

  • Aufruf extra confing menu.uc.js

    • Mira_Belle
    • 3. Oktober 2025 um 17:50

    ot
    2002Andreas Wie ich schon schrieb, wenn sich Funktionen mehrer Skript überschneiden, kann es vorkommen,
    dass da so einiges durcheinander kommt. (Mein Schnelltest #2 )
    Aber Du hast Recht, hat mit BarbaraZ-'s Problem nichts zu tun.

    Was ich sehe, in Deinem Screenshot, ist für mich schon sehr interresant.
    Jedoch werden viele dieser Funktionen bei mir durch mein Appmenu.uc.js abgedeckt!
    Es gibt da, wie ich schon schrieb, aber auch Funktionen, die mich "kitzeln".
    ot/ENDE

    Zurück zum Thema.

  • Aufruf extra confing menu.uc.js

    • Mira_Belle
    • 3. Oktober 2025 um 17:16

    BarbaraZ- Bedenke, je mehr JavaScripte Du nutzt, desto eher kann so etwas passieren:!:

    Mein Vorschlag, überlege Dir welche Funktionen bei welchem Skript wichtig sind, bzw. waren.
    Eventuell kann man dann ein "neues" Skript basteln, welche Dir dann jene Funktionen bieten.

    Ich z.B. habe einen Button, der abput:about öffnet, das reicht, ich brauche kein Extramenü,
    welches mir noch einmal "ausgewählte" Aufrufe präsentiert.
    Auch nutze ich ein weiteres Skript, welches mir einen Button, nebst Menü generiert, damit ich direkt
    diverse Ordner öffnen kann.
    Was mir bisher noch nicht so richtig gelingen will, das "UserCSSLoader"-Skript da "richtig" zu integrieren.

    Ich finde "Dein" Skript interessant, jedoch hat es Funktionen, die ich als überflüssig erachte.
    Aber auch welche, die mich auf neue Ideen bringen, und die ich gut finde.

  • Aufruf extra confing menu.uc.js

    • Mira_Belle
    • 3. Oktober 2025 um 15:44

    Ok, scheint wohl doch zu funktionieren.
    Ich schrieb ja, so auf die Schnelle!
    Es gibt wohl Überschneidungen mit anderen Skripten, weshalb ich dieses Skript noch einmal separat getestet habe.

    Aber eine Sache bleibt dennoch offen, das CSS:!:

  • Aufruf extra confing menu.uc.js

    • Mira_Belle
    • 3. Oktober 2025 um 13:36
    Zitat von BarbaraZ-

    Moin,
    mit dem Update auf die Version 143.0.3 läuft hier einiges unrund.

    Das hat aber gar nichts mit dem Skript zu tun.
    Welches CSS nutzt Du denn für die Symbole?

    Aber so ganz nebenbei, das Skript funktioniert so auf die schnelle getestet so gar nicht bei mir.
    Es wird nur ein Button nebst einem Menü erzeugt.

  • Der Glückwunsch-Thread

    • Mira_Belle
    • 3. Oktober 2025 um 11:23

    Ups,
    auch von mir,
    Nachträglich noch alles Gute!

  • Skript zum Anpassen der Scrollbar funktioniert nicht mehr richtig

    • Mira_Belle
    • 1. Oktober 2025 um 20:50
    Zitat von Dharkness

    ... unangenehmen Schreibfehler begangen, - statt _ und schon ging es nicht, ...

    Geht de Mensche wie de Leut'. 8o
    Ist mir auch schon mehr wie einmal passiert, und dann sieht man es manches Mal gar nicht selber und sucht sich einen Wolf.

  • Skript zum Anpassen der Scrollbar funktioniert nicht mehr richtig

    • Mira_Belle
    • 1. Oktober 2025 um 16:48

    Boersenfeger So ganz verstehe ich Dich nicht!
    Du kannst doch die Breite in der user.js frei definieren!
    Es müssen ja keine 22px sein, das kannst Du ganz Deinen Wünschen anpassen:!:

    Aber, wenn ich Deine Screenshots anschaue, fällt mir auch, dass der Farbverlauf auch nicht wie vorgesehen
    eingestellt ist. Soll das so?
    (Beim zweiten Bildchen [Hover?])

  • Skript zum Anpassen der Scrollbar funktioniert nicht mehr richtig

    • Mira_Belle
    • 1. Oktober 2025 um 15:22
    Zitat von Dharkness

    ... getestet, aber Pfeil-hoch.svg ...

    Lassen die sich im Skript einfärben?
    Bei den anderen ist die Farbe ja vorgegeben!


    Ach und lass mir mal Deine Symbole zukommen,
    jene, die bei Dir nicht angezeigt werden.
    Ich würde das gerne mal testen, eventuell fällt mir dann ja dazu was ein.

  • Skript zum Anpassen der Scrollbar funktioniert nicht mehr richtig

    • Mira_Belle
    • 1. Oktober 2025 um 12:58

    Dharkness Merkwürdig.

    Kannst Du mal testen?

    Pfeile.zip

    Sind alle Pfeile, sowohl schon Farblich, als auch "anpassbar"!

  • Skript zum Anpassen der Scrollbar funktioniert nicht mehr richtig

    • Mira_Belle
    • 1. Oktober 2025 um 12:04

    Gedanken zu den Symbolen!

    Es scheint wohl so, dass mit diesem Skript nur Vektorgrafiken gescheit funktionieren.
    Wenn wer auch immer unbedingt PNG's oder was anderes nehmen will,
    muss es zusehen, wie er das Skript dann anpasst,

    Er müsste sich eigentlich nur die Light-Version mal genauer anschauen. #237

  • Skript zum Anpassen der Scrollbar funktioniert nicht mehr richtig

    • Mira_Belle
    • 1. Oktober 2025 um 10:44

    Hier die neueste Version!

    Ich hoffe ja, dass nun alle Glücklich damit werden,

    ABER, lest verdammt noch mal bitte den Header durch, dafür ist der da!
    Dort wird das Wichtigste erklärt.

    JavaScript
    // Scrollbar.uc.js
    
    "use strict";
    /* Custom Scrollbars for Firefox ********************************************************************************************* */
    /*																															   */
    /* Version: v2.0.8.b.uc.js for Firefox 143+ 																				   */
    /*																															   */
    /* Scrollbar.v2.0.8.b.uc.js	  https://www.camp-firefox.de/forum/thema/139766/?postID=1280302#post1280302					   */
    /*																															   */
    /* ******************************************************************************************************************************
    
    	README
    
    		about:config >
    			widget.windows.overlay-scrollbars.enabled > false (Windows)
    			widget.gtk.overlay-scrollbars.enabled > false (Linux)
    		[!] The above preferences have to be set to 'false' for this code to work
    		[!] Die genannten Einstellungen müssen auf 'false' gesetzt werden, damit dieser Code funktioniert.
    
    		user.js >
    			user_pref("widget.non-native-theme.win.scrollbar.use-system-size", false);	// false schaltet die Systemeinstellung aus
    			user_pref("widget.non-native-theme.scrollbar.size.override", 22);			// 22 setzt die Scrollbarbreite auf 22px)
    		[!] The above entries must be set in user.js for this code to work.
    		[!] Die oben genannten Einträge müssen in der user.js gesetzt werden, damit dieser Code funktioniert.
    
    			/* ----------------------------------------------------------------------------------- */
    			/*     Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen     */
    			/*            %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons             */
    			/*                                                                                     */
    			/*   Auch müssen die Dateinamen im Skript mit jenen im Ordner "icons" übereinstimmen   */
    			/* ----------------------------------------------------------------------------------- */
    
    /* *************************************************************************************************************************** */
    
    (function() {
    
      /* **** Konfiguration **** */
    
      // PROFILE PHATH "CALCULATE"
      let ProfileDirectory = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons'));
    
      // CUSTOM SCROLLBAR COLORS/GRADIENTS
      // - scrollbar
      let cs_scrollbar_arrows_color = 						"#bfbfbf"				   ;// "#7c7c7c"	"#1e90ff"
      let cs_scrollbar_arrows_hover_color = 				"#ffa600"				   ;// "#ffa600"	"#bebebe"
      let cs_scrollbar_size =								22							;// Important!	See README !!
      // - background
      let cs_background_color = 							"#5b5b66"				   ;// default: cs_background_color = "#DDDDDD"	/ "#AEC5FA"
      let cs_background_roundness = 						0							;// default: cs_background_roundness = 0 / in px	/ 9
      let cs_ignore_color_gradients = 						true						;// default: cs_ignore_color_gradients = false / true 'flat' scrollbars
      // - corner
      let cs_corner_background_color = 						"#bfbfbf"				   ;// default: cs_corner_background_color = "#DDDDDD" / - corner	/ "#CCCCCC"
      // - thumb/slider
      let cs_thumb_color = 									"#bfbfbf"				   ;// default: cs_thumb_color = "#33CCFF" / thumb/slider
      let cs_thumb_hover_color = 							"#ffa600"				   ;// default: cs_thumb_hover_color = "#66FFFF"
      let cs_thumb_border_color = 							"#5b5b66"				   ;// default: cs_thumb_border_color = "#33CCFF"
      let cs_thumb_border = 								1							;// default: cs_thumb_border = 0 / in px 1
      let cs_thumb_roundness = 								9							;// default: cs_thumb_roundness = 0 / in px 9
      let cs_thumb_minimal_size = 							17							;// default: cs_thumb_minimal_size = 17 / in px
      // - buttons
      let cs_buttons_color = 								"#5b5b66"				   ;// default: cs_buttons_color = "#66FFFF" "Bahama Blue";/ buttons
      let cs_buttons_hover_color = 							"#5b5b66"				   ;// default: cs_buttons_hover_color = "#33CCFF"	/ "#bfffff"
      let cs_button_size =									17							;// in px // default: cs_button_size = 17 / in px
      let cs_buttons_border = 								0							;// default: cs_buttons_border = 0 / in px
      let cs_buttons_roundness = 							0							;// default: cs_buttons_roundness = 0 / in px
     
      /* **** Ende Konfiguration **** */
    
    /* *************************************************************************************************************************** */
      // FIXED SCROLL BAR COLORS/COLOR GRADIENTS
    	// - fixed values for background image gradients
    	let GRADIENT_VERTICAL = 							"linear-gradient(to right,transparent,rgba(255,255,255,0.5),transparent)";
    	let GRADIENT_HORINZONTAL = 							"linear-gradient(to bottom,transparent,rgba(255,255,255,0.5),transparent)";
    	// - background  
    	let cs_background_image_vertical = 					GRADIENT_VERTICAL			;// default: cs_background_image_vertical = "linear-gradient(to right,transparent,rgba(255,255,255,0.5),transparent)"
    	let cs_background_image_horizontal = 				GRADIENT_HORINZONTAL		;// default: cs_background_image_horizontal = "linear-gradient(to bottom,transparent,rgba(255,255,255,0.5),transparent)"
    	// - corner
    	let cs_corner_background_image = 					"linear-gradient(45deg,transparent 30%,rgba(255,255,255,0.5) 50%,transparent 70%),linear-gradient(-45deg,transparent 30%,rgba(255,255,255,0.5) 50%,transparent 70%)"						;// default: cs_corner_background_image = "linear-gradient(45deg,transparent 30%,rgba(255,255,255,0.5) 50%,transparent 70%),linear-gradient(-45deg,transparent 30%,rgba(255,255,255,0.5) 50%,transparent 70%)"
    	// - thumb/slider
    	let cs_thumb_image_vertical = 						GRADIENT_VERTICAL			;// default: cs_thumb_image_vertical = "linear-gradient(to right,transparent,rgba(255,255,255,0.5),transparent)"
    	let cs_thumb_image_horizontal = 					GRADIENT_HORINZONTAL		;// default: cs_thumb_image_horizontal = "linear-gradient(to bottom,transparent,rgba(255,255,255,0.5),transparent)"
    	let cs_thumb_hover_image_vertical = 				GRADIENT_VERTICAL			;// default: cs_thumb_hover_image_vertical = "linear-gradient(to right,transparent,rgba(255,255,255,0.5),transparent)"
    	let cs_thumb_hover_image_horizontal = 				GRADIENT_HORINZONTAL		;// default: cs_thumb_hover_image_horizontal = "linear-gradient(to bottom,transparent,rgba(255,255,255,0.5),transparent)"
    	// - buttons
    	let cs_buttons_image_vertical = 					GRADIENT_VERTICAL			;// default: cs_buttons_image_vertical = "linear-gradient(to right,transparent,rgba(255,255,255,0.5),transparent)"
    	let cs_buttons_image_horizontal = 					GRADIENT_HORINZONTAL		;// default: cs_buttons_image_horizontal = "linear-gradient(to bottom,transparent,rgba(255,255,255,0.5),transparent)"
    	let cs_buttons_hover_image_vertical = 				GRADIENT_VERTICAL			;// default: cs_buttons_hover_image_vertical = "linear-gradient(to right,transparent,rgba(255,255,255,0.5),transparent)"
    	let cs_buttons_hover_image_horizontal =				GRADIENT_HORINZONTAL		;// default: cs_buttons_hover_image_horizontal = "linear-gradient(to bottom,transparent,rgba(255,255,255,0.5),transparent)"
    
      // unset background image color gradients -> flat scrollbars
      if(cs_ignore_color_gradients === true)
    	cs_background_image_vertical
    	= cs_background_image_horizontal
    	= cs_corner_background_image
    	= cs_thumb_image_vertical
    	= cs_thumb_image_horizontal
    	= cs_thumb_hover_image_vertical
    	= cs_thumb_hover_image_horizontal
    	= cs_buttons_image_vertical
    	= cs_buttons_image_horizontal
    	= cs_buttons_hover_image_vertical
    	= cs_buttons_hover_image_horizontal
    	= "unset";
    
      let custom_scrollbars_code='';
      let custom_scrollbar_arrows_code='';
    
    	custom_scrollbars_code=`
    		scrollcorner,
      		scrollbar > slider, 
    		scrollbar > slider > thumb, 
    		scrollbar > scrollbarbutton {
    		/*  appearance: auto; */
    		  -moz-default-appearance: none !important;
    		}
    		scrollbar > slider {
    		  background-color: ${cs_background_color} !important;
    		  background-image: ${cs_background_image_horizontal} !important;
    		  border-radius: ${cs_background_roundness}px !important;
    		}
    		scrollbar[vertical] > slider {
    		  background-image: ${cs_background_image_vertical} !important;
    		  border-radius: ${cs_background_roundness}px !important;
    		}
    		scrollcorner {
    		  background-color: ${cs_corner_background_color} !important;
    		  background-image: ${cs_corner_background_image} !important;
    		}
    		scrollbar > slider > thumb {
    		  background-color: ${cs_thumb_color} !important;
    		  border-radius: ${cs_thumb_roundness}px !important;
    		  box-shadow: inset 0 0 0 ${cs_thumb_border}px ${cs_thumb_border_color} !important;
    		}
    		scrollbar[vertical] > slider > thumb {
    		  background-image: ${cs_thumb_image_vertical} !important;
    		  min-height: ${cs_thumb_minimal_size}px !important;
    		}
    		scrollbar > slider > thumb {
    		  background-image: ${cs_thumb_image_horizontal} !important;
    		  min-width: ${cs_thumb_minimal_size}px !important;
    		}
    		scrollbar > slider > thumb:hover, scrollbar > slider > thumb:active {
    		  background-color: ${cs_thumb_hover_color} !important;
    		}
    		scrollbar > slider > thumb[vertical]:hover, scrollbar > slider > thumb[vertical]:active {
    		  background-image: ${cs_thumb_hover_image_vertical} !important;
    		}
    		scrollbar > slider > thumb[horizontal]:hover, scrollbar > slider > thumb[horizontal]:active {
    		  background-image: ${cs_thumb_hover_image_horizontal} !important;
    		}
    		scrollbar > scrollbarbutton {
    		  background-color: ${cs_buttons_color} !important;
    		  border-radius: ${cs_buttons_roundness}px !important;
    		  box-shadow: inset 0 0 0 ${cs_buttons_border}px !important;
    		}
    		scrollbar[vertical] scrollbarbutton {
    		  background-image: ${cs_buttons_image_vertical} !important;
    		}
    		scrollbar[horizontal] scrollbarbutton {
    		  background-image: ${cs_buttons_image_horizontal} !important;
    		}
    		scrollbar > scrollbarbutton:hover {
    		  background-color: ${cs_buttons_hover_color} !important;
    		}
    		scrollbar[vertical] scrollbarbutton:hover {
    		  background-image: ${cs_buttons_hover_image_vertical} !important;
    		}
    		scrollbar[horizontal] scrollbarbutton:hover {
    		  background-image: ${cs_buttons_hover_image_horizontal} !important;
    		}
    	`;
    
    	custom_scrollbar_arrows_code=`
    
    		scrollbar > scrollbarbutton {
    		  background-repeat: no-repeat !important;
    		  background-position: center center !important;
    		}
    		scrollbar[vertical] > scrollbarbutton[type="decrement"] {
    		  background-image: url("${ProfileDirectory}/Pfeil-hoch.svg") !important;
    		    -moz-context-properties: fill, fill-opacity;
                fill: ${cs_scrollbar_arrows_color} !important;
                fill-opacity: 1 !important;
    			background-position: top !important;
    			min-width: ${cs_scrollbar_size}px !important;
    			min-height: ${cs_scrollbar_size}px !important;
    		}
    		scrollbar[vertical] > scrollbarbutton[type="increment"] {
    		  background-image: url("${ProfileDirectory}/Pfeil-runter.svg") !important;
    		    -moz-context-properties: fill, fill-opacity;
                fill: ${cs_scrollbar_arrows_color} !important;
                fill-opacity: 1 !important;
    			background-position: bottom !important;
    			min-width: ${cs_scrollbar_size}px !important;
    			min-height: ${cs_scrollbar_size}px !important;
    		}
    		scrollbar > scrollbarbutton[type="decrement"] {
    		  background-image: url("${ProfileDirectory}/Pfeil-links.svg") !important;
    		    -moz-context-properties: fill, fill-opacity;
                fill: ${cs_scrollbar_arrows_color} !important;
                fill-opacity: 1 !important;
    			background-position: left !important;
    			min-width: ${cs_scrollbar_size}px !important;
    			min-height: ${cs_scrollbar_size}px !important;
    		}
    		scrollbar > scrollbarbutton[type="increment"] {
    		  background-image: url("${ProfileDirectory}/Pfeil-rechts.svg") !important;
    		    -moz-context-properties: fill, fill-opacity;
                fill: ${cs_scrollbar_arrows_color} !important;
                fill-opacity: 1 !important;
    			background-position: right !important;
    			min-width: ${cs_scrollbar_size}px !important;
    			min-height: ${cs_scrollbar_size}px !important;
    		}
    
    		/* Hover */
    
    		scrollbar[vertical] > scrollbarbutton[type="decrement"]:hover {
    		  background-image: url("${ProfileDirectory}/Pfeil-hoch.svg") !important;
    		    -moz-context-properties: fill, fill-opacity;
                fill: ${cs_scrollbar_arrows_hover_color} !important;
                fill-opacity: 1 !important;
    			background-position: top !important;
    		}
    		scrollbar[vertical] > scrollbarbutton[type="increment"]:hover {
    		  background-image: url("${ProfileDirectory}/Pfeil-runter.svg") !important;
    		    -moz-context-properties: fill, fill-opacity;
                fill: ${cs_scrollbar_arrows_hover_color} !important;
                fill-opacity: 1 !important;
    			background-position: bottom !important;
    		}
    		scrollbar > scrollbarbutton[type="decrement"]:hover {
    		  background-image: url("${ProfileDirectory}/Pfeil-links.svg") !important;
    		    -moz-context-properties: fill, fill-opacity;
                fill: ${cs_scrollbar_arrows_hover_color} !important;
                fill-opacity: 1 !important;
    			background-position: left !important;
    		}
    		scrollbar > scrollbarbutton[type="increment"]:hover {
    		  background-image: url("${ProfileDirectory}/Pfeil-rechts.svg") !important;
    		    -moz-context-properties: fill, fill-opacity;
                fill: ${cs_scrollbar_arrows_hover_color} !important;
                fill-opacity: 1 !important;
    			background-position: right !important;
    		}
    		scrollbar > scrollbarbutton {
    			min-width: ${cs_button_size}px !important;
    			min-height: ${cs_button_size}px !important;
    		}
    
    	`;
    
    	Components.classes["@mozilla.org/content/style-sheet-service;1"]
    		.getService(Components.interfaces.nsIStyleSheetService)
    			.loadAndRegisterSheet(Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
    				${custom_scrollbars_code}
    				${custom_scrollbar_arrows_code}
    			`), null, null),
    	Components.classes["@mozilla.org/content/style-sheet-service;1"]
    		.getService(Components.interfaces.nsIStyleSheetService).AGENT_SHEET);
    
    })();
    Alles anzeigen

Unterstütze uns!

Jährlich (2026)

69,4 %

69,4% (538,17 von 775 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon