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

Beiträge von Horstmann

  • Nur die Anzeige der Ordner/Lesezeichenanzahl in einer anderen Farbe darstellen

    • Horstmann
    • 22. Mai 2025 um 10:44
    Zitat von Mira_Belle

    Aber, ich habe da noch was!
    Ich habe gesehen, dass Du in einem Ordner über 180 Lesezeichen hast.

    Wie wäre es, einen Schwellenwert zu definieren, darf natürlich der Nutzer selbst festlegen,
    ab dem der Zählwert nicht mehr "normal" angezeigt wird, sondern FETT und ROT?
    Wobei auch das Fett und die Schriftfarbe vom Nutzer "eingestellt" werden sollte.

    Ich mein' ja nur, damit Dir am Ende nicht langweilig wird.

    Das ist nur ein Testprofil mit Testordnern/Links, um diverse Szenarien abzudecken.

    Im übrigen: Gähn...;) (nur für Links > 99).

    JavaScript
    //bmcount.uc.js, RC_3b
    //Zeigt Anzahl der Lesezeichenordner und Links an in Lesezeichenpopups
    //basiert auf Script von BrokenHeart =>
    //https://www.camp-firefox.de/forum/thema/136572-nur-die-anzeige-der-ordner-lesezeichenanzahl-in-einer-anderen-farbe-darstellen/?postID=1269879#post1269879
    //Release Candidate 3b =>
    //https://www.camp-firefox.de/forum/thema/136572-nur-die-anzeige-der-ordner-lesezeichenanzahl-in-einer-anderen-farbe-darstellen/?postID=1272561#post1272561
    
    //Danke an Mira_Belle für die JS Variablen, Grisu fuer viele Tips, und an alle Beteiligten und Tester!
    
    //Eigenes Icon erwartet in Profilordner/chrome/icons , icons Ordner falls noetig erstellen
    //Eigenes Icon, Name eintragen unten in ==> let icon1/2 = yourIcon...
    
    //Basis Anpassungen =>
    //Zaehler (Counter) #A anpassen (nur falls nötig), #B Reihenfolge waehlen, #C Feinabstimmung
    
    (function() {
    
        if (!window.gBrowser)
            return;
    
        setTimeout(function() {
            setFunction();
        },50);
    
        //Eigene Icons festlegen, falls vorhanden
        let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons'));
        let icon1 = "YourFolderIcon.svg";        //  Custom  Folder Icon
        let icon2 = "YourLinkIcon.svg";          //  Custom  Link Icon
    
        // Variablen zur Auswahl der Klammern
        let bracket = 0; // 0 für "ohne Klammern", 1 für "runde Klammern", 2 für "eckige Klammern"
    
        // Variablen zur Auswahl der Trennlinie
        let trenner = 2; // 0 ohne Trennlinie, 1  mit Trennlinie, 2 mit Trennlinie nur bei Zähler #1 > 0
    
        function setFunction() {
            const css =`
    
           /*** Basiseinstellungen ***/
    
            /** #A: Feste Breite der beiden Counter, abhaengig von Anzahl Ziffern, auto Anpassung für mit/ohne Klammern.
                 falls noetig => Werte erhoehen NUR bis Icons untereinander auf gleicher Hoehe sind **/
    
            /* Beispiel 2 Ziffern plus Klammern, Systemfont Mac */
            #bmContent:is(
            [data-value1^="["],
            [data-value1^="("]) {
                --bm_width_one: 2.1em;
                --bm_width_two: 2.1em;
                }
    
            /* Beispiel 2 Ziffern ohne Klammern, Systemfont Mac */
            #bmContent {
                --bm_width_one: 1.3em;
                --bm_width_two: 1.3em;
                }
    
           /** Counter gesamt **/
    
           #bmContent {
    
           /** Gesamt **/
    
                display: flex !important;
                margin-left: auto !important;         /* Gesamt rechtsbuendig */
                margin-right: -8px !important;        /* Abstand rechts zu Pfeil > ist evtl. OS abhaengig */
                height: var(--bm_icon_size);          /* Layout passt sich Icon Groesse an */
                padding-left: 8px;                    /* min. Abstand links Gesamt für enge Popups */
                /* font */
                /*font-size: 12px !important;*/       /* font-size optional */
                /*font-weight: 200 !important;*/      /* font-weight optional */
                /* font-family: Aenderungen nicht empfohlen, um Standardfont zu behalten */
    
           /** Icons Varianten / ungewuenschte Varianten auskommentieren!!! **/
    
                /* Use Firefox Icons => */
                --bm_icon_image_1: url("chrome://global/skin/icons/folder.svg");
                --bm_icon_image_2: url("chrome://browser/skin/bookmark-hollow.svg");
    
                /* Eigene Icons, falls Icons existieren im icons Ordner => */
           /*   --bm_icon_image_1: url("${ProfilePath}/${icon1}");
                --bm_icon_image_2: url("${ProfilePath}/${icon2}");
                */
    
           /** #B: Reihenfolge Varianten Icons / Ziffern / ungewuenschte Variante auskommentieren!!! **/
    
                /* #1 Icons links / Ziffern rechts */
                --bm_padding_inline: calc(var(--bm_icon_size) + var(--bm_space)) 0;
                --bm_bg_position: center left;
                /**/
    
                /* #2 Ziffern links / Icons rechts */
         /*     --bm_padding_inline: 0 calc(var(--bm_icon_size) + var(--bm_space));
                --bm_bg_position: center right;
                */
    
           /** #C: Abstaende / Groessen Counter = Basisanpassungen **/
    
                /* Abstand mittig zwischen Counter #1 <=> Counter #2 */
                --bm_margin_mid: 16px;
    
                /* Groesse Icons = 16px Firefox Standard */
                --bm_icon_size: 16px;
    
                /* Abstand zwischen Icon und Ziffer */
                --bm_space: 3px;
           }
    
           /*** Basiseinstellungen Ende ***/
    
    
           /** Trennlinie Abstand Mitte **/
           #bmContent.trennclass {
             --bm_divider_A: calc(var(--bm_margin_mid)/2);
             /* Feinabstimmung Trennlinie, fuer Position Mitte */
             --bm_divider_B: 0px;
           }
    
           /** Counters **/
    
           /* Counter #1 Ordner */
           #bmContent::before {
                content: attr(data-value1);
                display: flex;
                min-width: fit-content;
                width: var(--bm_width_one);
                padding-inline: var(--bm_padding_inline);
                align-items: center;
                justify-content: end;
                margin-right: calc(var(--bm_divider_A, 0px) + var(--bm_divider_B, 0px)) ;
                background-image: var(--bm_icon_image_1);
                background-position: var(--bm_bg_position);
                background-repeat: no-repeat;
                background-size: var(--bm_icon_size);
                /* Farben Text / svg Icons aendern => */
                /*color: hsl(155, 90%, 50%, 1) !important;*/
                /*fill: hsl(255, 70%, 50%, 1) !important;*/
                }
    
           /* Counter #2 Links */
           #bmContent::after {
             content: attr(data-value2);
                display: flex;
                min-width: fit-content;
                width: var(--bm_width_two);
                padding-inline: var(--bm_padding_inline);
                align-items: center;
                justify-content: end;
                margin-left: calc(var(--bm_margin_mid) - var(--bm_divider_A, 0px));
                background-image: var(--bm_icon_image_2);
                background-position: var(--bm_bg_position);
                background-repeat: no-repeat;
                background-size: var(--bm_icon_size);
                /* Farben Text / svg Icons aendern => */
                /*color: hsl(155, 90%, 50%, 1) !important;*/
                /*fill: hsl(255, 70%, 50%, 1) !important;*/
                }
    
    
           /** Optionale Extras **/
    
           /** Anpassungen bei Zahl Links > 99 **/
           #bmContent.dreier::after {
             color: hsl(0, 90%, 50%, 1) !important;
             fill: hsl(0, 90%, 50%, 1) !important;
             font-weight: 800 !important;
           }
    
           /** Anpassungen bei Zahl = 0 **/
    
            /* Verstecken / Verblassen #1 */
            #bmContent:is(
            [data-value1="[0]"],
            [data-value1="0"],
            [data-value1="(0)"])::before {
                /*opacity: 0.2;*/
                display: none;
                }
    
            /* Verstecken / Verblassen #2 */
            #bmContent:is(
            [data-value2="[0]"],
            [data-value2="0"],
            [data-value2="(0)"])::after {
                opacity: 0.5;
                }
    
            /* Verstecken Icon bei bei beides = 0 */
              .pfeil:is([data-value3="[0][0]"],
              [data-value3="00"],
              [data-value3="(0)(0)"]) #bmContent::after {
                /*opacity: 0;*/
                background-image: none;
                /*content: "X";*/
                }
    
            /* Pfeil rechts > bei beides = 0 */
            .pfeil:is([data-value3="[0][0]"],
            [data-value3="00"],
            [data-value3="(0)(0)"]) :where(.menu-right, menu::after) {
                fill: hsl(0, 100%, 50%, 1) !important;
                /*opacity: 0;*/
                }
    		`;
            const sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
            const uri = Services.io.newURI('data:text/css,' + encodeURIComponent(css));
            sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
    
            let bmbMenu = document.getElementById('bookmarks-menu-button');
            let bookMenu = document.getElementById('bookmarksMenu');
            let persToolBar = document.getElementById('PersonalToolbar');
    
            if(bmbMenu)
                bmbMenu.addEventListener('popupshowing', onPopupShowing );
            if(bookMenu)-
                bookMenu.addEventListener('popupshowing', onPopupShowing );
            if(persToolBar)
                persToolBar.addEventListener('popupshowing', onPopupShowing );
        }
    
        function onPopupShowing(aEvent) {
            let popup = aEvent.originalTarget;
            for (let item of popup.children) {
                if (item.localName != 'menu' || item.id?.startsWith('history'))
                    continue;
                setTimeout(() => {
                  let itemPopup = item.menupopup;
    			        itemPopup.hidden = true;
    			        itemPopup.collapsed = true;
                  itemPopup.openPopup();
                  itemPopup.hidePopup();
                  let menuitemCount = 0;
                  let menuCount = 0;
                  for (let subitem of itemPopup.children) {
                    if (subitem.classList.contains('bookmark-item') && !subitem.disabled && !subitem.hidden) {
                      if (subitem.localName == 'menuitem') {
                        menuitemCount++;
                      } else if (subitem.localName == 'menu') {
                        menuCount++;
                      }
                    }
                  }
    			        itemPopup.hidden = false;
    			        itemPopup.collapsed = false;
    
                  //Eigenes Element für Zaehler
                  let bmCounta = item.childNodes[1];
                  bmCounta.innerHTML = "";
                  let bmVario = document.createElement("bmElement");
                  bmVario.id = "bmContent";
                  bmCounta.appendChild(bmVario);
    
                  //Zaehler Design Optionen => mit/ohne, runde, eckige Klammern
                  //let strCountOut1, strCountOut2;
    
                  if (bracket === 0) {
                      strCountOut1 = "" + menuCount + "";
                      strCountOut2 = "" + menuitemCount + "";
                  } else if (bracket === 1) {
                      strCountOut1 = "(" + menuCount + ")";
                      strCountOut2 = "(" + menuitemCount + ")";
                  } else if (bracket === 2) {
                      strCountOut1 = "[" + menuCount + "]";
                      strCountOut2 = "[" + menuitemCount + "]";
                  }
    
                  bmVario.setAttribute('data-value1', strCountOut1);
                  bmVario.setAttribute('data-value2', strCountOut2);
    
                  // Trennlinie
                  if (trenner === 1) {
                       bmVario.insertAdjacentText('beforeend', '/');}
    
                  else if (trenner === 2 && menuCount !== 0) {
                       bmVario.insertAdjacentText('beforeend', '/');
                     };
    
                  if (bmVario.innerHTML !== '') {
                       bmVario.classList.add('trennclass');
                  };
    
                  if (menuitemCount > 99) {
                       bmVario.classList.add('dreier');
                     };
    
                  // Extra class und Attribut ganzes menu
                  item.classList.add('pfeil');
                  item.setAttribute('data-value3', strCountOut1 + strCountOut2);
    
                }, 100);
            }
        }
    })();
    Alles anzeigen

  • Nur die Anzeige der Ordner/Lesezeichenanzahl in einer anderen Farbe darstellen

    • Horstmann
    • 21. Mai 2025 um 21:07

    Ich weiß nicht was es ist, aber von diesem kleinen Script komm ich einfach nicht weg... :/
    Schuld hat grisu2099 , mit seiner Reihenfolge und dem verdammten Schrägstrich-Trenner!;)

    Danke nochmal an ihn für die Tips, und natürlich an Mira_Belle für die unermüdliche Hilfe mit dem Code.:)

    JavaScript
    //bmcount.uc.js, RC_3
    //Zeigt Anzahl der Lesezeichenordner und Links an in Lesezeichenpopups
    //basiert auf Script von BrokenHeart =>
    //https://www.camp-firefox.de/forum/thema/136572-nur-die-anzeige-der-ordner-lesezeichenanzahl-in-einer-anderen-farbe-darstellen/?postID=1269879#post1269879
    //Release Candidate 3 =>
    //https://www.camp-firefox.de/forum/thema/136572-nur-die-anzeige-der-ordner-lesezeichenanzahl-in-einer-anderen-farbe-darstellen/?postID=1272545#post1272545
    
    //Danke an Mira_Belle für die JS Variablen, Grisu fuer viele Tips, und an alle Beteiligten und Tester!
    
    //Eigenes Icon erwartet in Profilordner/chrome/icons , icons Ordner falls noetig erstellen
    //Eigenes Icon, Name eintragen unten in ==> let icon1/2 = yourIcon...
    
    //Basis Anpassungen =>
    //Zaehler (Counter) #A anpassen (nur falls nötig), #B Reihenfolge waehlen, #C Feinabstimmung
    
    (function() {
    
        if (!window.gBrowser)
            return;
    
        setTimeout(function() {
            setFunction();
        },50);
    
        //Eigene Icons festlegen, falls vorhanden
        let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons'));
        let icon1 = "YourFolderIcon.svg";        //  Custom  Folder Icon
        let icon2 = "YourLinkIcon.svg";          //  Custom  Link Icon
    
        // Variablen zur Auswahl der Klammern
        let bracket = 0; // 0 für "ohne Klammern", 1 für "runde Klammern", 2 für "eckige Klammern"
    
        // Variablen zur Auswahl der Trennlinie
        let trenner = 2; // 0 ohne Trennlinie, 1  mit Trennlinie, 2 mit Trennlinie nur bei Zähler #1 > 0
    
        function setFunction() {
            const css =`
    
           /*** Basiseinstellungen ***/
    
            /** #A: Feste Breite der beiden Counter, abhaengig von Anzahl Ziffern, auto Anpassung für mit/ohne Klammern.
                 falls noetig => Werte erhoehen NUR bis Icons untereinander auf gleicher Hoehe sind **/
    
            /* Beispiel 2 Ziffern plus Klammern, Systemfont Mac */
            #bmContent:is(
            [data-value1^="["],
            [data-value1^="("]) {
                --bm_width_one: 2.1em;
                --bm_width_two: 2.1em;
                }
    
            /* Beispiel 2 Ziffern ohne Klammern, Systemfont Mac */
            #bmContent {
                --bm_width_one: 1.3em;
                --bm_width_two: 1.3em;
                }
    
           /** Counter gesamt **/
    
           #bmContent {
    
           /** Gesamt **/
    
                display: flex !important;
                margin-left: auto !important;         /* Gesamt rechtsbuendig */
                margin-right: -8px !important;        /* Abstand rechts zu Pfeil > ist evtl. OS abhaengig */
                height: var(--bm_icon_size);          /* Layout passt sich Icon Groesse an */
                padding-left: 8px;                    /* min. Abstand links Gesamt für enge Popups */
                /* font */
                /*font-size: 12px !important;*/       /* font-size optional */
                /*font-weight: 200 !important;*/      /* font-weight optional */
                /* font-family: Aenderungen nicht empfohlen, um Standardfont zu behalten */
    
           /** Icons Varianten / ungewuenschte Varianten auskommentieren!!! **/
    
                /* Use Firefox Icons => */
                --bm_icon_image_1: url("chrome://global/skin/icons/folder.svg");
                --bm_icon_image_2: url("chrome://browser/skin/bookmark-hollow.svg");
    
                /* Eigene Icons, falls Icons existieren im icons Ordner => */
           /*   --bm_icon_image_1: url("${ProfilePath}/${icon1}");
                --bm_icon_image_2: url("${ProfilePath}/${icon2}");
                */
    
           /** #B: Reihenfolge Varianten Icons / Ziffern / ungewuenschte Variante auskommentieren!!! **/
    
                /* #1 Icons links / Ziffern rechts */
                --bm_padding_inline: calc(var(--bm_icon_size) + var(--bm_space)) 0;
                --bm_bg_position: center left;
                /**/
    
                /* #2 Ziffern links / Icons rechts */
         /*     --bm_padding_inline: 0 calc(var(--bm_icon_size) + var(--bm_space));
                --bm_bg_position: center right;
                */
    
           /** #C: Abstaende / Groessen Counter = Basisanpassungen **/
    
                /* Abstand mittig zwischen Counter #1 <=> Counter #2 */
                --bm_margin_mid: 16px;
    
                /* Groesse Icons = 16px Firefox Standard */
                --bm_icon_size: 16px;
    
                /* Abstand zwischen Icon und Ziffer */
                --bm_space: 3px;
           }
    
           /*** Basiseinstellungen Ende ***/
    
    
           /** Trennlinie Abstand Mitte **/
           #bmContent.trennclass {
             --bm_divider_A: calc(var(--bm_margin_mid)/2);
             /* Feinabstimmung Trennlinie, fuer Position Mitte */
             --bm_divider_B: 0px;
           }
    
           /** Counters **/
    
           /* Counter #1 Ordner */
           #bmContent::before {
                content: attr(data-value1);
                display: flex;
                min-width: fit-content;
                width: var(--bm_width_one);
                padding-inline: var(--bm_padding_inline);
                align-items: center;
                justify-content: end;
                margin-right: calc(var(--bm_divider_A, 0px) + var(--bm_divider_B, 0px)) ;
                background-image: var(--bm_icon_image_1);
                background-position: var(--bm_bg_position);
                background-repeat: no-repeat;
                background-size: var(--bm_icon_size);
                /* Farben Text / svg Icons aendern => */
                /*color: hsl(155, 90%, 50%, 1) !important;*/
                /*fill: hsl(255, 70%, 50%, 1) !important;*/
                }
    
           /* Counter #2 Links */
           #bmContent::after {
             content: attr(data-value2);
                display: flex;
                min-width: fit-content;
                width: var(--bm_width_two);
                padding-inline: var(--bm_padding_inline);
                align-items: center;
                justify-content: end;
                margin-left: calc(var(--bm_margin_mid) - var(--bm_divider_A, 0px));
                background-image: var(--bm_icon_image_2);
                background-position: var(--bm_bg_position);
                background-repeat: no-repeat;
                background-size: var(--bm_icon_size);
                /* Farben Text / svg Icons aendern => */
                /*color: hsl(155, 90%, 50%, 1) !important;*/
                /*fill: hsl(255, 70%, 50%, 1) !important;*/
                }
    
    
           /** Optionale Extras **/
    
           /** Anpassungen bei Zahl = 0 **/
    
            /* Verstecken / Verblassen #1 */
            #bmContent:is(
            [data-value1="[0]"],
            [data-value1="0"],
            [data-value1="(0)"])::before {
                /*opacity: 0.2;*/
                display: none;
                }
    
            /* Verstecken / Verblassen #2 */
            #bmContent:is(
            [data-value2="[0]"],
            [data-value2="0"],
            [data-value2="(0)"])::after {
                opacity: 0.5;
                }
    
            /* Verstecken Icon bei bei beides = 0 */
              .pfeil:is([data-value3="[0][0]"],
              [data-value3="00"],
              [data-value3="(0)(0)"]) #bmContent::after {
                /*opacity: 0;*/
                background-image: none;
                /*content: "X";*/
                }
    
            /* Pfeil rechts > bei beides = 0 */
            .pfeil:is([data-value3="[0][0]"],
            [data-value3="00"],
            [data-value3="(0)(0)"]) :where(.menu-right, menu::after) {
                fill: hsl(0, 100%, 50%, 1) !important;
                /*opacity: 0;*/
                }
    		`;
            const sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
            const uri = Services.io.newURI('data:text/css,' + encodeURIComponent(css));
            sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
    
            let bmbMenu = document.getElementById('bookmarks-menu-button');
            let bookMenu = document.getElementById('bookmarksMenu');
            let persToolBar = document.getElementById('PersonalToolbar');
    
            if(bmbMenu)
                bmbMenu.addEventListener('popupshowing', onPopupShowing );
            if(bookMenu)-
                bookMenu.addEventListener('popupshowing', onPopupShowing );
            if(persToolBar)
                persToolBar.addEventListener('popupshowing', onPopupShowing );
        }
    
        function onPopupShowing(aEvent) {
            let popup = aEvent.originalTarget;
            for (let item of popup.children) {
                if (item.localName != 'menu' || item.id?.startsWith('history'))
                    continue;
                setTimeout(() => {
                  let itemPopup = item.menupopup;
    			        itemPopup.hidden = true;
    			        itemPopup.collapsed = true;
                  itemPopup.openPopup();
                  itemPopup.hidePopup();
                  let menuitemCount = 0;
                  let menuCount = 0;
                  for (let subitem of itemPopup.children) {
                    if (subitem.classList.contains('bookmark-item') && !subitem.disabled && !subitem.hidden) {
                      if (subitem.localName == 'menuitem') {
                        menuitemCount++;
                      } else if (subitem.localName == 'menu') {
                        menuCount++;
                      }
                    }
                  }
    			        itemPopup.hidden = false;
    			        itemPopup.collapsed = false;
    
                  //Eigenes Element für Zaehler
                  let bmCounta = item.childNodes[1];
                  bmCounta.innerHTML = "";
                  let bmVario = document.createElement("bmElement");
                  bmVario.id = "bmContent";
                  bmCounta.appendChild(bmVario);
    
                  //Zaehler Design Optionen => mit/ohne, runde, eckige Klammern
                  //let strCountOut1, strCountOut2;
    
                  if (bracket === 0) {
                      strCountOut1 = "" + menuCount + "";
                      strCountOut2 = "" + menuitemCount + "";
                  } else if (bracket === 1) {
                      strCountOut1 = "(" + menuCount + ")";
                      strCountOut2 = "(" + menuitemCount + ")";
                  } else if (bracket === 2) {
                      strCountOut1 = "[" + menuCount + "]";
                      strCountOut2 = "[" + menuitemCount + "]";
                  }
    
                  bmVario.setAttribute('data-value1', strCountOut1);
                  bmVario.setAttribute('data-value2', strCountOut2);
    
                  // Trennlinie
                  if (trenner === 1) {
                       bmVario.insertAdjacentText('beforeend', '/');}
    
                  else if (trenner === 2 && menuCount !== 0) {
                       bmVario.insertAdjacentText('beforeend', '/');
                     };
    
                  if (bmVario.innerHTML !== '') {
                       bmVario.classList.add('trennclass');
                  };
    
                  // Extra class und Attribut ganzes menu
                  item.classList.add('pfeil');
                  item.setAttribute('data-value3', strCountOut1 + strCountOut2);
    
                }, 100);
            }
        }
    })();
    Alles anzeigen

    icons.zip

  • Diskussion über neues Unterforum nur für Skripte

    • Horstmann
    • 20. Mai 2025 um 22:37

    Wäre es evtl.sinnvoll, jeweils eine Thread für aktuell notwendige, bzw. via Nightly vorhersehbare Anpassungen zu Firefox Updates zu erstellen?

    Zum Beispiel:

    Titel:

    [Anpassungen] Firefox 139

    Inhalte:

    CSS:
    #tab-Nudel ändert sich zu .tab_pasta.

    Links zu relevanten Diskussionen.

    Plus möglichst einfacher Beispielcode:

    CSS
    #tab-Nudel {
        margin: 12px;
    }
    
    /* ===>> */
    
    .tab_pasta {
        margin: 12px;
    }

    Javascript: Anpassungen eval, Links zu relevanten Diskussionen, zB hier.

    Plus möglichst einfacher Beispielcode: ...

    ------------

    Das Ganze eben reduziert auf Basisinfos, möglichst allgemein gehaltenen Lösungsvorschlägen soweit vorhanden, und Links zu spezifischeren Diskussionen zu einzelnen CSS oder JS Codes.:/

  • extras_config_menu.uc.js in Fx 139 keine Funktion mehr

    • Horstmann
    • 20. Mai 2025 um 21:43
    Zitat von Sören Hentzschel
    Zitat von Horstmann

    Das hat sonst auch kaum einer bemerkt, weil es kaum jemand für nötig hält, Infos dieser Art allgemein zugänglich zu machen. X/

    Das ist eine Notlösung und eigentlich nicht das, was empfohlen werden sollte. Stattdessen sollte das Script angepasst werden. Das Prinzip wurde hier über Monate in gefühlt einer Million Scripts behandelt. Ich halte es nicht für zielführend, Optionen größer zu kommunizieren, welche die Sicherheit von Firefox reduzieren.

    Das Thema hatten wir ja schon; meiner Ansicht nach wäre es sinnvoll, zumindest manche aktuell nötigen Lösungen zentral verfügbar zu machen.

    Ich selber folge nicht allen, aber sehr vielen Diskussionen hier im Anpassungen Forum, und habe eine umfangreiche Sammlung an Lösungen abgespeichert, muss aber in etwas exotischeren Fällen wie diesem about:config Fall - bzw. dessen Vermeidung - trotzdem nachblättern.
    Was ich zwar die Tage selber mal in einem Script umgebaut hatte, aber nicht sooo oft behandelt wurde, dass ich es auswendig mitsingen könnte. ;)

    Ist aber etwas OT, und Andreas hat hier ja auch den Bezug geliefert.

  • extras_config_menu.uc.js in Fx 139 keine Funktion mehr

    • Horstmann
    • 20. Mai 2025 um 20:02
    Zitat von milupo
    Zitat von Horstmann

    Das hat sonst auch kaum einer bemerkt, weil es kaum jemand für nötig hält, Infos dieser Art allgemein zugänglich zu machen.

    Du unterstellst hier einfach etwas. Ich bin mir sicher, dass du nicht beweisen kannst, dass jemand Informationen zurückhält, die er hat, es sei denn du bist es selbs

    Mir ist es wiederholt aufgefallen, dass du nicht immer dem Inhalt von Beiträgen folgen zu schein kannst. :/
    Was auch immer dieses Sorbisch ist, evtl. gibt es eine Übersetzunglösung für Deutsch nach dahin. ;)

    Im Übrigen ist es mE sehr hilfreich was Andreas gerade gemacht hat, nämlich auf eben die relevante Diskussion zu verlinken.

  • Nur die Anzeige der Ordner/Lesezeichenanzahl in einer anderen Farbe darstellen

    • Horstmann
    • 20. Mai 2025 um 19:46
    Zitat von Mitleser

    Geht denn das in FF 139?+:

    Das müsste mal jemand kurz testen der einfacheren Zugang zur Nightly hat, aber zumindest .menu-right gibt es wohl nicht mehr.

  • extras_config_menu.uc.js in Fx 139 keine Funktion mehr

    • Horstmann
    • 20. Mai 2025 um 19:39
    Zitat von omar1979
    Zitat von Endor

    Hallo omar1979
    Hast Du in Firefox 139 in about:config den Eintrag
    security.browser_xhtml_csp.enabled auf false gesetzt?
    Sonst geht das Script nicht mehr.

    Hab garnicht gemerkt, dass das sein muss. Danke für die Info.

    Das hat sonst auch kaum einer bemerkt, weil es kaum jemand für nötig hält, Infos dieser Art allgemein zugänglich zu machen.X/
    Oder Links zu den relevanten Themen einzustellen.

  • Nur die Anzeige der Ordner/Lesezeichenanzahl in einer anderen Farbe darstellen

    • Horstmann
    • 18. Mai 2025 um 22:01
    Zitat von Mira_Belle
    Zitat von Horstmann

    PS: Ab Fx 139 sollte das alte Script nicht mehr funktionieren, und evtl. kommen dann Anfragen und weitere Kommentare; ...

    Nach Belieben veränder, zerpflücken und anpassen, funktioniert in der Nightly.

    :thumbup:

    Wenn der Fx Release auf 139 wechselt, dann könnten die Rückfragen kommen; unsere neueren Versionen aus den letzten Wochen - seit grisu's Nachfrage für 139 Nightly - passen dann aber hoffentlich noch.

  • Nur die Anzeige der Ordner/Lesezeichenanzahl in einer anderen Farbe darstellen

    • Horstmann
    • 18. Mai 2025 um 15:15
    Zitat von Mira_Belle

    Vorschlag.

    Coool! Dankeschön. :):thumbup:

    PS: Ab Fx 139 sollte das alte Script nicht mehr funktionieren, und evtl. kommen dann Anfragen und weitere Kommentare; bis dahin lasse ich meine letzte Version wie sie ist - danach kommt dein Code mit rein. :)

  • Nur die Anzeige der Ordner/Lesezeichenanzahl in einer anderen Farbe darstellen

    • Horstmann
    • 18. Mai 2025 um 13:30
    Zitat von Mira_Belle

    Du könntest oben Variablen definieren, die die Einstellung für das Klammergedöhns vereinfachen,
    und niemand müsste im Code groß was verändern.
    Einfach eine "0" für ohne, eine "1" für runde oder eine "2" für eckige Klammern.

    Danke Mira. :)

    Das mit den Klammern als JS Option würde evtl. Sinn machen, da müsste ich mich aber nochmal einlesen wie das geht (viele deiner früheren Postings zu JS Variablen kenne ich auch).

    Ich wollte nur ein Mittelding finden zw. Variablen und manuell, so daß das CSS möglichst übersichtlich bleibt, und Styles weitmöglichst im CSS Block sitzen, für User die sich darüber ihr eigenes Ding basteln wollen.

  • Nur die Anzeige der Ordner/Lesezeichenanzahl in einer anderen Farbe darstellen

    • Horstmann
    • 17. Mai 2025 um 23:25

    Mit Spannung erwartet, hier meine aktuelle Version, damit ich das Ding endlich aufhöre weiter zu bearbeiten. ;)

    Hoffe es macht Sinn; Kommentare und Aufbau für Bedienbarkeit zu gestalten ist immer eine Herausforderung.
    Es ist noch Einiges an Variablen enthalten; wer diese oder einige Varianten nicht braucht, kann wo nötig feste Werte eintragen bzw. Letztere löschen.

    Wir hätten hier Icons von Firefox, ersetzbar mit eigenen Icons (zB die im Anhang), eine entfernbare Trennlinie, und eine Option die Reihenfolge von Icon und Zahlenwert umzukehren, plus einige mögliche kosmetische Anpassungen.
    Das ganze sollte sich ohne viel Drama automatisch für die diversen Varianten anpassen lassen über die Basiseinstellungen. :/

    Test und Kritik wie immer herzlich willkommen. :)

    JavaScript
     //bmcount.uc.js, RC_2
    //Zeigt Anzahl der Lesezeichenordner und Links an in Lesezeichenpopups
    //basiert auf Script von BrokenHeart =>
    //https://www.camp-firefox.de/forum/thema/136572-nur-die-anzeige-der-ordner-lesezeichenanzahl-in-einer-anderen-farbe-darstellen/?postID=1269879#post1269879
    //Release Candidate 2 =>
    //https://www.camp-firefox.de/forum/thema/136572-nur-die-anzeige-der-ordner-lesezeichenanzahl-in-einer-anderen-farbe-darstellen/?postID=1272262#post1272262
    
    // Eigenes Icon erwartet in Profilordner/chrome/icons , icons Ordner falls noetig erstellen
    // Eigenes Icon, Name unten in ==> let icon1/2 = yourIcon...
    //Basis Anpassungen =>
    //Zaehler (Counter) Design Optionen mit / ohne Klammern waehlen ganz unten => #A, #B, #D (aus/ein), #C Feinabstimmung
    
    (function() {
    
        if (!window.gBrowser)
            return;
    
        setTimeout(function() {
            setFunction();
        },50);
    
        //Custom icons ==> in profilename/chrome/icons folder
        let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons'));
        let icon1 = "YourFolderIcon.svg"        //  Custom  Folder Icon
        let icon2 = "YourLinkIcon.svg"          //  Custom  Link Icon
    
        function setFunction() {
            const css =`
    
           /*** Basiseinstellungen ***/
    
           #bmContent {
    
           /** Gesamt **/
    
                display: flex !important;
                margin-inline: auto -8px !important;  /* Gesamt rechtsbuendig, Abstand rechts zu Pfeil > */
                height: var(--bm_icon_size);          /* Layout passt sich Icon Groesse an */
                padding-left: 8px;                    /* min. Abstand links Gesamt für enge Popups */
                /*font-size: 12px !important;*/
    
           /** Icons Varianten / ungewuenschte Varianten auskommentieren!!! **/
    
                /* Use Firefox Icons => */
                --bm_icon_image_1: url("chrome://global/skin/icons/folder.svg");
                --bm_icon_image_2: url("chrome://browser/skin/bookmark-hollow.svg");
    
                /* Eigene Icons, falls Icons existieren im icons Ordner => */
           /*   --bm_icon_image_1: url("${ProfilePath}/${icon1}");
                --bm_icon_image_2: url("${ProfilePath}/${icon2}");
                */
    
           /** #A: Feste Breite der beiden Counter, abhaengig von Anzahl Ziffern
                => Wert erhoehen NUR bis Icons untereinander auf gleicher Hoehe sind,
                ungewuenschte Variante auskommentieren!!! **/
    
                /* 2 Ziffern plus Klammern, Systemfont Mac, Zähler Design Optionen => ganz unten */
           /*   --bm_width_one: 2.1em;
                --bm_width_two: 2.1em;
                */
                /* 2 Ziffern ohne Klammern, Systemfont Mac, Zähler Design Optionen => ganz unten */
                --bm_width_one: 1.3em;
                --bm_width_two: 1.3em;
    
           /** #B: Reihenfolge Varianten Icons / Ziffern / ungewuenschte Variante auskommentieren!!! **/
    
                /* #1 Icons links / Ziffern rechts */
                --bm_padding_inline: calc(var(--bm_icon_size) + var(--bm_space)) 0;
                --bm_bg_position: center left;
    
                /* #2 Ziffern links / Icons rechts / --bm_divider_2 gerade Zahl = Abstand mittig zusaetzlich fuer Trennlinie */
            /*  --bm_padding_inline: 0 calc(var(--bm_icon_size) + var(--bm_space));
                --bm_bg_position: center right;
                --bm_divider_2: -1px;
                */
    
    
           /** #C: Abstaende / Groessen Counter Basis **/
    
                /* Abstand mittig zwischen Counter #1 <=> Counter #2, gerade Zahl falls Trennlinie benutzt */
                --bm_margin_mid: 16px;
    
                /* Groesse Icons = 16px Firefox Standard */
                --bm_icon_size: 16px;
    
                /* Abstand zwischen Icon und Ziffer */
                --bm_space: 3px;
           }
    
           /** #D: Trennlinie optional, auskommentieren falls unerwuenscht => evtl. #C neu anpassen **/
           /* image / slice = max icon width? / height adjust 0px = 100%, width / outset = Abstand links */
           #bmContent::after {
                border-image: linear-gradient(currentColor, currentColor)
                              0 0 0 1 /
                              2px var(--bm_divider) /
                              0 0 0 calc(var(--bm_margin_mid)/2 + var(--bm_divider) + 2*var(--bm_divider_2, 0px));
                --bm_divider: 1px;
                }
    
           /*** Basiseinstellungen Ende ***/
    
    
           /** Counters **/
    
           /* Counter #1 Ordner */
           #bmContent::before {
                content: attr(data-value1);
                display: flex;
                min-width: fit-content;
                width: var(--bm_width_one);
                padding-inline: var(--bm_padding_inline);
                align-items: center;
                justify-content: end;
                margin-right: var(--bm_divider_2, 0px);
                background-image: var(--bm_icon_image_1);
                background-position: var(--bm_bg_position);
                background-repeat: no-repeat;
                background-size: var(--bm_icon_size);
                /* Farben Text / svg Icons aendern => */
                /*color: hsl(155, 90%, 50%, 1) !important;*/
                /*fill: hsl(255, 70%, 50%, 1) !important;*/
                }
    
           /* Counter #2 Links */
           #bmContent::after {
                content: attr(data-value2);
                display: flex;
                min-width: fit-content;
                width: var(--bm_width_two);
                padding-inline: var(--bm_padding_inline);
                align-items: center;
                justify-content: end;
                margin-left: calc(var(--bm_margin_mid) + var(--bm_divider, 0px));
                background-image: var(--bm_icon_image_2);
                background-position: var(--bm_bg_position);
                background-repeat: no-repeat;
                background-size: var(--bm_icon_size);
                /* Farben Text / svg Icons aendern => */
                /*color: hsl(155, 90%, 50%, 1) !important;*/
                /*fill: hsl(255, 70%, 50%, 1) !important;*/
                }
    
           /** Optionale Extras **/
    
           /* Anpassungen bei Zahl = 0 */
    
            /* Verstecken / Verblassen #1 */
            #bmContent:is(
            [data-value1="[0]"],
            [data-value1="0"],
            [data-value1="(0)"])::before {
                /*opacity: 0.2;*/
                display: none;
                }
    
            /* Verstecken / Verblassen #2 */
            #bmContent:is(
            [data-value2="[0]"],
            [data-value2="0"],
            [data-value2="(0)"])::after {
                opacity: 0.5;
                }
    
            /* Verstecken Trennlinie bei #1 = 0 und versteckt */
            #bmContent:is(
            [data-value1="[0]"],
            [data-value1="0"],
            [data-value1="(0)"])::after {
                border-image: none;
                }
    
            /** Helfer zum Testen der Abstände **/
    
            /*
            #bmContent {
                outline: 1px solid blue;
                outline-offset: 4px;
              }
            #bmContent::before, #bmContent::after {
                outline: 1px solid orange;
                }
            */
            /*
            #bmContent::after {
                background-image: var(--bm_icon_image_1),linear-gradient(lightgreen, lightgreen) !important;
                background-color: pink;
                }
            #bmContent::before {
                background-image: var(--bm_icon_image_2),linear-gradient(lightblue, lightblue) !important;
                background-color: khaki;
                }
            */
    
    		`;
            const sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
            const uri = Services.io.newURI('data:text/css,' + encodeURIComponent(css));
            sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
    
            let bmbMenu = document.getElementById('bookmarks-menu-button');
            let bookMenu = document.getElementById('bookmarksMenu');
            let persToolBar = document.getElementById('PersonalToolbar');
    
            if(bmbMenu)
                bmbMenu.addEventListener('popupshowing', onPopupShowing );
            if(bookMenu)-
                bookMenu.addEventListener('popupshowing', onPopupShowing );
            if(persToolBar)
                persToolBar.addEventListener('popupshowing', onPopupShowing );
        }
    
        function onPopupShowing(aEvent) {
            let popup = aEvent.originalTarget;
            for (let item of popup.children) {
                if (item.localName != 'menu' || item.id?.startsWith('history'))
                    continue;
                setTimeout(() => {
                  let itemPopup = item.menupopup;
    			        itemPopup.hidden = true;
    			        itemPopup.collapsed = true;
                  itemPopup.openPopup();
                  itemPopup.hidePopup();
                  let menuitemCount = 0;
                  let menuCount = 0;
                  for (let subitem of itemPopup.children) {
                    if (subitem.classList.contains('bookmark-item') && !subitem.disabled && !subitem.hidden) {
                      if (subitem.localName == 'menuitem') {
                        menuitemCount++;
                      } else if (subitem.localName == 'menu') {
                        menuCount++;
                      }
                    }
                  }
    			        itemPopup.hidden = false;
    			        itemPopup.collapsed = false;
    
                  // Eigenes Element für Zaehler
                  let bmCounta = item.childNodes[1];
                  bmCounta.innerHTML = "";
                  let bmVario = document.createElement("bmElement");
                  bmVario.id = "bmContent";
                  bmCounta.appendChild(bmVario);
    
                  //Zaehler Design Optionen => mit, ohne, eckige, runde Klammern
    
                  let strCountOut1 = "" + menuCount + "";      //  ohne Klammern
                  //let strCountOut1 = "(" + menuCount + ")";    //  runde Klammern
                  //let strCountOut1 = "[" + menuCount + "]";      //  eckige Klammern
                  bmVario.setAttribute('data-value1', strCountOut1);
    
                  let strCountOut2 = "" + menuitemCount + "";      //  ohne Klammern
                  //let strCountOut2 = "(" + menuitemCount + ")";    //  runde Klammern
                  //let strCountOut2 = "[" + menuitemCount + "]";      //  eckige Klammern
                  bmVario.setAttribute('data-value2', strCountOut2);
    
                  // Extra class und Attribut parent; experimentell
                  //if (bmContent.parentElement) {
                  //bmContent.parentElement.classList.add('pfeil');
                  //bmContent.parentElement.setAttribute('data-value3', strCountOut1 + strCountOut2);
                  //}
    
                }, 100);
            }
        }
    })();
    Alles anzeigen

    icons.zip

  • Beenden Button

    • Horstmann
    • 16. Mai 2025 um 19:23
    Zitat von clio

    Und noch eine andere Variante, ohne Button aber im Kontextmenü, funktioniert mit FF 138 und 140:


    Funktioniert top in 115esr! ;)

    Für aktuellere Versionen evtl. eher sowas:

    JavaScript
    //Fox_schließen_Context
    (function() {
      if (location.href !== 'chrome://browser/content/browser.xhtml')
        return;
    
    const label = 'Fox schließen';
    //const oncommand = "goQuitApplication(event);";
    //const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
    const menuitem1 = document.createXULElement('menuitem');
          menuitem1.id = 'contextTest';
          menuitem1.setAttribute('label', label);
          //menuitem1.setAttribute('oncommand', oncommand);
          menuitem1.addEventListener('command', () => {
              goQuitApplication(event);
            });
    const refItem1 = document.getElementById('context-inspect');
          refItem1.parentNode.insertBefore(menuitem1, refItem1.nextSibling);
    })();
    Alles anzeigen
  • userChrome.js Scripte für den Fuchs (Diskussion)

    • Horstmann
    • 15. Mai 2025 um 19:57
    Zitat von Speravir

    Dasselbe wie AnimationToggleButton in meinem Beitrag Nr. 4443: Es wird die Einstellung image.animation_mode auf einen von drei möglichen Werten geändert und dann die aktuelle Seite neu geladen (sollte es zumindest), wobei sich auch der Button selbst ändert/ändern sollte. Das Ergebnis kann man mit allen animierten Grafiken testen, Beispiele (alle Wikimedia Commons):

    Es wäre übrigens tatsächlich mal interessant, was man in MacOS statt des Mittelklicks tun muss.

    Ebenfalls vergessen zu antworten, sorry.
    Am Mac sollte es da keinen Unterschied geben, event.button 0, 1, 2 ist Maustaste links, Mitte, rechts.

  • Firefox 138 - Script "F12 schließt Tab" geht nicht mehr

    • Horstmann
    • 15. Mai 2025 um 15:33

    Wie von Milupo, oder vielleicht:

    JavaScript
    (function() {
     if (!window.gBrowser)
       return;
     for (let key of document.querySelectorAll('key[keycode="VK_F12"]')) {
       key.setAttribute('disabled', 'true');
     }
     let key = document.createXULElement('key');
     key.id = 'closeTab';
     key.setAttribute('keycode', 'VK_F12');
     //key.setAttribute('oncommand', 'gBrowser.removeTab(gBrowser.selectedTab, {animate: true})');
     key.addEventListener('command', () => {
         gBrowser.removeTab(gBrowser.selectedTab, {animate: true});
       });
     document.getElementById('mainKeyset').appendChild(key);
    })();
    Alles anzeigen
  • Einige Skripte funktionieren seit ff 138 nicht mehr

    • Horstmann
    • 15. Mai 2025 um 00:02
    Zitat von StandingBill

    Ohne deine Kenntnisse, Sammlungen und stetige Hilfsbereitschaft gäbe es hier bei weitem nicht so viele zufriedene Hilfesuchende.

    Wenn dich das Thema interessiert, kannst du gerne auch mal in aktuellen Diskussionen vorbeischauen, wie etwa hier oder hier, um Lösungsansätze zu finden, die dem momentanen Stand der Dinge etwas näher kommen, und keine bekannten Fehler beinhalten.

  • Einbindung von Icons in Skripts

    • Horstmann
    • 14. Mai 2025 um 22:40
    Zitat von Mitleser

    Hallo Mira_Belle, ich wundere mich, dass du mich in dieser illustren Aufzählung erwähnst, ...

    Stell dir mein Erstaunen vor; Mira_Belle , kann ich raus aus der Liste - manche Assoziation würde ich lieber vermeiden? 8)

  • Einbindung von Icons in Skripts

    • Horstmann
    • 14. Mai 2025 um 19:33
    Zitat von BrokenHeart

    Das Umschreiben der "Bestandsskripte" würde ich wirklich nicht ins Auge fassen. Wenn sich dann wieder etwas ändert oder eine neue "Verbesserung" anliegt, dann kann man das ganze Procedere wieder von vorne durchexerzieren.

    Dieses Umschreiben haben wir doch neulich schon durchexerziert, mit den inline events Dingens.
    Was nicht das erste oder letzte Mal ist.
    Änderungen die nicht strukturell nötig sind werden übernommen oder auch nicht, das zwingt niemanden zu Änderungen.

    Was mich angeht, ist die komplette Diskussion über die Beibehaltung von in Javascript Dateien integrierten Bilddateien, wie etwa base64<X Icons - oder nicht.

    Was wiederum eine Diskussion darüber ist, ob es einem User zugemutet werden kann, eine komplexe Manipulation eines sehr komplexen Internet Browsers vorzunehmen, nachdem schon eine notwendige Vorbereitung zur Ausführung dieser Manipulation stattgefunden hat - ohne auch noch ein Bild in einen vordefinierten Ordner packen zu müssen.

    Was mich angeht, wäre eine Version mit manuell zu installierendem Icon am sinnvollsten, plus einer möglichst einfachen Fallback Lösung, wie es Mira mit dem warning Icon gemacht hat.

    Der Fallback va für den Fall, dass wie oft ein Button automatisch in einer Leiste plaziert wird - aber ohne Icon sieht der User nur ein Leerfeld, und je nach Layout nicht mal das, weil es uU in Spacern untergeht und dann der Button scheinbar nicht existiert.

    Die Fallback Geschichte ist von der AI/KI Diskussion verschluckt worden; ist wegen mir auch nicht zwingend nötig, aber könnte bestimmt einfach sein wenn sich das ein Experte mal kurz anschaut (#49 ->)- und Mira mal kurz ihren Einfärbungsfetisch beiseite lässt. ^^

  • Einbindung von Icons in Skripts

    • Horstmann
    • 14. Mai 2025 um 18:55
    Zitat von Mira_Belle


    Aber wir sollten bei Skripten darauf achten, z.B. keine "..." mehr zu verwenden. Statt dessen '....'.

    Wenn schon, dann gibt es noch die schrägen und geraden Anführungszeichen beider Art, die zu verwechseln auch mal Probleme machen kann; sollten es nicht die geraden Zeichen sein? ;)

  • Einbindung von Icons in Skripts

    • Horstmann
    • 14. Mai 2025 um 17:03
    Zitat von Mira_Belle

    Horstmann Könntest Du mir diese Sammlung mal zukommen lassen?

    Es ist nicht die Art von Sammlung die für eine Veröffentlichung taugt.
    Das sind tausende Dateien mit Querverweisen und Aliasen, ich komm selber kaum noch durch... ;)

  • Einbindung von Icons in Skripts

    • Horstmann
    • 14. Mai 2025 um 13:16
    Zitat von Sören Hentzschel

    Zumal die Tipps, die ich durchaus ab und an gebe, ja auch nicht nachhaltig umgesetzt werden, sondern gefühlt nach fünf Minuten schon wieder vergessen wurden. Wieso sollte das durch mehr Menschen, die etwas schreiben, anders sein?

    Ich schreibe (fast) immer mit. ;)
    Meine Sammlung an potentiellen Lösungsansätzen ist massiv.

    Deine Tipps - und die von einigen anderen Beitragenden - gehen bei mir zumindest nicht verloren, und vielen Dank dafür an dieser Stelle. :)

    Manchmal muss man halt auch Dinge wiederholt reinhämmern bis etwas greift, das ist mein Eindruck.;)

Unterstütze uns!

Jährlich (2025)

108,6 %

108,6% (705,72 von 650 EUR)

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