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

Beiträge von Mitleser

  • Eigene Zusatzleisten ab ff 143+

    • Mitleser
    • 6. Oktober 2025 um 16:52
    Zitat von Horstmann

    Wobei die Leiste in diesem Fall fixiert ist, nicht ausklappt bei hover, und nicht schwebt

    2002AndreasHallo!

    Könntest du evtl. abtrennen ab Beitrag 17? Wäre auch im meinem Interesse (Beitrag 9 folgende). Dies ist ein anderes Thema und hat mit 'Seitennavigation - Fly Out Menü' nichts zu tun. Das Originalthema würde bei der zu erwartenden Anzahl von Beiträgen völlig 'untergehen'.
    Thema könnte sein: 'Seitennavigation - Neue vert. Zusatzleiste ab ff 143+'
    aber das könnte Horstmann später noch ändern.

  • UserCSSLoader (2025)

    • Mitleser
    • 5. Oktober 2025 um 12:53

    Speravir , und/oder @Linux-Nutzer.
    Läuft das ( https://github.com/Endor8/userChr…cssloader.uc.js ) auch auf Linux? Sehe trotz einer userChrome keinen Button, ein Menüeintrag (als Alternative Configuration) wird auch nicht angezeigt.
    Zeile 80 mit/ohne Eintrag let fileManager = "/usr/bin/nemo";getestet.
    Zeile 95 let cssFolder = "css_test" Ordner ist vorhanden.:/

    EDIT: Auch In einem neuen Profil funktioniert es nicht.
    EDIT: Die neue userChrome (aus Zeile 47-64) kann als Fehlerquelle ausgeschlossen werden (funktioniert mit dem Script aus Beitrag 138).
    EDIT:

    EDIT: Die Datei wird als einzige JS-Datei (von nur 4 insgesamt) nicht im Debugger gefunden (Browserwerkzeuge>Debugger>Quellen>file:// > > ). In der Konsole schon. Zugriffsrechte richtig gesetzt. Namenskonvention eingehalten. Gebe auf!;(

    (Info/Vergleich: Das Script aus Beitrag 138 funktioniert.)

  • UserCSSLoader (2025)

    • Mitleser
    • 4. Oktober 2025 um 23:22

    Vielen Dank an alle Mitwirkenden, ich werde die neue Version von hier:

    Update usercssloader.uc.js · Endor8/userChrome.js@9642390
    Aktualisierung von Speravir - camp-firefox.de
    github.com

    am Sonntag mal installieren und ausprobieren! Bisher nutze ich diese Version, die auch in der aktuellen Nightly gut funktioniert:

    Spoiler anzeigen

    Icons auf Nachfrage

    JavaScript
    // ==UserScript==
    // @name           UserCSSLoader
    // @description    CSS Codes - Styles laden und verwalten
    // https://github.com/Endor8/userChrome.js/tree/master/usercssloader
    // @namespace      http://d.hatena.ne.jp/Griever/
    // @author         Griever
    // @include        main
    // @license        MIT License
    // @compatibility  Firefox 4 - 102*
    // @charset        UTF-8
    // @version        0.0.4L+
    // @note           https://www.camp-firefox.de/forum/thema/136726-usercssloader-services-jsm-entfernt-css-codes-werden-nicht-geladen/
    // @note           Fit für 136 :
    // @note           BrokenHearts Änderung: https://www.camp-firefox.de/forum/thema/138792/?postID=1263814#post1263814
    // @note           Fit für 117
    // @note           Aktualisierung von Speravir - www.camp-firefox.de
    // @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 (siehe in Konfiguration)
    // @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 ******
    
    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 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;
    Dateiordner kann in Konfiguration geändert werden
    
     **** Anleitung Ende ****/
    
    (function(){
    
    /* Konfiguration */
    // alternativer Dateimanager, Bsp.:
    // let filemanager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE";
    let filemanager = "/usr/bin/nemo";
    // Unterordner für die CSS-Dateien:
    let cssFolder = "css_test";
    /* Ende Konfiguration */
    
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    // 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; }
    
    const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    
    if (window.UCL) {
        window.UCL.destroy();
        delete window.UCL;
    }
    
    window.UCL = {
        vFileManager: filemanager,
        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(cssFolder);
            }
            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() {
            let cssmenu = $C("menu", {
                id: "usercssloader-menu",
                label: 'CSSLoader - Menü',
                tooltiptext: "CSSLoader - Menü\n\nLinksklick: Menü - Testdateien anzeigen\nMittelklick: Testdateien importieren",
                accesskey: "C",
                onclick: "if (event.button == 1) UCL.rebuild()"
            });
            let menupopup = $C("menupopup", {
                id: "usercssloader-menupopup"
            });
            cssmenu.appendChild(menupopup);
            let menu = $C("menu", {
                label: "Datei bearbeiten",
                accesskey: "M",
    			id: "style-loader-menu"
            });
            menupopup.appendChild(menu);
            menupopup.appendChild($C("menuseparator"));
            let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
            menu.appendChild(mp);
            mp.appendChild($C("menuitem", {
                label: "Testdatei(en) laden",
                accesskey: "R",
                acceltext: "Alt + R",
                oncommand: "UCL.rebuild();"
            }));
            mp.appendChild($C("menuseparator"));
            mp.appendChild($C("menuitem", {
                label: "Neue Testdatei im Ordner 'css_test' erstellen",
                accesskey: "D",
                oncommand: "UCL.create();"
            }));
            mp.appendChild($C("menuitem", {
                label: "Ordner 'css_test' ö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: "Datei-Test (Chrome)",
                id: "usercssloader-test-chrome",
                hidden: true,
                accesskey: "C",
                oncommand: "UCL.styleTest(window);"
            }));
            mp.appendChild($C("menuitem", {
                label: "Datei-Test (Content)",
                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(XULNS, 'toolbaritem');
                    toolbaritem.id = 'usercssloader-menu-item';
                    toolbaritem.className = 'chromeclass-toolbar-additional';
                    return toolbaritem;
                }
            });
            $('usercssloader-menu-item').appendChild(cssmenu);
    
            /* Um Statt Menü eine frei verschiebbare Schaltfläche zu haben */
            /* Untenstehende zwei Zeilen deaktivieren einfach // davor machen */
    //        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:
            /\.author\.css$/i.test(this.leafName)?
            Ci.nsIStyleSheetService.AUTHOR_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(); // true, wenn die Datei existiert
            var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
            var isForced = this.lastModifiedTime != lastModifiedTime; // true, wenn es eine Änderung in der Datei gibt
            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"||"https") === 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); }
    // wg.136 geändert
    //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 $C(name, attr) {
        var el = document.createXULElement(name);
        if (attr) Object.keys(attr).forEach(function(n) {
    
            if(n == "oncommand") {
    			el.addEventListener('command', function(event) { Function(attr[n])(); });
    		}
    		else if(n == "onclick") {
    			el.addEventListener('click', function(event) { Function(attr[n])(); });
    		}
    		else if(n == "onmouseup") {
    			el.addEventListener('mouseup', function(event) { Function(attr[n])(); });
    		}
    		else {
    			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
    CSS
    /*button_userCSSLoader.css*/
    /*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
    #nav-bar #usercssloader-menu,
    #nav-bar #usercssloader-menu-item {
    	appearance: none !important;
    	overflow: hidden !important;
    	background-image: url("../icons/16_options_orange.svg")!important;
    	background-repeat: no-repeat !important;
    	background-position: center center !important;
    background-size: 16px 17px !important;
    	width: 28px !important;
    	min-width: 28px !important;
    	max-width: 28px !important;
    	margin-top: -1px !important;
    }
    #nav-bar #usercssloader-menu:hover,
    #nav-bar #usercssloader-menu-item:hover {
    	appearance: none !important;
    	overflow: hidden !important;
    	background-image: url("../icons/16_options_whitegray.svg")!important;
    	background-color: var(--button-hover-bgcolor) !important;
    }
    /*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
    #widget-overflow #usercssloader-menu {
    	background-image: url("../icons/16_options_orange.svg")!important;
    	appearance: none !important;
    	overflow: hidden !important;
    	background-repeat: no-repeat !important;
    	background-position: 0px center !important;
    	background-size: 18px 18px !important;
    	opacity: 1.0 !important;
    	justify-content: center !important;
    	width: 28px !important;
    	min-width: 28px !important;
    	max-width: 28px !important;
    	height: var(--uc-tabs-height) !important;
    	min-height: var(--uc-tabs-height) !important;
    	max-height: var(--uc-tabs-height) !important;
    	margin: 0 !important;
    	margin-top: 0px !important;
    	padding: 0 !important;
    	--toolbarbutton-border-radius: 0px !important;
    	border-radius: 0px !important;
    }
    #widget-overflow #usercssloader-menu:hover {
    	background-image: url("../icons/16_options_whitegray.svg")!important;
    	background-color: var(--button-hover-bgcolor) !important;
    	appearance: none !important;
    	overflow: hidden !important;
    	background-repeat: no-repeat !important;
    	background-position: 0px center !important;
    	background-size: 18px 18px !important;
    	opacity: 1.0 !important;
    	justify-content: center !important;
    	width: 28px !important;
    	min-width: 28px !important;
    	max-width: 28px !important;
    	height: var(--uc-tabs-height) !important;
    	min-height: var(--uc-tabs-height) !important;
    	max-height: var(--uc-tabs-height) !important;
    	margin: 0 !important;
    	margin-top: 0px !important;
    	padding: 0 !important;
    	--toolbarbutton-border-radius: 0px !important;
    	border-radius: 0px !important;
    }
    #usercssloader-menu > .menu-text {
    	display: none !important;
    }
    /*----------------------------------*/
    #usercssloader-submenupopup {
    	margin-top: -1px !important;
    }
    /*---------Style-Loader-Menü-------------------------*/
    #style-loader-menu::before {
    	content: '' !important;
    	display: block !important;
    	width: 16px !important;
    	height: 16px !important;
    	margin-left: 0px !important;
    	margin-right: -16px !important;
    	background-image: url("../icons/16gear-2_whitegray.svg") !important;
    	background-repeat: no-repeat !important;
    	background-size: 16px 16px !important;
    	background-position: center center !important;
    }
    #style-loader-menu:hover::before {
    	background-image: url("../icons/16gear-2_whitegray.svg") !important;
    }
    /*------------------------------------------*/
    #usercssloader-menupopup > menuitem[type="checkbox"] > .menu-iconic-left,
    #usercssloader-menupopup > menuitem[type="checkbox"][checked="true"] > .menu-iconic-left {
    	display: none !important;
    }
    /*------------------------------------------
    #usercssloader-menupopup > menuitem[type="checkbox"][checked="true"]::before{
    	content: '' !important;
    	display: block !important;
    	width: 16px !important;
    	height: 16px !important;
    	margin-left: 0px !important;
    	margin-right: 4px !important;
    	background-image: url("../icons/16_checkmark-checked_neongreen.svg") !important;
    	background-repeat: no-repeat !important;
    	background-size: 16px 16px !important;
    	background-position: center center !important;
    }
    #usercssloader-menupopup > menuitem[type="checkbox"][checked="true"]:hover::before{
    	background-image: url("../icons/16_checkmark-unchecked_white.svg") !important;
    }
    #usercssloader-menupopup > menuitem[type="checkbox"]::before{
    	content: '' !important;
    	display: block !important;
    	width: 16px !important;
    	height: 16px !important;
    	margin-left: 0px !important;
    	margin-right: 4px !important;
    	background-image: url("../icons/16_checkmark-unchecked_redorange.svg") !important;
    	background-repeat: no-repeat !important;
    	background-size: 16px 16px !important;
    	background-position: center center !important;
    }
    #usercssloader-menupopup > menuitem[type="checkbox"]:hover::before{
    	background-image: url("../icons/16_checkmark-checked_white.svg") !important;
    }
    */
    Alles anzeigen
  • Aufruf extra confing menu.uc.js

    • Mitleser
    • 3. Oktober 2025 um 17:58
    Zitat von 2002Andreas

    Sieht hier so aus:

    Und hier so:

  • "visibility: hidden" ohne Funktion

    • Mitleser
    • 2. Oktober 2025 um 13:44

    Da .bookmark-item[label$=".txt"] :is(img, image) betriebssystemunabhängig funktioniert (war ja eigentlich klar), ist es wohl so.
    Das ist doch mal eine schöne Antwort auf diese 'Frage':

    Zitat von .DeJaVu

    Aber wann nun content, list-style-image oder --bookmark-item-icon, das ist mir noch zu speziell, vor allem, weil es erst mal grundsätzlich mit anderen Ordnersymbolen funktioniert. Es dürften wohl die Ausnahmen für spezielle Ordner sein.

    Jetzt fehlt nur noch die Bibliothek sowie die Lesezeichenseitenleiste in Bezug auf 'Lesezeichen mit definiertem Text und eigenem Icon'.

  • "visibility: hidden" ohne Funktion

    • Mitleser
    • 2. Oktober 2025 um 11:04

    2002Andreas , in der Praxis ziehe ich oft Links von der Leiste ins Dropdown und wieder zurück, einfach weil ich das Lesezeichen für einen bestimmten Zeitraum häufiger/seltener benötige. Auf Linux behält das Lesezeichen mit definiertem Text nur sein Icon mit .bookmark-item[label$=".txt"] :is(img, image), jedoch nicht mit .bookmark-item[label$=".txt"] > img. Wie sich das in Windows verhält kann ich leider nicht testen.

  • "visibility: hidden" ohne Funktion

    • Mitleser
    • 2. Oktober 2025 um 10:15

    Das findet dann aber im Dropdown statt? Was passiert, wenn du das Lesezeichen mal in die Leiste ziehst? Und benötigst du die background-attribute wirklich?

  • "visibility: hidden" ohne Funktion

    • Mitleser
    • 1. Oktober 2025 um 23:57

    harff182 , dieses funzt mit relativem Pfad (Anstatt des kompletten Codes aus Beitrag #1):

    CSS
    /*Lesezeichen mit einem definierten Text in der Lesezeichenleiste sowie im Dropdown der Lesezeichenleiste (Änderung in 143)*/
    .bookmark-item[label$=".txt"] :is(img, image) {
    	content: url('../icons/text.png') !important;
    }
  • Andere Tabs schließen?

    • Mitleser
    • 30. September 2025 um 22:46

    Ja, aber dann ist der Eintrag #context_closeTabOptions wieder vorhanden (auch bei dem Script aus #15). Dieser müsste dann per css ausgeblendet werden. Das funzt, aber eine JS-Lsg. wäre vorzuziehen.

    CSS
    #tabContextMenu #context_closeTabOptions{ display:none !important; }

    Der Fehler liegt in Zeile 10; ich habe das auch schon lt. MDN versucht, geht auch nicht:

    JavaScript
      const node = document.getElementById("context_closeTabOptions");
    if (node.parentNode) {
      node.parentNode.removeChild(node);
    }

    Dazu müsste man dann vielleicht einen Fachmann einbeziehen. Die unsaubere Lsg. wäre dann das (würde der Absicht de TE am nächsten kommen):

    JavaScript
    (function() {
      if (!window.gBrowser)
    	return;
    
      let menuitem = document.createXULElement('menuitem');
      menuitem.id = 'context_closeLeftTabs';
      menuitem.setAttribute('label', 'Linke Tabs schließen');
      let tabContextMenu = document.getElementById('tabContextMenu');
      let refItem = document.getElementById('context_closeTab');
      tabContextMenu.insertBefore(document.getElementById('context_closeTabsToTheStart'), refItem);
      tabContextMenu.insertBefore(document.getElementById('context_closeTabsToTheEnd'), refItem);
      tabContextMenu.insertBefore(document.getElementById('context_closeOtherTabs'), refItem);
    //click
    menuitem.addEventListener('click', () => {
    	if (event.button == 0) {
           	 for (let i = TabContextMenu.contextTab._tPos - 1; i >= 0; i--)gBrowser.removeTab(gBrowser.tabs[i], {animate: true});
                }
    });
    /**/
        var css =`
    		#context_closeTabOptions{ display:none !important; }
    `;
        var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
        var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css));
    sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
    
    })();
    Alles anzeigen
  • Andere Tabs schließen?

    • Mitleser
    • 30. September 2025 um 21:40

    Ist ja merkwürdig. Ich habe den Eintrag 'Tab stummschalten' mal eingeblendet und habe mit dem Script aus #15 diesen Fehler nicht.

  • Andere Tabs schließen?

    • Mitleser
    • 30. September 2025 um 20:35

    Dann ist es wohl ein anderes Problem. So sieht es bei mir mit dem Script aus #15 aus:

    Die 'Leerzeile' ist auch im Screen von Beitrag #11. Die ID der 'Leerzeile' wäre interessant.

  • Andere Tabs schließen?

    • Mitleser
    • 30. September 2025 um 20:18

    Da fehlt eine ja auch eine Zeile:
      tabContextMenu.insertBefore(document.getElementById('context_closeTabsToTheStart'), refItem);

    z.B.: Zwischen Zeile 7 und 8...Die Reihenfolge bestimmt die Position...

    Bei mir ist das Zeile 11:

    JavaScript
    (function() {
      if (!window.gBrowser)
    	return;
    
      let menuitem = document.createXULElement('menuitem');
      menuitem.id = 'context_closeLeftTabs';
      menuitem.setAttribute('label', 'Linke Tabs schließen');
      let tabContextMenu = document.getElementById('tabContextMenu');
      let refItem = document.getElementById('context_closeTab');
    
      tabContextMenu.insertBefore(document.getElementById('context_closeTabsToTheStart'), refItem);
       tabContextMenu.insertBefore(document.getElementById('context_closeTabsToTheEnd'), refItem);
      tabContextMenu.insertBefore(document.getElementById('context_closeOtherTabs'), refItem);
      //tabContextMenu.removeChild(document.getElementById('context_closeTabOptions'));
    //click
    menuitem.addEventListener('click', () => {
    	if (event.button == 0) {
           	 for (let i = TabContextMenu.contextTab._tPos - 1; i >= 0; i--)gBrowser.removeTab(gBrowser.tabs[i], {animate: true});
                }
    });
    /**/
        var css =`
    		#context_closeTabsToTheStart {
    			order: -1 !important;
    		}
    		#context_closeTabsToTheEnd {
    			order: -1 !important;
    		}
    		#context_closeOtherTabs {
    			order: -1 !important;
    		}
    `;
        var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);    
        var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css));
    sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
    
    })();
    Alles anzeigen
  • Icon für Lesezeichen-Ordner CSS-Code funktioniert nicht mehr

    • Mitleser
    • 29. September 2025 um 14:47

    lenny2, in einem neuen Profil hat dieses Kontextmenü (auf Linux) keine Symbole.
    Das Icon für #placesContext_showInFolder könntest du in der userChrome also auch genauso anlegen wie du alle anderen Symbole auch eingefügt hast.

    EDIT: Ich vermute, dass du an dieser Stelle das Standardicon von Firefox eingefügt hast.

  • Was hört Ihr gerade?

    • Mitleser
    • 27. September 2025 um 19:46

    Ton Steine Scherben

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Eigene Zusatzleisten ab ff 143+

    • Mitleser
    • 25. September 2025 um 22:24

    Auf besonderen Wunsch von lenny2 gibt es ein Update von RE: Seitennavigation - Fly Out Menü

  • Icon für Lesezeichen-Ordner CSS-Code funktioniert nicht mehr

    • Mitleser
    • 25. September 2025 um 16:43
    Zitat von lenny2

    CSS ändert das Symbol „Im Ordner anzeigen“ in den Suchergebnissen der Seitenleiste nicht.

    Das finde ich so nicht. Könntest du vielleicht bei Gelegenheit einen Screenshot mit einem größeren Bildausschnitt machen?

    Spoiler anzeigen

    OT:

    Zitat von lenny2

    00_VertToolbarWithButton_lite.uc.js
    Es könnte nützlich sein, in die Beschreibung die Möglichkeit aufzunehmen, die Sichtbarkeit der vertikalen Symbolleiste beim Start von Firefox umzuschalten (-off\-on) toolbar.classList.toggle('button-off');

    Habe die gewünschte zusätzliche Funktion hier eingefügt:
    RE: Seitennavigation - Fly Out Menü

  • Icon für Lesezeichen-Ordner CSS-Code funktioniert nicht mehr

    • Mitleser
    • 25. September 2025 um 00:09

    Ja, dann ist es wohl so...

  • Icon für Lesezeichen-Ordner CSS-Code funktioniert nicht mehr

    • Mitleser
    • 24. September 2025 um 21:57
    Zitat von Mitleser

    Das > img funktioniert nur weil du ein list-style-image Attribut gesetzt hast. Das wird nur vom Browser nicht mehr zugelassen/interpretiert.

    Besser verständlich?:
    Das img bei #PlacesToolbarItems toolbarbutton[container]... ist im Pfad nicht vorhanden und funktioniert nur weil du ein list-style-image Attribut gesetzt hast. Das wird nur nur vom Browser in diesem Fall nicht mehr zugelassen/interpretiert. Zumindest vermute ich das; man sollte einen Experten zurate ziehen.

    Das img bei menu.bookmark-item[container] > img hingegen ist real existent und funktioniert auch anstatt .menu-icon (ohne list-style-image Attribut)

    Spoiler anzeigen

    Das wird mir langsam zu anstrengend...
    Kauf dir endlich einen neuen Rechner...1-2 Jahre alte wieder aufbereitete Leasingrückläufer (z.B. als Businesslaptop/Workstationlaptop) gibt es auch gebraucht sehr günstig...Habe auch so einen...

  • Icon für Lesezeichen-Ordner CSS-Code funktioniert nicht mehr

    • Mitleser
    • 24. September 2025 um 20:34
    Zitat von Horstmann

    Das list-style-image an der Stelle wird demnach überschrieben?

    Ja. Das > img funktioniert nur weil du ein list-style-image Attribut gesetzt hast. Das wird nur vom Browser nicht mehr zugelassen/interpretiert.

    Zitat von Horstmann

    Nur mal ganz grob ausgeweitet, könnte sowas auch klappen, für Leiste und Popup, je nachdem wo das jeweilige Label benutzt wird?

    Nein. Aber das (Zeile 7):

    CSS
    /*+++++Lesezeichenordner mit relativem Pfad (Stand FF 143)+++++*/
    
    /*Alle Lesezeichenordner im Dropdown der Lesezeichenleiste (Änderung in 143)*/
    menu.bookmark-item[container] > img {
    	content: url('../icons/16folder03-green.svg') !important;
    }
    /*Lesezeichenordner mit einem definierten Text im Dropdown der Lesezeichenleiste (Änderung in 143)*/
    menu.bookmark-item:is([label="Info"],[label="Shoppen"]) > img {
    	content: url('../icons/16folder03-blue.svg') !important;
    }
    /*Alle Lesezeichenordner in der Lesezeichenleiste (Änderung in 143)*/
    #PlacesToolbarItems toolbarbutton[container].bookmark-item:not(.subviewbutton) .toolbarbutton-icon {
    	content: url('../icons/16folder03-orange.svg') !important;
    }
    /*Lesezeichenordner mit einem definierten Text in der Lesezeichenleiste (Änderung in 143)*/
    #PlacesToolbarItems toolbarbutton[label="Shoppen"].bookmark-item:not(.subviewbutton) .toolbarbutton-icon {
    	content: url('../icons/16folder03-black.svg') !important;
    }
    /*Lesezeichenordner mit einem definierten Text ohne Anzeige des Textes in der Lesezeichenleiste (Änderung in 143)*/
    #PlacesToolbarItems toolbarbutton[label="Info"].bookmark-item > .toolbarbutton-text {
    	display: none !important;
    }
    #PlacesToolbarItems toolbarbutton[label="Info"].bookmark-item:not(.subviewbutton) .toolbarbutton-icon {
    	content: url('../icons/16folder03-cyan.svg') !important;
    }
    /*Der Ordner 'Weitere Lesezeichen' in der Lesezeichenleiste (keine Änderung in 143)*/
    #OtherBookmarks .toolbarbutton-icon {
    	list-style-image: url('../icons/16folder03-red.svg') !important;
    	/*funzt auch:
    	content: url('../icons/16folder03-black.svg') !important;*/
    }
    
    /*Alle Lesezeichenordner in der Sidebar (keine Änderung in 143)*/
    treechildren.sidebar-placesTreechildren::-moz-tree-image(container) {
    	list-style-image: url('../icons/16folder03-cyan.svg') !important;
    }
    
    /*Alle Lesezeichenordner in der 'Bibliothek > Chronik > Chronik verwalten' (keine Änderung in 143)*/
    #placesList > treechildren::-moz-tree-image(container) {
    	list-style-image: url('../icons/16folder03-yellow.svg') !important;
    }
    #placeContent > treechildren::-moz-tree-image(placesContentTitle) {
    	list-style-image: url('../icons/16folder03-purple.svg') !important;
    }
    Alles anzeigen

    Dateien

    chromeFolder_250925.zip 6,42 kB – 30 Downloads
  • Icon für Lesezeichen-Ordner CSS-Code funktioniert nicht mehr

    • Mitleser
    • 24. September 2025 um 17:23

    Oder so:

    CSS
    /*Lesezeichenordner mit einem definierten Text in der Lesezeichenleiste (Änderung in 143)*/
    #PlacesToolbarItems toolbarbutton:is([label="Info"],[label="Shoppen"]).bookmark-item:not(.subviewbutton) .toolbarbutton-icon {
    	content: url('../icons/16folder03-black.svg') !important;
    }

Unterstütze uns!

Jährlich (2025)

107,3 %

107,3% (697,41 von 650 EUR)

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