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. Boersenfeger

Beiträge von Boersenfeger

  • Probleme mit dem Tab-CSS

    • Boersenfeger
    • 24. Oktober 2022 um 15:32

    Habe nach ein paar Tagen und Nightly-UpDates den 1. Codeschnipsel aus # 8 nochmal aktiviert, aber die Erscheinung, das ich dann im Kontextmenü vom UserCSSLoaderScript nicht mehr bis oben hin scrollen kann um eine CSS-Änderung sofort aktiv zu stellen, ist leider noch existent. Hat jemand noch eine Idee? Die mittige Tabsanordnung hätte ich schon gern zurück. :)

    Ggf. könnte man ja alternativ das UserCSSLoaderScript bearbeiten, das die entsprechende Schaltfläche im Kontextmenü nicht oben sondern unten erscheint...

    JavaScript
    // ==UserScript==
    // @name UserCSSLoader
    // @description CSS Codes - Styles laden und verwalten
    // @namespace https://d.hatena.ne.jp/Griever/
    // @author Griever
    // @include main
    // @license MIT License
    // @compatibility Firefox 4 - 102*
    // @charset UTF-8
    // @version 0.0.4k
    // @note Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile()
    // @note AUTHOR_SHEET Verwendung hinzugefügt, wichtig: am Ende des Dateinamens .author.css
    // @note Version 0.0.4.g ermoeglicht "Styles importieren" per Mittelklick und Verwendung
    // @note eines anderen Dateimanager (s. vFileManager in Zeile 53)
    // @note Frei verschiebbare Schaltfläche eingebaut von aborix
    // @note 0.0.4 Remove E4X
    // @note CSSEntry-Klasse erstellt
    // @note Style-Test-Funktion überarbeitet
    // @note Wenn die Datei gelöscht wurde, CSS beim Neu erstellen und Löschen des Menüs abbrechen
    // @note uc einlesen .uc.css temporäre Korrespondenz zum erneuten Lesen
    // ==/UserScript==
    
    /****** Bedienungsanleitung ******
    
    Da der CSS-Ordner im Chrome-Ordner erstellt wurde, CSS-Dateien dort ablegen - speichern.
    Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css" enden, sind AGENT_SHEET,
    andere außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird,
    darauf achten, @ Namespace Angabe nicht zu vergessen!
    
    CSS-Menü wird zur Menüleiste hinzugefügt
    Linksklick auf Stil, zum aktivieren/deaktivieren
    Mittelklick auf Stil zum aktivieren/deaktivieren, ohne Menü zu schließen
    Rechtsklick auf Stil zum Öffnen im Editor
    
    Verwenden des in "view_source.editor.path" angegebenen Editors
    Ordner kann geändert werden, indem ein Pfad in "UserCSSLoader.FOLDER" eingefügt wird
    
    **** Anleitung Ende ****/
    
    (function(){
    
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    if (!window.Services)
    Cu.import("resource://gre/modules/Services.jsm");
    // Wenn beim Start ein anderes Fenster angezeigt wird (das zweite Fenster), wird es beendet
    let list = Services.wm.getEnumerator("navigator:browser");
    while(list.hasMoreElements()){ if(list.getNext() != window) return; }
    
    if (window.UCL) {
    window.UCL.destroy();
    delete window.UCL;
    }
    
    window.UCL = {
    vFileManager: 'H:\\Total Commander\\TOTALCMD64.EXE',
    vFMParameter: '/T',
    USE_UC: "UC" in window,
    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 = 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("CSS");
    }
    if (!aFolder.exists() || !aFolder.isDirectory()) {
    aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
    }
    delete this.FOLDER;
    return this.FOLDER = aFolder;
    },
    getFocusedWindow: function() {
    let win = document.commandDispatcher.focusedWindow;
    if (!win || win == window) win = content;
    return win;
    },
    
    init: function() {
    const cssmenu = $C("menu", {
    id: "usercssloader-menu",
    label: "CSS",
    accesskey: "C",
    onclick: "if (event.button == 1) UCL.rebuild()"
    });
    const menupopup = $C("menupopup", {
    id: "usercssloader-menupopup"
    });
    cssmenu.appendChild(menupopup);
    
    let menu = $C("menu", {
    label: "Style Loader Menü",
    accesskey: "M"
    });
    menupopup.appendChild(menu);
    let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
    menu.appendChild(mp);
    mp.appendChild($C("menuitem", {
    label: "Styles importieren",
    accesskey: "R",
    acceltext: "Alt + R",
    oncommand: "UCL.rebuild();"
    }));
    mp.appendChild($C("menuseparator"));
    mp.appendChild($C("menuitem", {
    label: "CSS Datei erstellen",
    accesskey: "D",
    oncommand: "UCL.create();"
    }));
    mp.appendChild($C("menuitem", {
    label: "CSS Ordner öffnen",
    accesskey: "O",
    oncommand: "UCL.openFolder();"
    }));
    mp.appendChild($C("menuitem", {
    label: "userChrome.css bearbeiten",
    hidden: false,
    oncommand: "UCL.editUserCSS(\'userChrome.css\');"
    }));
    mp.appendChild($C("menuitem", {
    label: "userContent.css bearbeiten",
    hidden: false,
    oncommand: "UCL.editUserCSS(\'userContent.css\');"
    }));
    mp.appendChild($C("menuseparator"));
    mp.appendChild($C("menuitem", {
    label: "Style Test (Chrome)",
    id: "usercssloader-test-chrome",
    hidden: true,
    accesskey: "C",
    oncommand: "UCL.styleTest(window);"
    }));
    mp.appendChild($C("menuitem", {
    label: "Style Test (Web)",
    id: "usercssloader-test-content",
    hidden: true,
    accesskey: "W",
    oncommand: "UCL.styleTest();"
    }));
    mp.appendChild($C("menuitem", {
    label: "Styles dieser Seite auf userstyles.org finden",
    accesskey: "S",
    oncommand: "UCL.searchStyle();"
    }));
    
    menu = $C("menu", {
    label: ".uc.css",
    accesskey: "U",
    hidden: !UCL.USE_UC
    });
    menupopup.appendChild(menu);
    mp = $C("menupopup", { id: "usercssloader-ucmenupopup" });
    menu.appendChild(mp);
    mp.appendChild($C("menuitem", {
    label: "Importieren(.uc.js)",
    oncommand: "UCL.UCrebuild();"
    }));
    mp.appendChild($C("menuseparator", { id: "usercssloader-ucseparator" }));
    
    CustomizableUI.createWidget({
    id: 'usercssloader-menu-item',
    type: 'custom',
    defaultArea: CustomizableUI.AREA_NAVBAR,
    onBuild: function(aDocument) {
    let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbaritem');
    toolbaritem.id = 'usercssloader-menu-item';
    toolbaritem.className = 'chromeclass-toolbar-additional';
    return toolbaritem;
    }
    });
    $('usercssloader-menu-item').appendChild(cssmenu);
    
    //let refNode = $('helpMenu');
    //refNode.parentNode.insertBefore(cssmenu, refNode.nextSibling);
    
    $("mainKeyset").appendChild($C("key", {
    id: "usercssloader-rebuild-key",
    oncommand: "UCL.rebuild();",
    key: "R",
    modifiers: "alt",
    }));
    this.rebuild();
    this.initialized = true;
    if (UCL.USE_UC) {
    setTimeout(function() {
    UCL.UCcreateMenuitem();
    }, 1000);
    }
    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", 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 = "Style importiert";
    else
    XULBrowserWindow.statusTextField.label = "Styles importieren";
    }
    },
    loadCSS: function(aFile) {
    var 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) {
    var CSS = this.readCSS[aLeafName];
    var 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",
    oncommand    : "UCL.toggle('"+ aLeafName +"');",
    onclick        : "UCL.itemClick(event);"
    });
    document.getElementById("usercssloader-menupopup").appendChild(menuitem);
    }
    menuitem.setAttribute("checked", CSS.enabled);
    },
    toggle: function(aLeafName) {
    var CSS = this.readCSS[aLeafName];
    if (!CSS) return;
    CSS.enabled = !CSS.enabled;
    this.rebuildMenu(aLeafName);
    },
    itemClick: function(event) {
    if (event.button == 0) return;
    event.preventDefault();
    event.stopPropagation();
    let label = event.currentTarget.getAttribute("label");
    if (event.button == 1) {
    this.toggle(label);
    }
    else if (event.button == 2) {
    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;
    },
    styleTest: function(aWindow) {
    aWindow || (aWindow = this.getFocusedWindow());
    new CSSTester(aWindow, function(tester){
    if (tester.saved)
    UCL.rebuild();
    });
    },
    searchStyle: function() {
    let word;
    try {
    word = gBrowser.currentURI.host;
    } catch {
    word = gBrowser.currentURI.spec;
    }
    openWebLinkIn("https://userstyles.org/styles/search/" + word, "tab", {});
    },
    openFolder:function(){
    if (this.vFileManager.length != 0) {
    var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
    var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    var args=[this.FOLDER.path];
    file.initWithPath(this.vFileManager);
    process.init(file);
    // Verzeichnis mit anderem Dateimanager öffnen
    process.run(false, args, args.length);
    } else {
    // Verzeichnis mit Dateimanager des Systems öffnen
    this.FOLDER.launch();
    }
    },
    editUserCSS: function(aLeafName) {
    let file = Services.dirsvc.get("UChrm", Ci.nsIFile);
    file.appendRelativePath(aLeafName);
    this.edit(file);
    },
    edit: function(aFile) {
    var editor = Services.prefs.getCharPref("view_source.editor.path");
    if (!editor) return alert("Unter about:config den vorhandenen Schalter:\n view_source.editor.path mit dem Editorpfad ergänzen");
    try {
    var UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
    var path = UI.ConvertFromUnicode(aFile.path);
    var app = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
    app.initWithPath(editor);
    var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.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",
    oncommand    : "this.setAttribute('checked', !(this.css.disabled = !this.css.disabled));",
    onclick        : "UCL.UCItemClick(event);"
    });            
    m.css = css;
    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(Components.interfaces.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:
    Ci.nsIStyleSheetService.USER_SHEET;
    }
    CSSEntry.prototype = {
    sss: Components.classes["@mozilla.org/content/style-sheet-service;1"]
    .getService(Components.interfaces.nsIStyleSheetService),
    _enabled: false,
    get enabled() {
    return this._enabled;
    },
    set enabled(isEnable) {
    var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile)
    aFile.initWithPath(this.path);
    
    var isExists = aFile.exists(); // Wenn die Datei existiert true
    var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
    var isForced = this.lastModifiedTime != lastModifiedTime; // Wenn es eine Änderung in der Datei gibt true
    
    var fileURL = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile);
    var 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;
    },
    };
    
    function CSSTester(aWindow, aCallback) {
    this.win = aWindow || window;
    this.doc = this.win.document;
    this.callback = aCallback;
    this.init();
    }
    CSSTester.prototype = {
    sss: Components.classes["@mozilla.org/content/style-sheet-service;1"]
    .getService(Components.interfaces.nsIStyleSheetService),
    preview_code: "",
    saved: false,
    init: function() {
    this.dialog = openDialog(
    "data:text/html;charset=utf8,"+encodeURIComponent('<!DOCTYPE HTML><html lang="de"><head><title>CSSTester</title></head><body></body></html>'),
    "",
    "width=550,height=400,dialog=no");
    this.dialog.addEventListener("load", this, false);
    },
    destroy: function() {
    this.preview_end();
    this.dialog.removeEventListener("unload", this, false);
    this.previewButton.removeEventListener("click", this, false);
    this.saveButton.removeEventListener("click", this, false);
    this.closeButton.removeEventListener("click", this, false);
    },
    handleEvent: function(event) {
    switch(event.type) {
    case "click":
    if (event.button != 0) return;
    if (this.previewButton == event.currentTarget) {
    this.preview();
    }
    else if (this.saveButton == event.currentTarget) {
    this.save();
    }
    else if (this.closeButton == event.currentTarget) {
    this.dialog.close();
    }
    break;
    case "load":
    var doc = this.dialog.document;
    doc.body.innerHTML = '\
    <style type="text/css">\
    :not(input):not(select) { padding: 0px; margin: 0px; }\
    table { border-spacing: 0px; }\
    body, html, #main, #textarea { width: 100%; height: 100%; }\
    #textarea { font-family: monospace; }\
    </style>\
    <table id="main">\
    <tr height="100%">\
    <td colspan="4"><textarea id="textarea"></textarea></td>\
    </tr>\
    <tr height="40">\
    <td><input type="button" value="Vorschau" id="Vorschau"/></td>\
    <td><input type="button" value="Speichern" id="Speichern"/></td>\
    <td width="80%"><span class="log"></span></td>\
    <td><input type="button" value="Schließen" id="Schliessen"/></td>\
    </tr>\
    </table>\
    ';
    this.textbox = doc.querySelector("textarea");
    this.previewButton = doc.querySelector('input[value="Vorschau"]');
    this.saveButton = doc.querySelector('input[value="Speichern"]');
    this.closeButton = doc.querySelector('input[value="Schließen"]');
    this.logField = doc.querySelector('.log');
    
    var code = "@namespace url(" + this.doc.documentElement.namespaceURI + ");\n";
    code += this.win.location.protocol.indexOf("http") === 0?
    "@-moz-document domain(" + this.win.location.host + ") {\n\n\n\n}":
    "@-moz-document url(" + this.win.location.href + ") {\n\n\n\n}";
    this.textbox.value = code;
    this.dialog.addEventListener("unload", this, false);
    this.previewButton.addEventListener("click", this, false);
    this.saveButton.addEventListener("click", this, false);
    this.closeButton.addEventListener("click", this, false);
    
    this.textbox.focus();
    let p = this.textbox.value.length - 3;
    this.textbox.setSelectionRange(p, p);
    
    break;
    case "unload":
    this.destroy();
    this.callback(this);
    break;
    }
    },
    preview: function() {
    var code = this.textbox.value;
    if (!code || !/\:/.test(code))
    return;
    code = "data:text/css;charset=utf-8," + encodeURIComponent(this.textbox.value);
    if (code == this.preview_code)
    return;
    this.preview_end();
    var uri = Services.io.newURI(code, null, null);
    this.sss.loadAndRegisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET);
    this.preview_code = code;
    this.log("Preview");
    },
    preview_end: function() {
    if (this.preview_code) {
    let uri = Services.io.newURI(this.preview_code, null, null);
    this.sss.unregisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET);
    this.preview_code = "";
    }
    },
    save: function() {
    var data = this.textbox.value;
    if (!data) return;
    
    var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
    fp.init(window, "", Ci.nsIFilePicker.modeSave);
    fp.appendFilter("CSS Files","*.css");
    fp.defaultExtension = "css";
    if (window.UCL)
    fp.displayDirectory = UCL.FOLDER;
    var res = fp.show();
    if (res != fp.returnOK && res != fp.returnReplace) return;
    
    var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
    suConverter.charset = "UTF-8";
    data = suConverter.ConvertFromUnicode(data);
    var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
    foStream.init(fp.file, 0x02 | 0x08 | 0x20, 0664, 0);
    foStream.write(data, data.length);
    foStream.close();
    this.saved = true;
    },
    log: function() {
    this.logField.textContent = dateFormat(new Date(), "%H:%M:%S") + ": " + $A(arguments);
    }
    };
    
    UCL.init();
    
    function $(id) { return document.getElementById(id); }
    function $A(arr) { return Array.slice(arr); }
    function $C(name, attr) {
    var 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.getDay()).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() { Application.console.log(Array.slice(arguments)); }
    
    })();
    Alles anzeigen
  • userChrome.js Scripte für den Fuchs (Diskussion)

    • Boersenfeger
    • 24. Oktober 2022 um 15:09

    Multitrowtabs ?

    Dann doch lieber Multirowtabs :)

  • Probleme mit dem Tab-CSS

    • Boersenfeger
    • 20. Oktober 2022 um 20:43

    Danke, Zeile 56 ist jetzt auf 2px gesetzt und das reicht mir... :thumbup:

    Gibts vielleicht auch noch eine Lösung für die mittigen Tabs? :)

  • Probleme mit dem Tab-CSS

    • Boersenfeger
    • 20. Oktober 2022 um 18:37

    Gut, dann muss ich schreiben, dass ER bei mir die Kalamitäten ausgelöst hat, denn Ohne IHN, funktionieren ja die 2 geschilderten Funktionen wieder reibungslos

    Zitat

    ..das Kontextmenü des UserCSSLoader-Scripts ist nicht zu gebrauchen und die Tabs lassen sich, wenn mehr Tabs als Bildschirmbreite vorhanden sind, nicht mehr alle ansteuern...

    Nur die Erscheinungen mit der nicht mehr mittigen Tabsanordnung und die Größenunterschiede stören noch.... ;)

  • Probleme mit dem Tab-CSS

    • Boersenfeger
    • 20. Oktober 2022 um 18:17

    Es lag an diesem Schnipsel

    CSS
        /* Tabs in Tableiste mittig *
        
        scrollbox:not(#PlacesToolbarItems) {
        -moz-box-pack: center !important;
        }

    Edit: Eigentlich schade, da nun die Tabs nicht mehr mittig angeordnet werden, wenn nur wenige geöffnet sind! Editende:

    Mit diesem Code sieht das ganze dann so aus.... im Hintergrund, das auch noch das Tab Focus Script arbeitet....

    CSS
        @-moz-document url(chrome://browser/content/browser.xhtml){
    
        /* Tabs rund und farbig */
    
        /* Angaben für die TAB-Leiste */
    
        /* TAB bei bei angewähltem TAB (aktiv):*/
        /* Hintergrundfarbe, Rahmen,*/
        /* Schriftfarbe. */
     
       .tabbrowser-tab:is([visuallyselected="true"], [multiselected]) > .tab-stack > .tab-background {
        background: red !important;
        border-radius: 18px 18px !important;
        margin-top: 1px !important;  
        border: none !important;
        color: black ! important; 
        margin-bottom: 0 !important;
        }
        }
        
        /* Schliessen-Button nur wenn angewählt */
    
        tab:not([selected]) .tab-close-button {display: none !important; 
        }
    
     
        /* Schriftgröße Tabs */
    
        .tab-text {
        font-size: 15px !important;
        }
        
        /* Damit wird der Tabtext am Ende nicht ausgeblendet */
        
        .tab-label-container[textoverflow][labeldirection=ltr]:not([pinned]),
        .tab-label-container[textoverflow]:not([labeldirection]):not([pinned]):-locale-dir(ltr) {
        direction: ltr;
        mask-image: linear-gradient(to left, transparent, black 1em) !important; 
        }
        
        /* Doppelte Schliessung ausblenden */
    
        #TabsToolbar > .titlebar-buttonbox-container {
        display:none !important; 
        }
    
        @-moz-document url(chrome://browser/content/browser.xhtml){
        
        .tabbrowser-tab[visuallyselected="true"] .tab-label {
        font-weight:  bold !important;
        }
    
        #TabsToolbar .tabbrowser-tab:not([selected="true"]) {
        border-radius: 16px 16px !important;
        height: 20px ! important;
        margin-top: 0 !important;
        padding: 0 !important;
        color: black ! important; 
        }
        }
        
        /* Tab-Icon etwas größer,
        * links weniger, unten etwas mehr Abstand zum TAB-Rand */
     
        #TabsToolbar .tab-icon-image {
        height: 20px !important;
        width:  20px !important;
        margin-left: -5px !important;    
        margin-bottom: 2px !important;
        }
            
        /* Tab-Schließen-Button:
        * Rechts weniger Abstand zum TAB-Rand, etwas größer,
        * Textfarbe (Kreuz)
        * Hintergrundfarbe, an den Eckenradius des Buttons angepaßt */
     
        #TabsToolbar .tab-close-button {
        margin-right: -8px !important; 
        font-weight: bold !important;    
        color: black !important; 
        }
    
        #TabsToolbar .tab-close-button .toolbarbutton-icon {
        height: 20px !important;
        width:  20px !important;    
        background-color: red !important;
        border-radius: 12px !important; 
        }
        
        /* Aktiver Tab breiter */
        
        .tabbrowser-tab:not([pinned]):not([selected]) {
        min-width: 200px !important;
        max-width: 200px !important;
        }
        .tabbrowser-tab:not([pinned])[selected] {
        min-width: 236px !important;
        max-width: 236px !important;
        }
        
        /* Lautsprechersymbol größer */
        
        .tab-icon-overlay {
        transform: scale(1.8, 1.8) !important;
        }
        
        image.tab-icon-overlay {
        margin-top: 3px !important;
        }
        
         /* Lautsprechersymbol violet bei Sound */
        
        .tab-icon-overlay[soundplaying] {
        fill: blueviolet !important;
        margin-left: -5px !important;
        }
    
        /* Lautsprechersymbol gelb bei Stumm */
        
        .tab-icon-overlay[muted] {
        fill: yellow !important;
        margin-left: -5px !important;
        }
      
        .tabbrowser-tab .tab-content vbox.tab-label-container.proton label[class="tab-icon-sound-label tab-icon-sound-blocked-label"],
        .tabbrowser-tab .tab-content vbox.tab-label-container.proton label[class="tab-icon-sound-label tab-icon-sound-playing-label"],
        .tabbrowser-tab .tab-content vbox.tab-label-container.proton label[class="tab-icon-sound-label tab-icon-sound-muted-label"] {
        display: none !important;
        }
    
        
        /* Tab Beschriftung mittig */
        
        .tab-content {
        display: flex !important; 
        margin-top: -4px !important;
        justify-content: center !important;
        align-items: center !important;
        }
        
        #TabsToolbar .tabbrowser-tab[selected="true"] .tab-content {
        margin-top: 2px !important;
        }
    
        .tab-label-container {
        margin: auto !important;
        }
    
        .tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button {
        flex-shrink: 0 !important; 
        padding: 0 !important; 
        width: 16px !important;
        }
        
        /* Kein Schatten drum */
        
        #TabsToolbar:not([brighttext]) #tabbrowser-tabs:not([noshadowfortests]) .tabbrowser-tab:is([visuallyselected="true"],
        [multiselected]) > .tab-stack > .tab-background
        {
        box-shadow: none !important;
        }
        
        /* Kein blauer Kasten */
        
        tab.tabbrowser-tab {
        --focus-outline-width: 0 !important;
        --focus-outline-color: transparent !important;
        --focus-outline: var(--focus-outline-width) solid var(--focus-outline-color)!important;
        }
        
        /* Tabs Proton-Design */
    
        :root {
        --proton-tab-radius: 0 !important;
        --proton-tab-block-margin: 0 !important;
        --inline-tab-padding: 10px !important;
        }
    
        #TabsToolbar .toolbarbutton-1 {
        min-height: 34px !important;    
        margin-top: 2px !important;    
        margin-bottom: 2px !important;
        }
        
        #TabsToolbar .tabbrowser-tab:not([selected="true"])  {
        min-height: 34px !important;
        border: 1px solid #B2B2B2 !important;
        }
    
        #TabsToolbar .toolbarbutton-1 > image {
        padding: 2px 4px !important;
        }
    
        /* Rahmen um die Tableiste durchsichtig */
    
        #TabsToolbar {
        border: 0.2px solid transparent !important;
        }
         
        #TabsToolbar:hover {
        border: 0.2px solid transparent !important;
        }
    Alles anzeigen

    Die nichtaktiven Tabs kleben jetzt leider oben und sind kleiner als der aktive via Hover rote Tab. :/

  • Mozilla veröffentlicht Firefox 106.0.1

    • Boersenfeger
    • 20. Oktober 2022 um 17:54

    Vielen Dank!

  • Probleme mit dem Tab-CSS

    • Boersenfeger
    • 20. Oktober 2022 um 17:24

    Guckst du im aktuellen FF 106.0.1

    Hier sind alle Tabs gleich groß

    Ich verwende zusätzlich das Script TabFocus.uc.js

    Ggf liegts auch an dem... ich teste mal ohne

    JavaScript
    // ==UserScript==
    // @name           TabFocus.uc.js
    // @startup        window.tab_hover.onLoad();
    // @shutdown       window.tab_hover.onUnload();
    // @version        2014.8.23
    // @note           修改为无需重启的方式
    // ==/UserScript==
    
    var tab_hover = {
       event:null,
       tid:null,
    
       getTab: function(element) {
          while (element && element.localName != 'tab') {
            element = element.parentNode;
          };
          return element;
       },
       onLoad: function() {
          gBrowser.tabContainer.addEventListener("mouseout", tab_hover.onMouseOut, false);
          gBrowser.tabContainer.addEventListener("mouseover", tab_hover.onMouseOver, false);
       },
       onUnload: function() {
          gBrowser.tabContainer.removeEventListener("mouseover", tab_hover.onMouseOver, false);
          gBrowser.tabContainer.removeEventListener("mouseout", tab_hover.onMouseOut, false);
       },
    
       onMouseOver: function(event) {
          tab_hover.event = event.target;
          tab_hover.tid = setTimeout(function() {
             gBrowser.selectedTab = tab_hover.getTab(tab_hover.event);
          }, 250);
       },
       onMouseOut: function() {
          clearTimeout(tab_hover.tid);
       }
    };
    tab_hover.onLoad();
    Alles anzeigen
  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • Boersenfeger
    • 20. Oktober 2022 um 17:03

    Aktualisiere auf FF 106.0.1

    siehe RE: Mozilla veröffentlicht Firefox 106 mit vielen Neuerungen

  • Probleme mit dem Tab-CSS

    • Boersenfeger
    • 20. Oktober 2022 um 16:55

    Vielen Dank! :)

  • Probleme mit dem Tab-CSS

    • Boersenfeger
    • 20. Oktober 2022 um 16:51

    2002Andreas: Ab #3103 bitte in einen neuen Thread verschieben!

    Vielleicht kann sich hier nochmal jemand dran versuchen....

    Mit dem CSS vergrößert sich der gehoverte Tab, das Kontextmenü des UserCSSLoader-Scripts ist nicht zu gebrauchen und die Tabs lassen sich, wenn mehr Tabs als Bildschirmbreite vorhanden sind, nicht mehr alle ansteuern...

  • Mozilla veröffentlicht Firefox 106 mit vielen Neuerungen

    • Boersenfeger
    • 20. Oktober 2022 um 16:47

    Danke, ich nehme grundsätzlich alle UpDates mit... :)

  • Symbole in den Kontextmenüs [ Update ]

    • Boersenfeger
    • 20. Oktober 2022 um 16:40

    Ich lasse es so. Vielen Dank für die Hilfe! :)

  • Mozilla veröffentlicht Firefox 106 mit vielen Neuerungen

    • Boersenfeger
    • 20. Oktober 2022 um 16:20

    Ich erhalte soeben ein UpDate auf 106.0.1... Was wurde da "repariert"?

  • Was hört Ihr gerade?

    • Boersenfeger
    • 19. Oktober 2022 um 23:41

    Zum Tod von Franco Gatti, Ricchi e Poveri

    Sara perche ti amo

  • About Seiten mit CSS Codes anpassen

    • Boersenfeger
    • 19. Oktober 2022 um 18:02

    Hier auch mit Nightly 108

  • Probleme mit dem Tab-CSS

    • Boersenfeger
    • 19. Oktober 2022 um 17:50

    Jo, es gibt da ja auch noch Probleme mit dem Tab-CSS.. Der gehoverte ist jetzt Größer als ungehovert und ein Durchscrollen durch alle Tabs, wenn breiter als der Bildschirm, ist auch nicht mehr möglich...

    CSS
        @-moz-document url(chrome://browser/content/browser.xhtml){
    
        /* Tabs rund und farbig */
    
        /* Angaben für die TAB-Leiste */
    
        /* TAB bei bei angewähltem TAB (aktiv):*/
        /* Hintergrundfarbe, Rahmen,*/
        /* Schriftfarbe. */
     
       .tabbrowser-tab:is([visuallyselected="true"], [multiselected]) > .tab-stack > .tab-background {
        background: red !important;
        border-radius: 18px 18px !important;
        margin-top: 1px !important;  
        border: none !important;
        color: black ! important; 
        margin-bottom: 0 !important;
        }
        }
        
        @-moz-document url(chrome://browser/content/browser.xhtml){
        
        .tabbrowser-tab[visuallyselected="true"] .tab-label {
        font-weight:  bold !important;
        }
    
        #TabsToolbar .tabbrowser-tab:not([selected="true"]) {
        border-radius: 16px 16px !important;
        height: 20px ! important;
        margin-top: 0 !important;
        padding: 0 !important;
        color: black ! important; 
        }
    
        /* Tab-Icon etwas größer,
        * links weniger, unten etwas mehr Abstand zum TAB-Rand */
     
        #TabsToolbar .tab-icon-image {
        height: 20px !important;
        width:  20px !important;
        margin-left: -5px !important;    
        margin-bottom: 2px !important;
        }
            
        /* Tab-Schließen-Button:
        * Rechts weniger Abstand zum TAB-Rand, etwas größer,
        * Textfarbe (Kreuz)
        * Hintergrundfarbe, an den Eckenradius des Buttons angepaßt */
     
        #TabsToolbar .tab-close-button {
        margin-right: -8px !important; 
        font-weight: bold !important;    
        color: black !important; 
        }
    
        #TabsToolbar .tab-close-button .toolbarbutton-icon {
        height: 20px !important;
        width:  20px !important;    
        background-color: red !important;
        border-radius: 12px !important; 
        }
        
        /* Schliessen-Button nur wenn angewählt */
    
        tab:not([selected]) .tab-close-button {display: none !important; 
        }
    
     
        /* Schriftgröße Tabs */
    
        .tab-text {
        font-size: 15px !important;
        }
        
        /* Damit wird der Tabtext am Ende nicht ausgeblendet */
        
        .tab-label-container[textoverflow][labeldirection=ltr]:not([pinned]),
        .tab-label-container[textoverflow]:not([labeldirection]):not([pinned]):-locale-dir(ltr) {
        direction: ltr;
        mask-image: linear-gradient(to left, transparent, black 1em) !important; 
        }
        
        /* Doppelte Schliessung ausblenden */
    
        #TabsToolbar > .titlebar-buttonbox-container {
        display:none !important; 
        }
    
        /* Tabs Proton-Design */
    
        :root {
        --proton-tab-radius: 0 !important;
        --proton-tab-block-margin: 0 !important;
        --inline-tab-padding: 10px !important;
        }
    
        #TabsToolbar .toolbarbutton-1 {
        min-height: 34px !important;    
        margin-top: 2px !important;    
        margin-bottom: 2px !important;
        }
        
        #TabsToolbar .tabbrowser-tab:not([selected="true"])  {
        min-height: 34px !important;
        border: 1px solid #B2B2B2 !important;
        }
    
        #TabsToolbar .toolbarbutton-1 > image {
        padding: 2px 4px !important;
        }
    
        /* Rahmen um die Tableiste durchsichtig */
    
        #TabsToolbar {
        border: 0.2px solid transparent !important;
        }
         
        #TabsToolbar:hover {
        border: 0.2px solid transparent !important;
        }
        
        /* Lautsprechersymbol violet bei Sound */
        
        .tab-icon-overlay[soundplaying] {
        fill: blueviolet !important;
        margin-left: -5px !important;
        }
    
        /* Lautsprechersymbol gelb bei Stumm */
        
        .tab-icon-overlay[muted] {
        fill: yellow !important;
        margin-left: -5px !important;
        }
      
        .tabbrowser-tab .tab-content vbox.tab-label-container.proton label[class="tab-icon-sound-label tab-icon-sound-blocked-label"],
        .tabbrowser-tab .tab-content vbox.tab-label-container.proton label[class="tab-icon-sound-label tab-icon-sound-playing-label"],
        .tabbrowser-tab .tab-content vbox.tab-label-container.proton label[class="tab-icon-sound-label tab-icon-sound-muted-label"] {
        display: none !important;
        }
    
        /* Tab Beschriftung mittig */
        
        .tab-content {
        display: flex !important; 
        margin-top: -4px !important;
        justify-content: center !important;
        align-items: center !important;
        }
        
        #TabsToolbar .tabbrowser-tab[selected="true"] .tab-content {
        margin-top: 2px !important;
        }
    
        .tab-label-container {
        margin: auto !important;
        }
    
        .tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button {
        flex-shrink: 0 !important; 
        padding: 0 !important; 
        width: 16px !important;
        }
    
        /* Tabs in Tableiste mittig */
        
        scrollbox:not(#PlacesToolbarItems) {
        -moz-box-pack: center !important;
        }
        
        /* Lautsprechersymbol größer */
        
        .tab-icon-overlay {
        transform: scale(1.8, 1.8) !important;
        }
        
        image.tab-icon-overlay {
        margin-top: 3px !important;
        }
        
        
        /* Aktiver Tab breiter */
        
        .tabbrowser-tab:not([pinned]):not([selected]) {
        min-width: 200px !important;
        max-width: 200px !important;
        }
        .tabbrowser-tab:not([pinned])[selected] {
        min-width: 256px !important;
        max-width: 256px !important;
        }
        
        /* Kein Schatten drum */
        
        #TabsToolbar:not([brighttext]) #tabbrowser-tabs:not([noshadowfortests]) .tabbrowser-tab:is([visuallyselected="true"],
        [multiselected]) > .tab-stack > .tab-background
        {
        box-shadow: none !important;
        }
        
        /* Kein blauer Kasten */
        
        tab.tabbrowser-tab {
        --focus-outline-width: 0 !important;
        --focus-outline-color: transparent !important;
        --focus-outline: var(--focus-outline-width) solid var(--focus-outline-color)!important;
        }
        }
    Alles anzeigen

    Ich probiere mal alle aus... muss aber gleich wieder zur Nachtschicht...


    .. Und es liegt genau an diesem o.a. Tabs-CSS... die Frage bleibt dann für Morgen, wo muss da geschraubt werden? ;)

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

    • Boersenfeger
    • 19. Oktober 2022 um 17:38

    Das Symbol wird mittlerweile richtig angezeigt, habe die Background-Position etwas geändert.

    Zitat

    Allerdings kann man, wie im 2. Bild zu sehen, das Kontext-Menü nicht bis ganz nach oben Scrollen, um dann die Schaltfläche User-Styles laden zu erreichen und auszulösen.

    Dies ist allerdings nach wie vor existent :(

  • Symbole in den Kontextmenüs [ Update ]

    • Boersenfeger
    • 19. Oktober 2022 um 13:33
    Zitat von 2002Andreas

    Und ändere mal den 2ten Wert in Zeile 11.

    PS: da passen aber einige Abstände nicht bei dir :/

    Dann geht nur das Icon runter nicht aber der Eintrag und ja, auch die anderen Einträge haben nicht mehr den korrekten Abstand... :huh:

    Angehängt der ganze Code, weil zu groß fürs Forum (ohne Änderung in Zeile 6047)

    Bin erst mal unterwegs...

    Dateien

    Kontextmenu Rechtsklick.zip 173,75 kB – 311 Downloads
  • userChrome.js Scripte für den Fuchs (Diskussion)

    • Boersenfeger
    • 19. Oktober 2022 um 12:27

    Mit Nightly 108 ergeben sich hier einige Probleme, die der Abhilfe bedürfen ;)

    Im 1. Bild sieht man, das das Loader-Icon nur zur Hälfte zu sehen ist, der Button funktioniert. Allerdings kann man, wie im 2. Bild zu sehen, das Kontext-Menü nicht bis ganz nach oben Scrollen, um dann die Schaltfläche User-Styles laden zu erreichen und auszulösen. Hier der Script-Code:

    JavaScript
    // ==UserScript==
    // @name UserCSSLoader
    // @description CSS Codes - Styles laden und verwalten
    // @namespace https://d.hatena.ne.jp/Griever/
    // @author Griever
    // @include main
    // @license MIT License
    // @compatibility Firefox 4 - 102*
    // @charset UTF-8
    // @version 0.0.4k
    // @note Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile()
    // @note AUTHOR_SHEET Verwendung hinzugefügt, wichtig: am Ende des Dateinamens .author.css
    // @note Version 0.0.4.g ermoeglicht "Styles importieren" per Mittelklick und Verwendung
    // @note eines anderen Dateimanager (s. vFileManager in Zeile 53)
    // @note Frei verschiebbare Schaltfläche eingebaut von aborix
    // @note 0.0.4 Remove E4X
    // @note CSSEntry-Klasse erstellt
    // @note Style-Test-Funktion überarbeitet
    // @note Wenn die Datei gelöscht wurde, CSS beim Neu erstellen und Löschen des Menüs abbrechen
    // @note uc einlesen .uc.css temporäre Korrespondenz zum erneuten Lesen
    // ==/UserScript==
    
    /****** Bedienungsanleitung ******
    
    Da der CSS-Ordner im Chrome-Ordner erstellt wurde, CSS-Dateien dort ablegen - speichern.
    Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css" enden, sind AGENT_SHEET,
    andere außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird,
    darauf achten, @ Namespace Angabe nicht zu vergessen!
    
    CSS-Menü wird zur Menüleiste hinzugefügt
    Linksklick auf Stil, zum aktivieren/deaktivieren
    Mittelklick auf Stil zum aktivieren/deaktivieren, ohne Menü zu schließen
    Rechtsklick auf Stil zum Öffnen im Editor
    
    Verwenden des in "view_source.editor.path" angegebenen Editors
    Ordner kann geändert werden, indem ein Pfad in "UserCSSLoader.FOLDER" eingefügt wird
    
    **** Anleitung Ende ****/
    
    (function(){
    
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    if (!window.Services)
    Cu.import("resource://gre/modules/Services.jsm");
    // Wenn beim Start ein anderes Fenster angezeigt wird (das zweite Fenster), wird es beendet
    let list = Services.wm.getEnumerator("navigator:browser");
    while(list.hasMoreElements()){ if(list.getNext() != window) return; }
    
    if (window.UCL) {
    window.UCL.destroy();
    delete window.UCL;
    }
    
    window.UCL = {
    vFileManager: 'H:\\Total Commander\\TOTALCMD64.EXE',
    vFMParameter: '/T',
    USE_UC: "UC" in window,
    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 = 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("CSS");
    }
    if (!aFolder.exists() || !aFolder.isDirectory()) {
    aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
    }
    delete this.FOLDER;
    return this.FOLDER = aFolder;
    },
    getFocusedWindow: function() {
    let win = document.commandDispatcher.focusedWindow;
    if (!win || win == window) win = content;
    return win;
    },
    
    init: function() {
    const cssmenu = $C("menu", {
    id: "usercssloader-menu",
    label: "CSS",
    accesskey: "C",
    onclick: "if (event.button == 1) UCL.rebuild()"
    });
    const menupopup = $C("menupopup", {
    id: "usercssloader-menupopup"
    });
    cssmenu.appendChild(menupopup);
    
    let menu = $C("menu", {
    label: "Style Loader Menü",
    accesskey: "M"
    });
    menupopup.appendChild(menu);
    let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
    menu.appendChild(mp);
    mp.appendChild($C("menuitem", {
    label: "Styles importieren",
    accesskey: "R",
    acceltext: "Alt + R",
    oncommand: "UCL.rebuild();"
    }));
    mp.appendChild($C("menuseparator"));
    mp.appendChild($C("menuitem", {
    label: "CSS Datei erstellen",
    accesskey: "D",
    oncommand: "UCL.create();"
    }));
    mp.appendChild($C("menuitem", {
    label: "CSS Ordner öffnen",
    accesskey: "O",
    oncommand: "UCL.openFolder();"
    }));
    mp.appendChild($C("menuitem", {
    label: "userChrome.css bearbeiten",
    hidden: false,
    oncommand: "UCL.editUserCSS(\'userChrome.css\');"
    }));
    mp.appendChild($C("menuitem", {
    label: "userContent.css bearbeiten",
    hidden: false,
    oncommand: "UCL.editUserCSS(\'userContent.css\');"
    }));
    mp.appendChild($C("menuseparator"));
    mp.appendChild($C("menuitem", {
    label: "Style Test (Chrome)",
    id: "usercssloader-test-chrome",
    hidden: true,
    accesskey: "C",
    oncommand: "UCL.styleTest(window);"
    }));
    mp.appendChild($C("menuitem", {
    label: "Style Test (Web)",
    id: "usercssloader-test-content",
    hidden: true,
    accesskey: "W",
    oncommand: "UCL.styleTest();"
    }));
    mp.appendChild($C("menuitem", {
    label: "Styles dieser Seite auf userstyles.org finden",
    accesskey: "S",
    oncommand: "UCL.searchStyle();"
    }));
    
    menu = $C("menu", {
    label: ".uc.css",
    accesskey: "U",
    hidden: !UCL.USE_UC
    });
    menupopup.appendChild(menu);
    mp = $C("menupopup", { id: "usercssloader-ucmenupopup" });
    menu.appendChild(mp);
    mp.appendChild($C("menuitem", {
    label: "Importieren(.uc.js)",
    oncommand: "UCL.UCrebuild();"
    }));
    mp.appendChild($C("menuseparator", { id: "usercssloader-ucseparator" }));
    
    CustomizableUI.createWidget({
    id: 'usercssloader-menu-item',
    type: 'custom',
    defaultArea: CustomizableUI.AREA_NAVBAR,
    onBuild: function(aDocument) {
    let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbaritem');
    toolbaritem.id = 'usercssloader-menu-item';
    toolbaritem.className = 'chromeclass-toolbar-additional';
    return toolbaritem;
    }
    });
    $('usercssloader-menu-item').appendChild(cssmenu);
    
    //let refNode = $('helpMenu');
    //refNode.parentNode.insertBefore(cssmenu, refNode.nextSibling);
    
    $("mainKeyset").appendChild($C("key", {
    id: "usercssloader-rebuild-key",
    oncommand: "UCL.rebuild();",
    key: "R",
    modifiers: "alt",
    }));
    this.rebuild();
    this.initialized = true;
    if (UCL.USE_UC) {
    setTimeout(function() {
    UCL.UCcreateMenuitem();
    }, 1000);
    }
    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", 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 = "Style importiert";
    else
    XULBrowserWindow.statusTextField.label = "Styles importieren";
    }
    },
    loadCSS: function(aFile) {
    var 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) {
    var CSS = this.readCSS[aLeafName];
    var 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",
    oncommand    : "UCL.toggle('"+ aLeafName +"');",
    onclick        : "UCL.itemClick(event);"
    });
    document.getElementById("usercssloader-menupopup").appendChild(menuitem);
    }
    menuitem.setAttribute("checked", CSS.enabled);
    },
    toggle: function(aLeafName) {
    var CSS = this.readCSS[aLeafName];
    if (!CSS) return;
    CSS.enabled = !CSS.enabled;
    this.rebuildMenu(aLeafName);
    },
    itemClick: function(event) {
    if (event.button == 0) return;
    event.preventDefault();
    event.stopPropagation();
    let label = event.currentTarget.getAttribute("label");
    if (event.button == 1) {
    this.toggle(label);
    }
    else if (event.button == 2) {
    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;
    },
    styleTest: function(aWindow) {
    aWindow || (aWindow = this.getFocusedWindow());
    new CSSTester(aWindow, function(tester){
    if (tester.saved)
    UCL.rebuild();
    });
    },
    searchStyle: function() {
    let word;
    try {
    word = gBrowser.currentURI.host;
    } catch {
    word = gBrowser.currentURI.spec;
    }
    openWebLinkIn("https://userstyles.org/styles/search/" + word, "tab", {});
    },
    openFolder:function(){
    if (this.vFileManager.length != 0) {
    var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
    var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    var args=[this.FOLDER.path];
    file.initWithPath(this.vFileManager);
    process.init(file);
    // Verzeichnis mit anderem Dateimanager öffnen
    process.run(false, args, args.length);
    } else {
    // Verzeichnis mit Dateimanager des Systems öffnen
    this.FOLDER.launch();
    }
    },
    editUserCSS: function(aLeafName) {
    let file = Services.dirsvc.get("UChrm", Ci.nsIFile);
    file.appendRelativePath(aLeafName);
    this.edit(file);
    },
    edit: function(aFile) {
    var editor = Services.prefs.getCharPref("view_source.editor.path");
    if (!editor) return alert("Unter about:config den vorhandenen Schalter:\n view_source.editor.path mit dem Editorpfad ergänzen");
    try {
    var UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
    var path = UI.ConvertFromUnicode(aFile.path);
    var app = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
    app.initWithPath(editor);
    var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.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",
    oncommand    : "this.setAttribute('checked', !(this.css.disabled = !this.css.disabled));",
    onclick        : "UCL.UCItemClick(event);"
    });            
    m.css = css;
    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(Components.interfaces.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:
    Ci.nsIStyleSheetService.USER_SHEET;
    }
    CSSEntry.prototype = {
    sss: Components.classes["@mozilla.org/content/style-sheet-service;1"]
    .getService(Components.interfaces.nsIStyleSheetService),
    _enabled: false,
    get enabled() {
    return this._enabled;
    },
    set enabled(isEnable) {
    var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile)
    aFile.initWithPath(this.path);
    
    var isExists = aFile.exists(); // Wenn die Datei existiert true
    var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
    var isForced = this.lastModifiedTime != lastModifiedTime; // Wenn es eine Änderung in der Datei gibt true
    
    var fileURL = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile);
    var 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;
    },
    };
    
    function CSSTester(aWindow, aCallback) {
    this.win = aWindow || window;
    this.doc = this.win.document;
    this.callback = aCallback;
    this.init();
    }
    CSSTester.prototype = {
    sss: Components.classes["@mozilla.org/content/style-sheet-service;1"]
    .getService(Components.interfaces.nsIStyleSheetService),
    preview_code: "",
    saved: false,
    init: function() {
    this.dialog = openDialog(
    "data:text/html;charset=utf8,"+encodeURIComponent('<!DOCTYPE HTML><html lang="de"><head><title>CSSTester</title></head><body></body></html>'),
    "",
    "width=550,height=400,dialog=no");
    this.dialog.addEventListener("load", this, false);
    },
    destroy: function() {
    this.preview_end();
    this.dialog.removeEventListener("unload", this, false);
    this.previewButton.removeEventListener("click", this, false);
    this.saveButton.removeEventListener("click", this, false);
    this.closeButton.removeEventListener("click", this, false);
    },
    handleEvent: function(event) {
    switch(event.type) {
    case "click":
    if (event.button != 0) return;
    if (this.previewButton == event.currentTarget) {
    this.preview();
    }
    else if (this.saveButton == event.currentTarget) {
    this.save();
    }
    else if (this.closeButton == event.currentTarget) {
    this.dialog.close();
    }
    break;
    case "load":
    var doc = this.dialog.document;
    doc.body.innerHTML = '\
    <style type="text/css">\
    :not(input):not(select) { padding: 0px; margin: 0px; }\
    table { border-spacing: 0px; }\
    body, html, #main, #textarea { width: 100%; height: 100%; }\
    #textarea { font-family: monospace; }\
    </style>\
    <table id="main">\
    <tr height="100%">\
    <td colspan="4"><textarea id="textarea"></textarea></td>\
    </tr>\
    <tr height="40">\
    <td><input type="button" value="Vorschau" id="Vorschau"/></td>\
    <td><input type="button" value="Speichern" id="Speichern"/></td>\
    <td width="80%"><span class="log"></span></td>\
    <td><input type="button" value="Schließen" id="Schliessen"/></td>\
    </tr>\
    </table>\
    ';
    this.textbox = doc.querySelector("textarea");
    this.previewButton = doc.querySelector('input[value="Vorschau"]');
    this.saveButton = doc.querySelector('input[value="Speichern"]');
    this.closeButton = doc.querySelector('input[value="Schließen"]');
    this.logField = doc.querySelector('.log');
    
    var code = "@namespace url(" + this.doc.documentElement.namespaceURI + ");\n";
    code += this.win.location.protocol.indexOf("http") === 0?
    "@-moz-document domain(" + this.win.location.host + ") {\n\n\n\n}":
    "@-moz-document url(" + this.win.location.href + ") {\n\n\n\n}";
    this.textbox.value = code;
    this.dialog.addEventListener("unload", this, false);
    this.previewButton.addEventListener("click", this, false);
    this.saveButton.addEventListener("click", this, false);
    this.closeButton.addEventListener("click", this, false);
    
    this.textbox.focus();
    let p = this.textbox.value.length - 3;
    this.textbox.setSelectionRange(p, p);
    
    break;
    case "unload":
    this.destroy();
    this.callback(this);
    break;
    }
    },
    preview: function() {
    var code = this.textbox.value;
    if (!code || !/\:/.test(code))
    return;
    code = "data:text/css;charset=utf-8," + encodeURIComponent(this.textbox.value);
    if (code == this.preview_code)
    return;
    this.preview_end();
    var uri = Services.io.newURI(code, null, null);
    this.sss.loadAndRegisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET);
    this.preview_code = code;
    this.log("Preview");
    },
    preview_end: function() {
    if (this.preview_code) {
    let uri = Services.io.newURI(this.preview_code, null, null);
    this.sss.unregisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET);
    this.preview_code = "";
    }
    },
    save: function() {
    var data = this.textbox.value;
    if (!data) return;
    
    var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
    fp.init(window, "", Ci.nsIFilePicker.modeSave);
    fp.appendFilter("CSS Files","*.css");
    fp.defaultExtension = "css";
    if (window.UCL)
    fp.displayDirectory = UCL.FOLDER;
    var res = fp.show();
    if (res != fp.returnOK && res != fp.returnReplace) return;
    
    var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
    suConverter.charset = "UTF-8";
    data = suConverter.ConvertFromUnicode(data);
    var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
    foStream.init(fp.file, 0x02 | 0x08 | 0x20, 0664, 0);
    foStream.write(data, data.length);
    foStream.close();
    this.saved = true;
    },
    log: function() {
    this.logField.textContent = dateFormat(new Date(), "%H:%M:%S") + ": " + $A(arguments);
    }
    };
    
    UCL.init();
    
    function $(id) { return document.getElementById(id); }
    function $A(arr) { return Array.slice(arr); }
    function $C(name, attr) {
    var 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.getDay()).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() { Application.console.log(Array.slice(arguments)); }
    
    })();
    Alles anzeigen

    und hier noch ein CSS dazu:

    CSS
        /* UserStyles Loader Button */
        
        #usercssloader-menu {
        margin-right: 0 !important; 
        margin-left: 0 !important;
        content: '' !important;
        display: block !important;
        width: 14px !important;
        height: 20px !important;
        background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAABRUlEQVQ4jaXSLW/CUBTG8YdMTmxijiY1M62A8w2omZ1jlhA0mC6ZJTiSKewsDgesohgICWLjQ0DCkvJOPeGZGG3Xji50O8kvueeKv7kX+JorAFkAuRh3AATADYALnJjsfD5nHMuySJKFQuHxGElFA7nFYsE4XoAkdV1/AHAdjeRWqxXjtNttfp9MJnMP4DIUWK/XjDMYDBgdALehwHa7ZZzpdMrhcMhut0vbtmnbNgEYocBut2MSx9cJAq7rMokgYI6ZMt/+BOaYgDnmy7vr8+ac3Q80RhuWOw5JstxxfL/tjdEmCNT7SxZbM5JksTULid55e72/DALVnsN8c0KSzDcnP0TvSbLac4LA0+uHz5vo+dTuB/7F+wf7/Z5J+P9ARAxFUSqHw4FJKIpSEREDImJomlZSVbWWTqefz6Gqak3TtJKIGJ86u+Qm3Nb2fAAAAABJRU5ErkJggg==") !important;
        background-repeat: no-repeat !important;
        background-position: 5px 6px !important;
        background-size: 15px 15px !important;
        }
        
        #usercssloader-menu > .menu-text,
        #usercssloader-menu > .menu-right {
        display: none !important;
        }   
        
        #usercssloader-menu:hover {
        margin-right: 0 !important; 
        margin-left: 0 !important;
        content: '' !important;
        display: block !important;
        width: 14px !important;
        height: 20px !important;
        background: lightgrey !important;
        background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAABRUlEQVQ4jaXSLW/CUBTG8YdMTmxijiY1M62A8w2omZ1jlhA0mC6ZJTiSKewsDgesohgICWLjQ0DCkvJOPeGZGG3Xji50O8kvueeKv7kX+JorAFkAuRh3AATADYALnJjsfD5nHMuySJKFQuHxGElFA7nFYsE4XoAkdV1/AHAdjeRWqxXjtNttfp9MJnMP4DIUWK/XjDMYDBgdALehwHa7ZZzpdMrhcMhut0vbtmnbNgEYocBut2MSx9cJAq7rMokgYI6ZMt/+BOaYgDnmy7vr8+ac3Q80RhuWOw5JstxxfL/tjdEmCNT7SxZbM5JksTULid55e72/DALVnsN8c0KSzDcnP0TvSbLac4LA0+uHz5vo+dTuB/7F+wf7/Z5J+P9ARAxFUSqHw4FJKIpSEREDImJomlZSVbWWTqefz6Gqak3TtJKIGJ86u+Qm3Nb2fAAAAABJRU5ErkJggg==") !important;
        background-repeat: no-repeat !important;
        background-position: 5px 6px !important;
        background-size: 15px 15px !important;
        }
        
        #usercssloader-menu > .menu-text,
        #usercssloader-menu > .menu-right {
        display: none !important;
        }
    Alles anzeigen
  • Symbole in den Kontextmenüs [ Update ]

    • Boersenfeger
    • 19. Oktober 2022 um 12:18

    2002Andreas: Danke! :)

    Mit diesem Code

    CSS
    #context-paste-no-formatting::before {
        margin-right: 3px !important;
        margin-left: 2px !important;
        margin-top: 10px !important;
        content: '' !important;
        display: block !important;
        width: 19px !important;
        height: 15px !important;
        background: url("..//icons/Text.png") !important;
        background-repeat: no-repeat !important;
        background-position: 0px 0px !important;
        background-size: 15px 15px !important;
        }
    Alles anzeigen

    sieht es jetzt so aus:

    Den richtigen Abstand kriege ich nicht hin. Der Wert bei margin-top bringt offenbar nix.. :(

Unterstütze uns!

Jährlich (2026)

76,1 %

76,1% (589,79 von 775 EUR)

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