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

Beiträge von GermanFreme82

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 2. Mai 2025 um 00:07
    Zitat von Horstmann
    Zitat von GermanFreme82

    Jetzt bruahc ich nur noch den Abstand der TAB der soll 0 sein oben und unten 0 un zueinender bitte 5px

    Ich steig da nicht durch, aber probier mal ganz grob in der CSS Datei das dazu, am besten unten:

    CSS
    .tabbrowser-tab:not([pinned]) {
        padding-inline: 5px !important;
    }
    
    .tab-background {
        margin-block: 0 !important;
    }

    Das geht nicht, wenn ich da ganz unten ans Ende einfüge, dann ist die TAB-Leiste wieder über der Adressleiste, wo soll das denn rein genau in welche Datei ?


    Also nochmal ich versuche s mal anders zu erklären.

    Ich möchte das der Abstand der TABs zueinander rund 5px ist.
    Ich möchte gerne, das über den TABs kein freier Raum ist
    Ich möhte das unter jedem TAB kein freier Raum ist

    Das wäre der Anfang weitere Dinge sage ich erstmal nicht um nicht wieder zu veriwrren hehehehe


    aktuell ist es so in "MultiRowTabLiteforFx.uc"

    CSS
    // ==UserScript==
    // @name           MultiRowTabLiteforFx.uc.js
    // @namespace      Based on Alice0775's zzzz-MultiRowTab_LiteforFx48.uc.js
    // @description    Mehrzeilige Tableiste - Experimentelle CSS Version
    // @include        main
    // @compatibility  Firefox 138+
    // @version        2025/04/07 12:00
    // ==/UserScript==
    "use strict";
    MultiRowTabLiteforFx();
    function MultiRowTabLiteforFx() {
    if (!window.gBrowser) { return; }
       // -- Config --
       // Vergleichbarer CSS Code in userChrome.css Datei wird vorrangig behandelt!
       const                                                 // Mehrzeilige Tableiste Ein/Aus Anzahl der Tabzeilen
       MultiRowTab_OnOff_and_TabBar_Rows =       -1         ,// [-1] = Mehrzeilige Tableiste aktiv unbegrenzte Anzahl von Zeilen.
                                                             //  0   = Mehrzeilige Tableiste aus.
                                                             //  1   = Mehrzeilige Tableiste aktiv. Standard = 1 Zeile. Bei Berührung
                                                             //        der Tableiste mit der der Maus, werden die zweite und die folgenden 
                                                             //        Zeilen bis zur angegebenen Anzahl von Zeilen angezeigt.
                                                             //  2   = Mehrzeilige Tableiste aktiv. Anzahl der Tabzeilen angeben.
            
       TabBar_Rows_on_MouseOver =                3          ,// Standard = 1 Zeile. Anzahl der Zeilen angeben, die angezeigt werden sollen, 
                                                             // wenn der Mauszeiger über die Tableiste bewegt wird. Voraussetzung: 
                                                             // „MultiRowTab_OnOff_and_TabBar_Rows“ auf „1“ setzen.
            
       TabBar_DisplayTime_on_MouseOver =         1          ,// Sie können die Anzeigezeit (Sekunden) festlegen, wann die zweite und die 
                                                             // folgenden Zeilen beim Mouseover angezeigt werden. Das Display zeigt den  
                                                             // eingestellten Wert(Sekunden) an und kehrt dann zur ersten Zeile zurück.
                                                             // Position der Tab-Leiste.
       TabBar_Position =                         1          ,// [0] = Standard
                                                             // 1   = unter der Symbolleiste
                                                             // 2   = unter dem Fenster
                                                             // Positionen der Tab-Leiste und der Lesezeichen-Symbolleiste tauschen.
                                                             // sofern die Position der Tab-Leiste unterhalb der Symbolleiste festgelegt ist.
                                                             // Voraussetzung: "TabBar_Position" auf "1".
       Bookmark_Toolbar_Position =             true         ,// [true] = Menüleiste, Navigationsleiste, Lesezeichenleiste, Tableiste
                                                             // false = Menüleiste, Navigationsleiste, Tableiste, Lesezeichensymbolleiste
                                                             // Tab-Höhe „UI-Dichte“
       UI_Density_Compact =                    29           ,// Standard = 29 Pixelbei Kompakt
       UI_Density_Normal =                     36           ,// Standard = 36 Pixel bei Normal
       UI_Density_Touch =                      41           ,// Standard = 41 Pixel bei Touch
                                                             // Tab-Breite
       Tab_Min_Width =                         35           ,// Standard - Mindestwert = 76px
       Tab_Max_Width =                        170           ,// Standard - Maxwert = 225px
                                                             // Bei gleichen Werten bei Min und Max, wird die Tabbreite fixiert!
                                                             // „Tab schließen“ Schaltfläche
       Tab_Close_Button =                       2           ,// [0] = Standard
                                                             //  1  = Ausgeblendet
                                                             //  2  = Auf allen Tabs anzeigen
                                                             //  3  = Nur bei Mausberührung anzeigen
                                                             //  4  = Aktive Tabs werden immer angezeigt, inaktive Tabs
                                                             // werden beim Mouseover angezeigt. *Standard für vertikalen Tab-Modus.
                                                             // ProtonUI Erscheinungsbild der Tabs ändern
       Proton_Margins =                      true           ,// [true] = Darstellung ProtonUI
                                                             // Die Höhe der Tab-Leiste entspricht der Höhe der UI-Dichte plus dem Leerraum darüber
                                                             // und darunter.                                                 
                                                             // false  = Darstellung wie bei browser.proton.enabled auf false, was man vor Firefox 90
                                                             // noch einstellen konnte.
                                                             // Wenn der Leerraum um die Tabs auf 0 und die Höhe auf die UI-Dichte eingestellt
                                                             // ist, ist sie 4 Pixel breiter und 8 Pixel niedriger als die Standardeinstellung.
                                     
                                                             // Ränder auf der linken und rechten Seite der Tabs
       Tab_Separators  =                     false          ,// [false] = Nicht anzeigen
                                                             // true    = Anzeigen
                                                             // Rahmen CSS wurde extrahiert und angepasst, an Aussehen wie bei browser.proton.enabled
                                                             // auf false, was man vor Firefox 90 noch einstellen konnte.
                                        
                                                             // Voraussetzung: „TabBar_Position“ auf „0“ setzen.
       TitleBar_Button_Autohide =            false          ,// [false] = Aktiviert
                                                             // true    = Deaktiviert
            
                                                             // Äußeren Rahmen der Titelleistenschaltfläche [-□×] reduzieren und transparent machen.
       TitleBar_Button_DisplayTime =          0.6           ,// Dauer der Anzeige in Sekunden, nach der Rückkehr zur Originalgröße und dem Aufheben
                                                             // der Transparenz per Mouseover angeben.
                                                             // Tab-Leiste von Anfang an auf die angegebene Höhe einstellen.
                                                             // Voraussetzung: „MultiRowTab_OnOff_and_TabBar_Rows“ auf „2“ oder höher setzen.
       Set_the_TabBar_to_the_Specified_Height =  false      ,// [false] = Die Tab-Leiste wird höher, wenn der nächsten Zeile weitere Tabs hinzugefügt werden.
                                                             //  true   = Verwendung: Die Tab-Leiste wird von Anfang an auf die angegebene Höhe eingestellt
                                                             // „.tabDropIndicator“, der beim Ziehen und Ablegen eines Tabs angezeigt wird, ersetzen.
                                                             // Voraussetzung: „MultiRowTab_OnOff_and_TabBar_Rows“ auf einen anderen Wert als „0“ setzen.
       Tab_Drop_Indicator =                  false          ,// [false] = Stecknadel Symbol 📍
                                                             // true    = Rote Linie (2px × 29px) als Symbol
                                                             // Position der angepinnten Tabs
                                                             // Voraussetzung: „MultiRowTab_OnOff_and_TabBar_Rows“ auf einen Wert ungleich „0“ setzen.
       Separate_Tabs_and_PinnedTabs =        false          ,// [false] = Standard
                                                             // true    = Angeheftete Tabs von der Tab-Leiste lösen und in die darüber liegende 
                                                             // Zeile verschieben. Breite der angehefteten Tabs für die Position der 
                                                             // angehefteten Tabs „true“ anpassen.
       PinnedTab_Width =                     false          ,// [false] = Kein Standard
                                                             //  true   = Breite angehefteter Tabs anpassen, z. B. „Tab-Breite“.
       PinnedTab_Min_Width =                    76          ,// Standard Mindestbreite =  76 Pixel
       PinnedTab_Max_Width =                   225          ,// Standard Maximalbreite = 225 Pixel
                                                             // Bei gleichen Werten ist die Breite fixiert.
                                                             // Angeheftete Tab, Schließen Schaltfläche
                                                             // Voraussetzung: „Separate_Tabs_and_PinnedTabs“ auf „true“ setzen.
       PinnedTab_Close_Button =                  0          ,// [0] = Standard
                                                             //  1  = auf allen Tabs sichtbar
                                                             //  2  = auf Tab bei Mouseover anzeigen
                                                             //  3  = Aktiver Tab immer sichtbar, inaktiver Tab bei Mouseover sichtbar 
                                                             // *Standard für vertikalen Tab-Modus.
                                                             // Tab-Leisten-Ziehbereich
       Left_Drag_Area =                          0          ,// Linker Ziehbereich Breite: Standard 40 Pixel
       Right_Drag_Area =                         0          ,// Rechter Ziehbereich Breite: Standard 40 Pixel
       Maximize_Left_Drag_Area =             false          ,// true = Linken Ziehbereich bei maximiertem Fenster anzeigen. Standard ausgeblendet.
       Fullscreen_Drag_Area =                false          ,// true = Linken und rechten Ziehbereich bei Vollbild anzeigen. Standard ausgeblendet.
                                                             // Wenn die Titelleiste angezeigt wird, funktioniert sie nicht als Drag-Bereich, selbst
                                                             // wenn „.titlebar-spacer“ angezeigt wird. Daher habe ich dafür gesorgt, dass sie nichts bewirkt.
       // -- Config Ende --
       css = `
       #TabsToolbar:not([collapsed="true"]) {
         :root[uidensity="compact"] & {
           --tab-min-height: ${UI_Density_Compact}px;
         }
         :root:not([uidensity]) & {
           --tab-min-height: ${UI_Density_Normal}px;
         }
         :root[uidensity="touch"] & {
           --tab-min-height: ${UI_Density_Touch}px;
         }
         #tabbrowser-tabs {
           min-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);
           ${MultiRowTab_OnOff_and_TabBar_Rows != 0 ? `
             &[overflow] {
               padding-inline: 0 !important;
               & > #tabbrowser-arrowscrollbox {
                 & > .tabbrowser-tab[pinned] {
                   display: flex;
                   margin-inline-start: 0 !important;
                   position: static !important;
                 }
                 &::part(scrollbox) {
                   padding-inline: 0;
                 }
               }
               & + #new-tab-button {
                 display: none;
               }
             }
             ${Tab_Drop_Indicator ? `
               & > .tab-drop-indicator {
                 background: url(
                   data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAdCAIAAAAPVCo9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY3growJEQ5+SUQEAOb1EM8kwskcAAAAASUVORK5CYII=
                 ) no-repeat center;
               }
             ` : ``}
             #tabbrowser-arrowscrollbox {
               &::part(scrollbox) {
                 & > slot {
                   flex-wrap: wrap;
                 }
                 ${MultiRowTab_OnOff_and_TabBar_Rows != -1 ? `
                   ${MultiRowTab_OnOff_and_TabBar_Rows == 1 ? `
                     ${TabBar_Rows_on_MouseOver == 0 || TabBar_Rows_on_MouseOver == 1 ? `
                       max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * 2);
                     ` : `
                       max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${TabBar_Rows_on_MouseOver});
                     `}
                     &:not(:hover) {
                       max-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) !important;
                       ${Proton_Margins ? `scrollbar-width: none;` : ``}
                       transition: all 0s ease-in-out ${TabBar_DisplayTime_on_MouseOver}s;
                     }
                   ` : `
                     ${Set_the_TabBar_to_the_Specified_Height ? `
                       min-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${MultiRowTab_OnOff_and_TabBar_Rows});
                       & > slot {
                         max-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);
                       }
                     ` : `
                       max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${MultiRowTab_OnOff_and_TabBar_Rows});
                     `}
                   `}
                   overflow: hidden auto;
                   & scrollbar {
                     -moz-window-dragging: no-drag;
                   }
                 ` : ``}
               }
               &::part(overflow-start-indicator),
               &::part(overflow-end-indicator),
               &::part(scrollbutton-up),
               &::part(scrollbutton-down) {
                 display: none;
               }
               ${Separate_Tabs_and_PinnedTabs ? `
                 &:has(> .tabbrowser-tab[fadein][pinned]) {
                   &::part(scrollbox) {
                     & > slot::after {
                       display: flow-root list-item;
                       content: "";
                       flex-basis: -moz-available;
                       height: 0;
                       overflow: hidden;
                     }
                   }
                 }
                 .tabbrowser-tab[fadein] {
                   &:not([pinned]) {
                     #tabbrowser-tabs[haspinnedtabs] & {
                       &, & + :not(#tabs-newtab-button) {
                         order: 1;
                       }
                     }
                   }
                   &[pinned] {
                     .tab-background:after {
                       content: "📌";
                       font-size: 11px;
                       right: -2px;
                       position: absolute;
                       top: -2px;
                     }
                     ${PinnedTab_Width ? `
                       flex: 100 100;
                       max-width: ${PinnedTab_Max_Width}px;
                       min-width: ${PinnedTab_Min_Width}px;
                       .tab-throbber, .tab-icon-pending, .tab-icon-image, .tab-sharing-icon-overlay, .tab-icon-overlay {
                         margin-inline-end: 5.5px !important;
                       }
                       ${PinnedTab_Close_Button == 1 ? `
                         .tab-close-button {
                           display: flex;
                         }
                       ` : PinnedTab_Close_Button == 2 ? `
                         .tab-close-button {
                           display: none;
                         }
                         &:hover .tab-close-button {
                           display: flex;
                         }
                       ` : PinnedTab_Close_Button == 3 ? `
                         &:not([selected]):hover,
                         &[selected] {
                           .tab-close-button {
                             display: flex;
                           }
                         }
                       ` : ``}
                     ` : ``}
                   }
                 }
               ` : ``}
               #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]):not([orient="vertical"]) > & {
                 &  > .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) {
                   margin-inline-start: 0 !important;
                 }
               }
             }
           ` : ``}
         }
         .tabbrowser-tab[fadein]:not([pinned]) {
           max-width: ${Tab_Max_Width}px;
           min-width: ${Tab_Min_Width}px;
           ${Tab_Close_Button == 1 ? `
             .tab-close-button {
               display: none;
             }
           ` : Tab_Close_Button == 2 ? `
             .tab-close-button {
               display: flex;
             }
           ` : Tab_Close_Button == 3 ? `
             .tab-close-button {
               display: none;
             }
             &:hover .tab-close-button {
               display: flex;
             }
           ` : Tab_Close_Button == 4 ? `
             &:not([selected]):hover {
               .tab-close-button {
                 display: flex;
               }
             }
           ` : ``}
         }
         ${Tab_Separators ? `
           .titlebar-spacer[type="pre-tabs"] {
             border-inline-end: 1px solid color-mix(in srgb, currentColor 20%, transparent);
           }
           .tabbrowser-tab {
             &::after,
             &::before {
               border-left: 1px solid color-mix(in srgb, currentColor 50%, transparent);
               height: calc(var(--tab-min-height) - 15%);
               margin-block: auto;
             }
             &:hover::after,
             &[multiselected]::after,
             #tabbrowser-tabs:not([movingtab]) &:has(+ .tabbrowser-tab:hover)::after,
             #tabbrowser-tabs:not([movingtab]) &:has(+ [multiselected])::after {
               height: 100%;
             }
             &::after,
             #tabbrowser-tabs[movingtab] &[visuallyselected]::before {
               display: flex;
               content: "";
             }
           }
         ` : ``}
         ${Proton_Margins ? `` : `
           .tabbrowser-tab,
           .toolbarbutton-1 {
             padding: 0;
           }
           .tabbrowser-tab,
           #tabs-newtab-button {
             height: var(--tab-min-height);
           }
           .tabbrowser-tab {
             .tab-background {
               box-shadow: none;
               margin-block: 0;
             }
             .tab-label-container {
               height: var(--tab-min-height);
               max-height: 24px;
             }
             .tab-close-button {
               height: 20px !important;
               padding-block: 3px !important;
             }
             &[usercontextid] > .tab-stack > .tab-background > .tab-context-line {
               margin-block-start: 1px !important;
             }
           }
         `}
       ${TabBar_Position == 0 ? `
         .titlebar-buttonbox-container {
           height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);
         }
         ${TitleBar_Button_Autohide ? `
           & > .titlebar-buttonbox-container {
             background-color: color-mix(in srgb, currentColor 20%, transparent);
             position: fixed;
             right: 0;
             &:not(:hover) {
               height: 6px;
               .titlebar-button {
                 padding: 0;
               }
               &,& .titlebar-button {
                 opacity: 0;
                 transition: all 0s ease-in-out ${TitleBar_Button_DisplayTime}s;
               }
             }
           }
         ` : ``}
       }` : `
         ${TabBar_Position == 1 || TabBar_Position == 2 ? `
           & > .titlebar-buttonbox-container {
               display: none;
           }}
           #nav-bar {
             &:not(.browser-titlebar) {
               :root[customtitlebar] #toolbar-menubar[autohide="true"] ~ &,
               :root[inFullscreen] #toolbar-menubar ~ & {
                 & > .titlebar-buttonbox-container {
                   display: flex;
                 }
               }
             }
             .titlebar-button {
               padding-block: 0;
             }
           }
         ` : ``}
         body:has(> #navigator-toolbox:not([tabs-hidden])) {
           ${TabBar_Position == 1 ? `
             script, toolbar:not(#TabsToolbar ${Bookmark_Toolbar_Position ? `` : `, #PersonalToolbar`}) {
               order: -1;
             }
           ` : TabBar_Position == 2 ? `
             & > #fullscr-toggler[hidden] + tabbox,
             :root[inFullscreen] & > tabbox:hover {
               border-top: 0.01px solid var(--chrome-content-separator-color);
             }
             & > tabbox > #navigator-toolbox {
               border-block: none !important;
             }
             :root[inFullscreen] & {
               & > #navigator-toolbox {
                 transition: none;
                 &:has(~ tabbox:hover) {
                   margin-top: 0 !important;
                 }
                 &:hover ~ tabbox > #navigator-toolbox {
                   display: flex;
                 }
               }
               & > tabbox:not(:hover) {
                 border-top: 0.01px solid transparent;
                 & > #navigator-toolbox {
                   display: none;
                 }
               }
             }
           ` : ``}
         }
       `}
       toolbar[id$="bar"].browser-titlebar {
         .titlebar-spacer {
           &[type="pre-tabs"] {
             width: ${Left_Drag_Area}px;
           }
           &[type="post-tabs"] {
             width: ${Right_Drag_Area}px;
           }
           ${Maximize_Left_Drag_Area ? `
             :root[customtitlebar]:not([sizemode="normal"], [inFullscreen]) &[type="pre-tabs"] {
               display: flex;
             }
           ` : ``}
           ${Fullscreen_Drag_Area ? `
             :root[customtitlebar][inFullscreen] & {
               display: flex;
             }
           ` : ``}
         }
         #navigator-toolbox[tabs-hidden] & {
           #new-tab-button {
             display: none;
           }
         }
       }
       `,
       sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
       uri = Services.io.newURI("data:text/css;charset=UTF=8," + encodeURIComponent(css));
       ["0", "2", "dragend", "SSTabRestored", "TabAttrModified"].find(eventType => {
         if(!sss.sheetRegistered(uri, eventType)) sss.loadAndRegisterSheet(uri, eventType);
         if (MultiRowTab_OnOff_and_TabBar_Rows > 0) {
           gBrowser.tabContainer.addEventListener(eventType, (e) => {
             e.target.scrollIntoView({ behavior: "instant", block: "nearest" })
           })
         }
       })
       if (TabBar_Position == 2) {
         document.body.appendChild(
           document.createXULElement("tabbox")
         ).appendChild(
           document.importNode(document.getElementById("navigator-toolbox"))
         ).appendChild(
           document.adoptNode(document.getElementById("TabsToolbar"))
         )
       }
       gBrowser.tabContainer._getDropIndex = function(event) {
           let tabToDropAt = getTabFromEventTarget(event, false);
           const tabPos = gBrowser.tabContainer.getIndexOfItem(tabToDropAt);
           if (window.getComputedStyle(this).direction == "ltr") {
               let rect = tabToDropAt.getBoundingClientRect();
               if (event.clientX < rect.x + rect.width / 2)
                   return tabPos;
               else 
                   return tabPos + 1;
               
           } else {
               let rect = tabToDropAt.getBoundingClientRect();
               if (event.clientX > rect.x + rect.width / 2)
                   return tabPos;
               else
                   return tabPos + 1;
           }
       };
       // We set this to check if the listeners were added before
       let listenersActive = false;
       // This sets when to apply the fix (by default a new row starts after the 23th open tab, unless you changed the min-size of tabs)
       gBrowser.tabContainer.addEventListener("dragstart", () => {
           // Multiple tab select fix
           gBrowser.visibleTabs.forEach(t => t.style.transform = "");
           // Event handling
           if (!listenersActive) {
               gBrowser.tabContainer.getDropEffectForTabDrag = function(){};
               gBrowser.tabContainer._getDropEffectForTabDrag = function(){};
               gBrowser.tabContainer.on_dragover = (dragoverEvent) => performTabDragOver(dragoverEvent);
               gBrowser.tabContainer._onDragOver = (dragoverEvent) => performTabDragOver(dragoverEvent);
               gBrowser.tabContainer.ondrop = (dropEvent) => performTabDropEvent(dropEvent);
               listenersActive = true;
           }
       });
    }
    var lastKnownIndex = null;
    var lastGroupStart = null;
    var lastGroupEnd = null;
    /**
    * Gets the tab from the event target.
    * @param {*} event The event.
    * @returns The tab if it was part of the target or its parents, otherwise null
    */
    function getTabFromEventTarget(event, { ignoreTabSides = false } = {}) {
       let { target } = event;
       if (target.nodeType != Node.ELEMENT_NODE) {
           target = target.parentElement;
       }
       let tab = target?.closest("tab") || target?.closest("tab-group");
       const selectedTab = gBrowser.selectedTab;
       if (tab && ignoreTabSides) {
           let { width, height } = tab.getBoundingClientRect();
           if (
               event.screenX < tab.screenX + width * 0.25 ||
               event.screenX > tab.screenX + width * 0.75 ||
               ((event.screenY < tab.screenY + height * 0.25 ||
                   event.screenY > tab.screenY + height * 0.75) &&
                   gBrowser.tabContainer.verticalMode)
           ) {
               return selectedTab;
           }
       }
       if (!tab) {
           return selectedTab;
       }
       return tab;
    }
    /**
    * Performs the tab drag over event.
    * @param {*} event The drag over event.
    */
    function performTabDragOver(event) {
       event.preventDefault();
       event.stopPropagation();
       let ind = gBrowser.tabContainer._tabDropIndicator;
       let effects = orig_getDropEffectForTabDrag(event);
       let tab;
       if (effects == "link") {
           tab = getTabFromEventTarget(event, true);
           if (tab) {
               if (!gBrowser.tabContainer._dragTime)
                   gBrowser.tabContainer._dragTime = Date.now();
               if (!tab.hasAttribute("pendingicon") && // annoying fix
                   Date.now() >= gBrowser.tabContainer._dragTime + gBrowser.tabContainer._dragOverDelay)
                   gBrowser.tabContainer.selectedItem = tab;
               ind.hidden = true;
               return;
           }
       }
       if (!tab) {
           tab = getTabFromEventTarget(event, false);
       }
       
       let newIndex = gBrowser.tabContainer._getDropIndex(event);
       if (newIndex == null)
           return;
       // Update the last known index and group position
       lastKnownIndex = newIndex;
       
       if (tab.nodeName == "tab-group" && !lastGroupStart) {
           lastGroupStart = tab.querySelector("tab:first-of-type")._tPos;
           lastGroupEnd = tab.querySelector("tab:last-of-type")._tPos;
       }
       let tabs = document.querySelectorAll("tab");
       let ltr = (window.getComputedStyle(gBrowser.tabContainer).direction == "ltr");
       let rect = gBrowser.tabContainer.arrowScrollbox.getBoundingClientRect();
       let newMarginX, newMarginY;
       if (newIndex == tabs.length) {
           let tabRect = tabs[newIndex - 1].getBoundingClientRect();
           if (ltr)
               newMarginX = tabRect.right - rect.left;
           else
               newMarginX = rect.right - tabRect.left;
           newMarginY = tabRect.top + tabRect.height - rect.top - rect.height; // multirow fix
           if (CSS.supports("offset-anchor", "left bottom")) // Compatibility fix for FF72+
               newMarginY += rect.height / 2 - tabRect.height / 2;
           
       } else if (newIndex != null || newIndex != 0) {
           let tabRect = tabs[newIndex].getBoundingClientRect();
           if (ltr)
               newMarginX = tabRect.left - rect.left;
           else
               newMarginX = rect.right - tabRect.right;
           newMarginY = tabRect.top + tabRect.height - rect.top - rect.height; // multirow fix
           if (CSS.supports("offset-anchor", "left bottom")) // Compatibility fix for FF72+
               newMarginY += rect.height / 2 - tabRect.height / 2;
       }
       newMarginX += ind.clientWidth / 2;
       if (!ltr)
           newMarginX *= -1;
       ind.hidden = false;
       ind.style.transform = "translate(" + Math.round(newMarginX) + "px," + Math.round(newMarginY) + "px)"; // multirow fix
       ind.style.marginInlineStart = (-ind.clientWidth) + "px";
    }
    /**
    * Performs the tab drop event.
    * @param {*} event The drop event.
    */
    function performTabDropEvent(event) {
       let newIndex;
       let dt = event.dataTransfer;
       let dropEffect = dt.dropEffect;
       let draggedTab;
       if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
           draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
           if (!draggedTab) {
               return;
           }
       }
       if (draggedTab && dropEffect != "copy" && draggedTab.container == gBrowser.tabContainer) {
           newIndex = gBrowser.tabContainer._getDropIndex(event);
           /* fix for moving multiple selected tabs and tab groups */
           let selectedTabs = gBrowser.selectedTabs;
           if (lastGroupStart) {
               selectedTabs = [draggedTab?.closest("tab-group")];
               if (lastKnownIndex >= lastGroupStart && lastKnownIndex <= lastGroupEnd) {
                   newIndex = lastGroupStart;
               } else if (lastKnownIndex == lastGroupEnd + 1) {
                   newIndex = lastGroupStart + 1;
               }
           }
           if (selectedTabs[selectedTabs.length - 1] == null){
               newIndex = lastKnownIndex;
           } else if (newIndex > selectedTabs[selectedTabs.length - 1]._tPos + 1)
               newIndex--;
           else if (newIndex >= selectedTabs[0]._tPos)
               newIndex = -1;
           if (newIndex == -1) {
               newIndex = lastKnownIndex;
           }
           
           const tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex);
           console.log("tabToMoveAt", tabToMoveAt);
           console.log("newIndex", newIndex);
           selectedTabs.forEach(t => gBrowser.moveTabBefore(t, tabToMoveAt));
           // Restart global vars
           lastKnownIndex = null;
           lastGroupStart = null;
           lastGroupEnd = null;
       }
    }
    // copy of the original and overrided _getDropEffectForTabDrag method
    function orig_getDropEffectForTabDrag(event) {
       let dt = event.dataTransfer;
       let isMovingTabs = dt.mozItemCount > 0;
       for (let i = 0; i < dt.mozItemCount; i++) {
           // tabs are always added as the first type
           let types = dt.mozTypesAt(0);
           if (types[0] != TAB_DROP_TYPE) {
               isMovingTabs = false;
               break;
           }
       }
       if (isMovingTabs) {
           let sourceNode = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
           if (XULElement.isInstance(sourceNode) &&
               sourceNode.localName == "tab" &&
               sourceNode.ownerGlobal.isChromeWindow &&
               sourceNode.ownerDocument.documentElement.getAttribute("windowtype") ==
               "navigator:browser" &&
               sourceNode.ownerGlobal.gBrowser.tabContainer == sourceNode.container) {
               // Do not allow transfering a private tab to a non-private window
               // and vice versa.
               if (PrivateBrowsingUtils.isWindowPrivate(window) !=
                   PrivateBrowsingUtils.isWindowPrivate(sourceNode.ownerGlobal))
                   return "none";
           
               if (window.gMultiProcessBrowser !=
                   sourceNode.ownerGlobal.gMultiProcessBrowser)
                   return "none";
           
               if (window.gFissionBrowser != sourceNode.ownerGlobal.gFissionBrowser)
                   return "none";
           
               return dt.dropEffect == "copy" ? "copy" : "move";
           }
       }
       if (Services.droppedLinkHandler.canDropLink(event, true)) 
           return "link";
       return "none";
    }
    Alles anzeigen

    <========== soll so aussehen am Ende

    <============== sieht aktuell leider so aus

    ----------------------------------------
    ich bin ein TAB falsch Design
    -----------------------------------------

    0% Abstand über dem TAB und 0% Abstand unter dem TAB bitte bitte


  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 1. Mai 2025 um 22:16
    Zitat von 2002Andreas
    Zitat von GermanFreme82

    der Abstand der TAB ist nach oben und unten und die Breite kleiner machen

    Sollte im Skript machbar sein:

    Hier die Werte für deine Wünsche anpassen.

    Zitat von GermanFreme82

    Wow das sieht richtig cool aus vielen DANK !!

    Gern geschehen:)

    Alles anzeigen

    Wo finde ich die Werte im alten Script damit ich die übernehmen kann sonst muss ich raten


    170px lang und 35px hoch gefunden
    Tab_Close_Button = 2

    blue <= entfernt
    red <= entfernt

    Jetzt bruahc ich nur noch den Abstand der TAB der soll 0 sein oben und unten 0 un zueinender bitte 5px.


    mein aktuelles Script von "MultiRowTabLiteforFx.uc.js"


    Spoiler anzeigen

    // ==UserScript==
    // Name MultiRowTabLiteforFx.uc.js
    // Namespace Based on Alice0775's zzzz-MultiRowTab_LiteforFx48.uc.js
    // @description Mehrzeilige Tableiste - Experimentelle CSS Version
    // @include main
    // @compatibility Firefox 138+
    // @version 2025/04/07 12:00
    // ==/UserScript==
    "use strict";

    MultiRowTabLiteforFx();
    function MultiRowTabLiteforFx() {
    if (!window.gBrowser) { return; }

    // -- Config --
    // Vergleichbarer CSS Code in userChrome.css Datei wird vorrangig behandelt!

    const // Mehrzeilige Tableiste Ein/Aus Anzahl der Tabzeilen
    MultiRowTab_OnOff_and_TabBar_Rows = -1 ,// [-1] = Mehrzeilige Tableiste aktiv unbegrenzte Anzahl von Zeilen.
    // 0 = Mehrzeilige Tableiste aus.
    // 1 = Mehrzeilige Tableiste aktiv. Standard = 1 Zeile. Bei Berührung
    // der Tableiste mit der der Maus, werden die zweite und die folgenden
    // Zeilen bis zur angegebenen Anzahl von Zeilen angezeigt.
    // 2 = Mehrzeilige Tableiste aktiv. Anzahl der Tabzeilen angeben.
            
    TabBar_Rows_on_MouseOver = 3 ,// Standard = 1 Zeile. Anzahl der Zeilen angeben, die angezeigt werden sollen,
    // wenn der Mauszeiger über die Tableiste bewegt wird. Voraussetzung:
    // „MultiRowTab_OnOff_and_TabBar_Rows“ auf „1“ setzen.
            
    TabBar_DisplayTime_on_MouseOver = 1 ,// Sie können die Anzeigezeit (Sekunden) festlegen, wann die zweite und die
    // folgenden Zeilen beim Mouseover angezeigt werden. Das Display zeigt den
    // eingestellten Wert(Sekunden) an und kehrt dann zur ersten Zeile zurück.

    // Position der Tab-Leiste.
    TabBar_Position = 1 ,// [0] = Standard
    // 1 = unter der Symbolleiste
    // 2 = unter dem Fenster

    // Positionen der Tab-Leiste und der Lesezeichen-Symbolleiste tauschen.
    // sofern die Position der Tab-Leiste unterhalb der Symbolleiste festgelegt ist.
    // Voraussetzung: "TabBar_Position" auf "1".
    Bookmark_Toolbar_Position = true ,// [true] = Menüleiste, Navigationsleiste, Lesezeichenleiste, Tableiste
    // false = Menüleiste, Navigationsleiste, Tableiste, Lesezeichensymbolleiste

    // Tab-Höhe „UI-Dichte“
    UI_Density_Compact = 29 ,// Standard = 29 Pixelbei Kompakt
    UI_Density_Normal = 36 ,// Standard = 36 Pixel bei Normal
    UI_Density_Touch = 41 ,// Standard = 41 Pixel bei Touch

    // Tab-Breite
    Tab_Min_Width = 35 ,// Standard - Mindestwert = 76px
    Tab_Max_Width = 170 ,// Standard - Maxwert = 225px
    // Bei gleichen Werten bei Min und Max, wird die Tabbreite fixiert!

    // „Tab schließen“ Schaltfläche
    Tab_Close_Button = 2 ,// [0] = Standard
    // 1 = Ausgeblendet
    // 2 = Auf allen Tabs anzeigen
    // 3 = Nur bei Mausberührung anzeigen
    // 4 = Aktive Tabs werden immer angezeigt, inaktive Tabs
    // werden beim Mouseover angezeigt. *Standard für vertikalen Tab-Modus.

    // ProtonUI Erscheinungsbild der Tabs ändern
    Proton_Margins = true ,// [true] = Darstellung ProtonUI
    // Die Höhe der Tab-Leiste entspricht der Höhe der UI-Dichte plus dem Leerraum darüber
    // und darunter.
    // false = Darstellung wie bei browser.proton.enabled auf false, was man vor Firefox 90
    // noch einstellen konnte.
    // Wenn der Leerraum um die Tabs auf 0 und die Höhe auf die UI-Dichte eingestellt
    // ist, ist sie 4 Pixel breiter und 8 Pixel niedriger als die Standardeinstellung.
                                     
    // Ränder auf der linken und rechten Seite der Tabs
    Tab_Separators = false ,// [false] = Nicht anzeigen
    // true = Anzeigen
    // Rahmen CSS wurde extrahiert und angepasst, an Aussehen wie bei browser.proton.enabled
    // auf false, was man vor Firefox 90 noch einstellen konnte.
                                        
    // Voraussetzung: „TabBar_Position“ auf „0“ setzen.
    TitleBar_Button_Autohide = false ,// [false] = Aktiviert
    // true = Deaktiviert
            
    // Äußeren Rahmen der Titelleistenschaltfläche [-□×] reduzieren und transparent machen.
    TitleBar_Button_DisplayTime = 0.6 ,// Dauer der Anzeige in Sekunden, nach der Rückkehr zur Originalgröße und dem Aufheben
    // der Transparenz per Mouseover angeben.

    // Tab-Leiste von Anfang an auf die angegebene Höhe einstellen.
    // Voraussetzung: „MultiRowTab_OnOff_and_TabBar_Rows“ auf „2“ oder höher setzen.
    Set_the_TabBar_to_the_Specified_Height = false ,// [false] = Die Tab-Leiste wird höher, wenn der nächsten Zeile weitere Tabs hinzugefügt werden.
    // true = Verwendung: Die Tab-Leiste wird von Anfang an auf die angegebene Höhe eingestellt

    // „.tabDropIndicator“, der beim Ziehen und Ablegen eines Tabs angezeigt wird, ersetzen.
    // Voraussetzung: „MultiRowTab_OnOff_and_TabBar_Rows“ auf einen anderen Wert als „0“ setzen.
    Tab_Drop_Indicator = false ,// [false] = Stecknadel Symbol 📍
    // true = Rote Linie (2px × 29px) als Symbol

    // Position der angepinnten Tabs
    // Voraussetzung: „MultiRowTab_OnOff_and_TabBar_Rows“ auf einen Wert ungleich „0“ setzen.
    Separate_Tabs_and_PinnedTabs = false ,// [false] = Standard
    // true = Angeheftete Tabs von der Tab-Leiste lösen und in die darüber liegende
    // Zeile verschieben. Breite der angehefteten Tabs für die Position der
    // angehefteten Tabs „true“ anpassen.

    PinnedTab_Width = false ,// [false] = Kein Standard
    // true = Breite angehefteter Tabs anpassen, z. B. „Tab-Breite“.

    PinnedTab_Min_Width = 76 ,// Standard Mindestbreite = 76 Pixel
    PinnedTab_Max_Width = 225 ,// Standard Maximalbreite = 225 Pixel
    // Bei gleichen Werten ist die Breite fixiert.

    // Angeheftete Tab, Schließen Schaltfläche
    // Voraussetzung: „Separate_Tabs_and_PinnedTabs“ auf „true“ setzen.
    PinnedTab_Close_Button = 0 ,// [0] = Standard
    // 1 = auf allen Tabs sichtbar
    // 2 = auf Tab bei Mouseover anzeigen
    // 3 = Aktiver Tab immer sichtbar, inaktiver Tab bei Mouseover sichtbar
    // *Standard für vertikalen Tab-Modus.

    // Tab-Leisten-Ziehbereich
    Left_Drag_Area = 0 ,// Linker Ziehbereich Breite: Standard 40 Pixel
    Right_Drag_Area = 0 ,// Rechter Ziehbereich Breite: Standard 40 Pixel
    Maximize_Left_Drag_Area = false ,// true = Linken Ziehbereich bei maximiertem Fenster anzeigen. Standard ausgeblendet.
    Fullscreen_Drag_Area = false ,// true = Linken und rechten Ziehbereich bei Vollbild anzeigen. Standard ausgeblendet.
    // Wenn die Titelleiste angezeigt wird, funktioniert sie nicht als Drag-Bereich, selbst
    // wenn „.titlebar-spacer“ angezeigt wird. Daher habe ich dafür gesorgt, dass sie nichts bewirkt.
    // -- Config Ende --

    css = `

    #TabsToolbar:not([collapsed="true"]) {

    :root[uidensity="compact"] & {
    --tab-min-height: ${UI_Density_Compact}px;
    }
    :root:not([uidensity]) & {
    --tab-min-height: ${UI_Density_Normal}px;
    }
    :root[uidensity="touch"] & {
    --tab-min-height: ${UI_Density_Touch}px;
    }

    #tabbrowser-tabs {
    min-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);

    ${MultiRowTab_OnOff_and_TabBar_Rows != 0 ? `
    &[overflow] {
    padding-inline: 0 !important;
    & > #tabbrowser-arrowscrollbox {
    & > .tabbrowser-tab[pinned] {
    display: flex;
    margin-inline-start: 0 !important;
    position: static !important;
    }
    &::part(scrollbox) {
    padding-inline: 0;
    }
    }
    & + #new-tab-button {
    display: none;
    }
    }

    ${Tab_Drop_Indicator ? `
    & > .tab-drop-indicator {
    background: url(
    data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAdCAIAAAAPVCo9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY3growJEQ5+SUQEAOb1EM8kwskcAAAAASUVORK5CYII=
    ) no-repeat center;
    }
    ` : ``}

    #tabbrowser-arrowscrollbox {
    &::part(scrollbox) {
    & > slot {
    flex-wrap: wrap;
    }

    ${MultiRowTab_OnOff_and_TabBar_Rows != -1 ? `
    ${MultiRowTab_OnOff_and_TabBar_Rows == 1 ? `
    ${TabBar_Rows_on_MouseOver == 0 || TabBar_Rows_on_MouseOver == 1 ? `
    max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * 2);
    ` : `
    max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${TabBar_Rows_on_MouseOver});
    `}
    &:not(:hover) {
    max-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) !important;
    ${Proton_Margins ? `scrollbar-width: none;` : ``}
    transition: all 0s ease-in-out ${TabBar_DisplayTime_on_MouseOver}s;
    }
    ` : `
    ${Set_the_TabBar_to_the_Specified_Height ? `
    min-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${MultiRowTab_OnOff_and_TabBar_Rows});
    & > slot {
    max-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);
    }
    ` : `
    max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${MultiRowTab_OnOff_and_TabBar_Rows});
    `}
    `}

    overflow: hidden auto;
    & scrollbar {
    -moz-window-dragging: no-drag;
    }
    ` : ``}

    }
    &::part(overflow-start-indicator),
    &::part(overflow-end-indicator),
    &::part(scrollbutton-up),
    &::part(scrollbutton-down) {
    display: none;
    }

    ${Separate_Tabs_and_PinnedTabs ? `
    &:has(> .tabbrowser-tab[fadein][pinned]) {
    &::part(scrollbox) {
    & > slot::after {
    display: flow-root list-item;
    content: "";
    flex-basis: -moz-available;
    height: 0;
    overflow: hidden;
    }
    }
    }
    .tabbrowser-tab[fadein] {
    &:not([pinned]) {
    #tabbrowser-tabs[haspinnedtabs] & {
    &, & + :not(#tabs-newtab-button) {
    order: 1;
    }
    }
    }
    &[pinned] {
    .tab-background:after {
    content: "📌";
    font-size: 11px;
    right: -2px;
    position: absolute;
    top: -2px;
    }

    ${PinnedTab_Width ? `
    flex: 100 100;
    max-width: ${PinnedTab_Max_Width}px;
    min-width: ${PinnedTab_Min_Width}px;
    .tab-throbber, .tab-icon-pending, .tab-icon-image, .tab-sharing-icon-overlay, .tab-icon-overlay {
    margin-inline-end: 5.5px !important;
    }

    ${PinnedTab_Close_Button == 1 ? `
    .tab-close-button {
    display: flex;
    }
    ` : PinnedTab_Close_Button == 2 ? `
    .tab-close-button {
    display: none;
    }
    &:hover .tab-close-button {
    display: flex;
    }
    ` : PinnedTab_Close_Button == 3 ? `
    &:not([selected]):hover,
    &[selected] {
    .tab-close-button {
    display: flex;
    }
    }
    ` : ``}

    ` : ``}

    }
    }
    ` : ``}

    #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]):not([orient="vertical"]) > & {
    & > .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) {
    margin-inline-start: 0 !important;
    }
    }

    }
    ` : ``}
    }

    .tabbrowser-tab[fadein]:not([pinned]) {
    max-width: ${Tab_Max_Width}px;
    min-width: ${Tab_Min_Width}px;

    ${Tab_Close_Button == 1 ? `
    .tab-close-button {
    display: none;
    }
    ` : Tab_Close_Button == 2 ? `
    .tab-close-button {
    display: flex;
    }
    ` : Tab_Close_Button == 3 ? `
    .tab-close-button {
    display: none;
    }
    &:hover .tab-close-button {
    display: flex;
    }
    ` : Tab_Close_Button == 4 ? `
    &:not([selected]):hover {
    .tab-close-button {
    display: flex;
    }
    }
    ` : ``}

    }

    ${Tab_Separators ? `
    .titlebar-spacer[type="pre-tabs"] {
    border-inline-end: 1px solid color-mix(in srgb, currentColor 20%, transparent);
    }
    .tabbrowser-tab {
    &::after,
    &::before {
    border-left: 1px solid color-mix(in srgb, currentColor 50%, transparent);
    height: calc(var(--tab-min-height) - 15%);
    margin-block: auto;
    }
    &:hover::after,
    &[multiselected]::after,
    #tabbrowser-tabs:not([movingtab]) &:has(+ .tabbrowser-tab:hover)::after,
    #tabbrowser-tabs:not([movingtab]) &:has(+ [multiselected])::after {
    height: 100%;
    }
    &::after,
    #tabbrowser-tabs[movingtab] &[visuallyselected]::before {
    display: flex;
    content: "";
    }
    }
    ` : ``}

    ${Proton_Margins ? `` : `
    .tabbrowser-tab,
    .toolbarbutton-1 {
    padding: 0;
    }
    .tabbrowser-tab,
    #tabs-newtab-button {
    height: var(--tab-min-height);
    }
    .tabbrowser-tab {
    .tab-background {
    box-shadow: none;
    margin-block: 0;
    }
    .tab-label-container {
    height: var(--tab-min-height);
    max-height: 24px;
    }
    .tab-close-button {
    height: 20px !important;
    padding-block: 3px !important;
    }
    &[usercontextid] > .tab-stack > .tab-background > .tab-context-line {
    margin-block-start: 1px !important;
    }
    }
    `}

    ${TabBar_Position == 0 ? `
    .titlebar-buttonbox-container {
    height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);
    }

    ${TitleBar_Button_Autohide ? `
    & > .titlebar-buttonbox-container {
    background-color: color-mix(in srgb, currentColor 20%, transparent);
    position: fixed;
    right: 0;
    &:not(:hover) {
    height: 6px;
    .titlebar-button {
    padding: 0;
    }
    &,& .titlebar-button {
    opacity: 0;
    transition: all 0s ease-in-out ${TitleBar_Button_DisplayTime}s;
    }
    }
    }
    ` : ``}

    }` : `

    ${TabBar_Position == 1 || TabBar_Position == 2 ? `
    & > .titlebar-buttonbox-container {
    display: none;
    }}
    #nav-bar {
    &:not(.browser-titlebar) {
    :root[customtitlebar] #toolbar-menubar[autohide="true"] ~ &,
    :root[inFullscreen] #toolbar-menubar ~ & {
    & > .titlebar-buttonbox-container {
    display: flex;
    }
    }
    }
    .titlebar-button {
    padding-block: 0;
    }
    }
    ` : ``}

    body:has(> #navigator-toolbox:not([tabs-hidden])) {
    ${TabBar_Position == 1 ? `
    script, toolbar:not(#TabsToolbar ${Bookmark_Toolbar_Position ? `` : `, #PersonalToolbar`}) {
    order: -1;
    }
    ` : TabBar_Position == 2 ? `
    & > #fullscr-toggler[hidden] + tabbox,
    :root[inFullscreen] & > tabbox:hover {
    border-top: 0.01px solid var(--chrome-content-separator-color);
    }
    & > tabbox > #navigator-toolbox {
    border-block: none !important;
    }
    :root[inFullscreen] & {
    & > #navigator-toolbox {
    transition: none;
    &:has(~ tabbox:hover) {
    margin-top: 0 !important;
    }
    &:hover ~ tabbox > #navigator-toolbox {
    display: flex;
    }
    }
    & > tabbox:not(:hover) {
    border-top: 0.01px solid transparent;
    & > #navigator-toolbox {
    display: none;
    }
    }
    }
    ` : ``}
    }

    `}

    toolbar[id$="bar"].browser-titlebar {
    .titlebar-spacer {
    &[type="pre-tabs"] {
    width: ${Left_Drag_Area}px;
    }
    &[type="post-tabs"] {
    width: ${Right_Drag_Area}px;
    }
    ${Maximize_Left_Drag_Area ? `
    :root[customtitlebar]:not([sizemode="normal"], [inFullscreen]) &[type="pre-tabs"] {
    display: flex;
    }
    ` : ``}
    ${Fullscreen_Drag_Area ? `
    :root[customtitlebar][inFullscreen] & {
    display: flex;
    }
    ` : ``}
    }
    #navigator-toolbox[tabs-hidden] & {
    #new-tab-button {
    display: none;
    }
    }
    }

    `,
    sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
    uri = Services.io.newURI("data:text/css;charset=UTF=8," + encodeURIComponent(css));
    ["0", "2", "dragend", "SSTabRestored", "TabAttrModified"].find(eventType => {
    if(!sss.sheetRegistered(uri, eventType)) sss.loadAndRegisterSheet(uri, eventType);
    if (MultiRowTab_OnOff_and_TabBar_Rows > 0) {
    gBrowser.tabContainer.addEventListener(eventType, (e) => {
    e.target.scrollIntoView({ behavior: "instant", block: "nearest" })
    })
    }
    })

    if (TabBar_Position == 2) {
    document.body.appendChild(
    document.createXULElement("tabbox")
    ).appendChild(
    document.importNode(document.getElementById("navigator-toolbox"))
    ).appendChild(
    document.adoptNode(document.getElementById("TabsToolbar"))
    )
    }

    gBrowser.tabContainer._getDropIndex = function(event) {
    let tabToDropAt = getTabFromEventTarget(event, false);
    const tabPos = gBrowser.tabContainer.getIndexOfItem(tabToDropAt);

    if (window.getComputedStyle(this).direction == "ltr") {
    let rect = tabToDropAt.getBoundingClientRect();
    if (event.clientX < rect.x + rect.width / 2)
    return tabPos;
    else
    return tabPos + 1;
               
    } else {
    let rect = tabToDropAt.getBoundingClientRect();
    if (event.clientX > rect.x + rect.width / 2)
    return tabPos;
    else
    return tabPos + 1;
    }
    };

    // We set this to check if the listeners were added before
    let listenersActive = false;

    // This sets when to apply the fix (by default a new row starts after the 23th open tab, unless you changed the min-size of tabs)
    gBrowser.tabContainer.addEventListener("dragstart", () => {
    // Multiple tab select fix
    gBrowser.visibleTabs.forEach(t => t.style.transform = "");

    // Event handling
    if (!listenersActive) {
    gBrowser.tabContainer.getDropEffectForTabDrag = function(){};
    gBrowser.tabContainer._getDropEffectForTabDrag = function(){};
    gBrowser.tabContainer.on_dragover = (dragoverEvent) => performTabDragOver(dragoverEvent);
    gBrowser.tabContainer._onDragOver = (dragoverEvent) => performTabDragOver(dragoverEvent);
    gBrowser.tabContainer.ondrop = (dropEvent) => performTabDropEvent(dropEvent);
    listenersActive = true;
    }
    });
    }

    var lastKnownIndex = null;
    var lastGroupStart = null;
    var lastGroupEnd = null;

    /**
    * Gets the tab from the event target.
    * Param {*} event The event.
    * @returns The tab if it was part of the target or its parents, otherwise null
    */
    function getTabFromEventTarget(event, { ignoreTabSides = false } = {}) {
    let { target } = event;
    if (target.nodeType != Node.ELEMENT_NODE) {
    target = target.parentElement;
    }
    let tab = target?.closest("tab") || target?.closest("tab-group");
    const selectedTab = gBrowser.selectedTab;
    if (tab && ignoreTabSides) {
    let { width, height } = tab.getBoundingClientRect();
    if (
    event.screenX < tab.screenX + width * 0.25 ||
    event.screenX > tab.screenX + width * 0.75 ||
    ((event.screenY < tab.screenY + height * 0.25 ||
    event.screenY > tab.screenY + height * 0.75) &&
    gBrowser.tabContainer.verticalMode)
    ) {
    return selectedTab;
    }
    }
    if (!tab) {
    return selectedTab;
    }
    return tab;
    }

    /**
    * Performs the tab drag over event.
    * Param {*} event The drag over event.
    */
    function performTabDragOver(event) {
    event.preventDefault();
    event.stopPropagation();

    let ind = gBrowser.tabContainer._tabDropIndicator;

    let effects = orig_getDropEffectForTabDrag(event);
    let tab;
    if (effects == "link") {
    tab = getTabFromEventTarget(event, true);
    if (tab) {
    if (!gBrowser.tabContainer._dragTime)
    gBrowser.tabContainer._dragTime = Date.now();
    if (!tab.hasAttribute("pendingicon") && // annoying fix
    Date.now() >= gBrowser.tabContainer._dragTime + gBrowser.tabContainer._dragOverDelay)
    gBrowser.tabContainer.selectedItem = tab;
    ind.hidden = true;
    return;
    }
    }

    if (!tab) {
    tab = getTabFromEventTarget(event, false);
    }
       
    let newIndex = gBrowser.tabContainer._getDropIndex(event);
    if (newIndex == null)
    return;

    // Update the last known index and group position
    lastKnownIndex = newIndex;
       
    if (tab.nodeName == "tab-group" && !lastGroupStart) {
    lastGroupStart = tab.querySelector("tab:first-of-type")._tPos;
    lastGroupEnd = tab.querySelector("tab:last-of-type")._tPos;
    }

    let tabs = document.querySelectorAll("tab");
    let ltr = (window.getComputedStyle(gBrowser.tabContainer).direction == "ltr");
    let rect = gBrowser.tabContainer.arrowScrollbox.getBoundingClientRect();
    let newMarginX, newMarginY;
    if (newIndex == tabs.length) {
    let tabRect = tabs[newIndex - 1].getBoundingClientRect();
    if (ltr)
    newMarginX = tabRect.right - rect.left;
    else
    newMarginX = rect.right - tabRect.left;
    newMarginY = tabRect.top + tabRect.height - rect.top - rect.height; // multirow fix

    if (CSS.supports("offset-anchor", "left bottom")) // Compatibility fix for FF72+
    newMarginY += rect.height / 2 - tabRect.height / 2;
           
    } else if (newIndex != null || newIndex != 0) {
    let tabRect = tabs[newIndex].getBoundingClientRect();
    if (ltr)
    newMarginX = tabRect.left - rect.left;
    else
    newMarginX = rect.right - tabRect.right;
    newMarginY = tabRect.top + tabRect.height - rect.top - rect.height; // multirow fix

    if (CSS.supports("offset-anchor", "left bottom")) // Compatibility fix for FF72+
    newMarginY += rect.height / 2 - tabRect.height / 2;
    }

    newMarginX += ind.clientWidth / 2;
    if (!ltr)
    newMarginX *= -1;

    ind.hidden = false;

    ind.style.transform = "translate(" + Math.round(newMarginX) + "px," + Math.round(newMarginY) + "px)"; // multirow fix
    ind.style.marginInlineStart = (-ind.clientWidth) + "px";
    }

    /**
    * Performs the tab drop event.
    * Param {*} event The drop event.
    */
    function performTabDropEvent(event) {
    let newIndex;
    let dt = event.dataTransfer;
    let dropEffect = dt.dropEffect;
    let draggedTab;
    if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
    draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
    if (!draggedTab) {
    return;
    }
    }

    if (draggedTab && dropEffect != "copy" && draggedTab.container == gBrowser.tabContainer) {
    newIndex = gBrowser.tabContainer._getDropIndex(event);

    /* fix for moving multiple selected tabs and tab groups */
    let selectedTabs = gBrowser.selectedTabs;
    if (lastGroupStart) {
    selectedTabs = [draggedTab?.closest("tab-group")];
    if (lastKnownIndex >= lastGroupStart && lastKnownIndex <= lastGroupEnd) {
    newIndex = lastGroupStart;
    } else if (lastKnownIndex == lastGroupEnd + 1) {
    newIndex = lastGroupStart + 1;
    }
    }

    if (selectedTabs[selectedTabs.length - 1] == null){
    newIndex = lastKnownIndex;
    } else if (newIndex > selectedTabs[selectedTabs.length - 1]._tPos + 1)
    newIndex--;
    else if (newIndex >= selectedTabs[0]._tPos)
    newIndex = -1;

    if (newIndex == -1) {
    newIndex = lastKnownIndex;
    }
           
    const tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex);
    console.log("tabToMoveAt", tabToMoveAt);
    console.log("newIndex", newIndex);
    selectedTabs.forEach(t => gBrowser.moveTabBefore(t, tabToMoveAt));

    // Restart global vars
    lastKnownIndex = null;
    lastGroupStart = null;
    lastGroupEnd = null;
    }
    }

    // copy of the original and overrided _getDropEffectForTabDrag method
    function orig_getDropEffectForTabDrag(event) {
    let dt = event.dataTransfer;

    let isMovingTabs = dt.mozItemCount > 0;
    for (let i = 0; i < dt.mozItemCount; i++) {
    // tabs are always added as the first type
    let types = dt.mozTypesAt(0);
    if (types[0] != TAB_DROP_TYPE) {
    isMovingTabs = false;
    break;
    }
    }

    if (isMovingTabs) {
    let sourceNode = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
    if (XULElement.isInstance(sourceNode) &&
    sourceNode.localName == "tab" &&
    sourceNode.ownerGlobal.isChromeWindow &&
    sourceNode.ownerDocument.documentElement.getAttribute("windowtype") ==
    "navigator:browser" &&
    sourceNode.ownerGlobal.gBrowser.tabContainer == sourceNode.container) {
    // Do not allow transfering a private tab to a non-private window
    // and vice versa.
    if (PrivateBrowsingUtils.isWindowPrivate(window) !=
    PrivateBrowsingUtils.isWindowPrivate(sourceNode.ownerGlobal))
    return "none";

    if (window.gMultiProcessBrowser !=
    sourceNode.ownerGlobal.gMultiProcessBrowser)
    return "none";

    if (window.gFissionBrowser != sourceNode.ownerGlobal.gFissionBrowser)
    return "none";

    return dt.dropEffect == "copy" ? "copy" : "move";
    }
    }

    if (Services.droppedLinkHandler.canDropLink(event, true))
    return "link";

    return "none";
    }

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 1. Mai 2025 um 22:04
    Zitat von 2002Andreas
    Zitat von GermanFreme82

    Wo finde ich denn jetzt die Einstellungen für

    Auf die Schnelle eine kompl. neue userChrome.css Datei:

    CSS
    /*----------------------------------------*/
    /* Megabar (Url-Bar) die Ecken abgerundet */
    /*----------------------------------------*/
    
    
    /* Adressleiste / Erhöhung wird verhindert */
    #urlbar-background {
    background: #f8f8ff ! important; /* Hintergrund */
    border: 1px solid #5badff !important;
    border-radius: 50px !important; }
    #urlbar[breakout][breakout-extend] {
    top: calc((var(--urlbar-toolbar-height) - var(--urlbar-height)) / 2) !important;
    left: 0 !important;
    width: 100% !important; }
    #urlbar[breakout][breakout-extend] > #urlbar-input-container {
    height: var(--urlbar-height) !important;
    padding-block: 0 !important;
    padding-inline: 0 !important; }
    #urlbar[breakout][breakout-extend][breakout-extend-animate] > #urlbar-background {
    animation-name: none !important; }
    #urlbar[breakout][breakout-extend] > #urlbar-background {
    box-shadow: none !important;
    }
    
    
    /* Suchleiste Ecken abrunden */
    #searchbar {
    background: #f8f8ff ! important; /* Hintergrund */
    border-radius: 50px !important;
    border: 1px solid #5badff !important;
    }
    
    
    /* -------------------------------------*/
    /* Kontext-Menü / Einträge ausgeblendet */
    /* -------------------------------------*/
    #context-viewinfo,
    #textnotes_gaborjuhaszprojects_com-menuitem-_textnotes,
    #_lympha-menuitem-_lympha-ctx-btn {
    display: none !important;
    }
    #context_pinTab,
    #context_moveTabOptions,
    #context_reopenInContainer,
    #context_sendTabToDevice,
    #context-sendlinktodevice,
    #context-inspect-a11y,
    #context-openlink,
    #context-openlinkprivate,
    #context-bookmarklink,
    #context-inspect,
    #context-openlinkinusercontext-menu,
    #context-viewpartialsource-selection,
    #context-sep-sendlinktodevice,
    #inspect-separator,
    #context-sendpagetodevice,
    #context-viewbgimage,
    #context-selectall,
    #context-viewsource,
    #context-sep-sendpagetodevice,
    #context-sep-viewbgimage,
    #contentAreaContextMenu > menuseparator:nth-child(93),
    #context-sendimage,
    #context-setDesktopBackground {
    display: none !important;
    }
    #context_duplicateTab {
    order: -1 !important;
    }
    #context-openlinkintab {
    order: -1 !important;
    }
    #context-copylink {
    order: -1 !important;
    }
    #copyplaintext_eros_man-menuitem-_copyPlainText {
    order: -1 !important;
    }
    
    
    #context-copy {
    order: -1 !important;
    }
    #_5dd73bb9-e728-4d1e-990b-c77d8e03670f_-menuitem-_search_engine_menu {
    order: 20 !important;
    }
    #context-print-selection,
    #textnotes_gaborjuhaszprojects_com-menuitem-_textnotes-selection {
    display: none !important;
    }
    menuitem[label="Ein Schlüsselwort für diese Suche hinzufügen…"] {
    display: none !important;
    }
    
    
    /*-------------------------------------------------------*/
    /* Trennstrich + Hintergrund für TAB geschlossen Button */
    /*-----------------------------------------------------*/
    #_4853d046-c5a3-436b-bc36-220fd935ee1d_-browser-action .toolbarbutton-badge-stack {
    background: #FF8F00 !important;
    border-radius: 35px !important;
    }
    
    
    #_4853d046-c5a3-436b-bc36-220fd935ee1d_-browser-action:hover .toolbarbutton-badge-stack {
    background-color: #FF0039 !important;
    border-radius: 35px !important;
    }
    
    
    #_4853d046-c5a3-436b-bc36-220fd935ee1d_-browser-action {
    margin-left: 12px !important;
    margin-right: 12px !important;
    }
    
    
    /*--------------------------------------------*/
    /* Ordnersymbole für Symbolleiste und Sidebar */
    /*--------------------------------------------*/
    
    
    @-moz-document url-prefix(chrome://browser/content/browser.xhtml),
    url("chrome://browser/content/places/places.xhtml") {
    .bookmark-item[container="true"]{
    list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzAImBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII=") !important;
    }
    }
    
    
    @-moz-document url("chrome://browser/content/places/bookmarksSidebar.xhtml") {
    treechildren::-moz-tree-image(container) {
    list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzAImBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII=") !important;
    }
    }
    
    /**********************************************/
    /* Anpassungen für MultiRowTabs.uc.js (START) */
    /**********************************************/
    
    .tabbrowser-tab[pinned] {
    flex-grow: 0 !important;
    min-width: 120px !important;
    }
       
    .tabbrowser-tab .tab-label {
    text-shadow: 1px 1px 0px #000000 !important;
    }
    
    .tab-background[selected],
    .tabbrowser-tab:hover > .tab-stack > .tab-background:not([selected]),
    .tabbrowser-tab:hover:not([selected]) :is(.tab-label,.tab-icon-stack),
    .tabbrowser-tab:hover > .tab-stack > .tab-background[multiselected]:not([selected]),
    .tab-background:not([selected]),
    .tab-background[multiselected]:not([selected])
    {
    filter: initial !important;
    }
    
    .tab-sharing-icon-overlay, .tab-icon-overlay:not([pinned]), .tab-icon-overlay[soundplaying] {
    transform: scale(1.0) !important;
    }
       
    #TabsToolbar #tabs-newtab-button > image {
    min-height: initial !important;
    max-height: initial !important;
    min-width: initial !important;
    max-width: initial !important;
    }
    
    #TabsToolbar #tabs-newtab-button > image {
    padding: 7px !important;
    }
    
    
    /*Aktiver Tab Hintergrund orange*/
    tab.tabbrowser-tab[selected] stack.tab-stack vbox.tab-background {
      background: rgb(240,152,0) !important;
      box-shadow: none !important;
      border-radius: 30px !important; 
    }
    
    /*Aktiver Tab hover Hintergrund rot*/
    tab.tabbrowser-tab[selected]:hover stack.tab-stack vbox.tab-background {
      background-color: red !important;
    }
    
    /*Aktiver Tab hover Schrift weiß*/
    tab.tabbrowser-tab .tab-content[selected]:hover { 
      color:white !important;
    }
    
    /*Inaktiver Tab Hintergrund beige*/
    tab.tabbrowser-tab:not([selected]) stack.tab-stack vbox.tab-background {
      background: rgb(195,157,116) !important;
      box-shadow: none !important;
      border-radius: 30px !important; 
    }
    
    /*Inaktiver Tab hover Hintergrund blau*/
    tab.tabbrowser-tab:not([selected]):hover stack.tab-stack vbox.tab-background {
      background: blue !important; 
    }
    
    /*Inaktiver Tab hover Schrift weiß*/
    tab.tabbrowser-tab .tab-content:not([selected]):hover {
      color: white !important;
    }
    
    /*Neuer Tabbutton weiss*/
    #TabsToolbar #tabs-newtab-button {
      fill: white !important;
    }
    
    #TabsToolbar {
      background: rgb(62,75,84)!important;
    }
    
    /*********************************************/
    /* Anpassungen für MultiRowTabs.uc.js (ENDE) */
    /*********************************************/
    Alles anzeigen

    Ab Zeile 139 ist nur für die Tabs.

    Wow das sieht richtig cool aus vielen DANK !!
    Jetzt muss ich irgendwie noch finden, wo der Abstand der TAB ist nach oben und unten und die Breite kleiner machen 😅 Hast du da einen TIpp wo ich das finden kann udn der Hintergrudn auch braun warte ich zeige ...

    kein Hoover Effekt da ist was blau irgendwie wenn ich auf einen TAB zeige udn mal rot.

    <===== das ist mein Originla von FF137


    hellbruan = C39D74

    und der Hintergrund ist auch das gleiche Holzdesign

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 1. Mai 2025 um 21:40

    Ich möchte CODe hier posten wie geht das möchte nicht immer alles umwandeln udn kopieren udn so das ist umständlich Ich möchte gerne den CODE reinstellen wie ander eauch hier im Forum


    userChrome.css

    Spoiler anzeigen

    /*----------------------------------------*/
    /* Megabar (Url-Bar) die Ecken abgerundet */
    /*----------------------------------------*/


    /* Adressleiste / Erhöhung wird verhindert */
    #urlbar-background {
    background: #f8f8ff ! important; /* Hintergrund */
    border: 1px solid #5badff !important;
    border-radius: 50px !important; }
    #urlbar[breakout][breakout-extend] {
    top: calc((var(--urlbar-toolbar-height) - var(--urlbar-height)) / 2) !important;
    left: 0 !important;
    width: 100% !important; }
    #urlbar[breakout][breakout-extend] > #urlbar-input-container {
    height: var(--urlbar-height) !important;
    padding-block: 0 !important;
    padding-inline: 0 !important; }
    #urlbar[breakout][breakout-extend][breakout-extend-animate] > #urlbar-background {
    animation-name: none !important; }
    #urlbar[breakout][breakout-extend] > #urlbar-background {
    box-shadow: none !important;
    }


    /* Suchleiste Ecken abrunden */
    #searchbar {
    background: #f8f8ff ! important; /* Hintergrund */
    border-radius: 50px !important;
    border: 1px solid #5badff !important;
    }


    /* -------------------------------------*/
    /* Kontext-Menü / Einträge ausgeblendet */
    /* -------------------------------------*/
    #context-viewinfo,
    #textnotes_gaborjuhaszprojects_com-menuitem-_textnotes,
    #_lympha-menuitem-_lympha-ctx-btn {
    display: none !important;
    }
    #context_pinTab,
    #context_moveTabOptions,
    #context_reopenInContainer,
    #context_sendTabToDevice,
    #context-sendlinktodevice,
    #context-inspect-a11y,
    #context-openlink,
    #context-openlinkprivate,
    #context-bookmarklink,
    #context-inspect,
    #context-openlinkinusercontext-menu,
    #context-viewpartialsource-selection,
    #context-sep-sendlinktodevice,
    #inspect-separator,
    #context-sendpagetodevice,
    #context-viewbgimage,
    #context-selectall,
    #context-viewsource,
    #context-sep-sendpagetodevice,
    #context-sep-viewbgimage,
    #contentAreaContextMenu > menuseparator:nth-child(93),
    #context-sendimage,
    #context-setDesktopBackground {
    display: none !important;
    }
    #context_duplicateTab {
    order: -1 !important;
    }
    #context-openlinkintab {
    order: -1 !important;
    }
    #context-copylink {
    order: -1 !important;
    }
    #copyplaintext_eros_man-menuitem-_copyPlainText {
    order: -1 !important;
    }


    #context-copy {
    order: -1 !important;
    }
    #_5dd73bb9-e728-4d1e-990b-c77d8e03670f_-menuitem-_search_engine_menu {
    order: 20 !important;
    }
    #context-print-selection,
    #textnotes_gaborjuhaszprojects_com-menuitem-_textnotes-selection {
    display: none !important;
    }
    menuitem[label="Ein Schlüsselwort für diese Suche hinzufügen…"] {
    display: none !important;
    }


    /*-------------------------------------------------------*/
    /* Trennstrich + Hintergrund für TAB geschlossen Button */
    /*-----------------------------------------------------*/
    #_4853d046-c5a3-436b-bc36-220fd935ee1d_-browser-action .toolbarbutton-badge-stack {
    background: #FF8F00 !important;
    border-radius: 35px !important;
    }


    #_4853d046-c5a3-436b-bc36-220fd935ee1d_-browser-action:hover .toolbarbutton-badge-stack {
    background-color: #FF0039 !important;
    border-radius: 35px !important;
    }


    #_4853d046-c5a3-436b-bc36-220fd935ee1d_-browser-action {
    margin-left: 12px !important;
    margin-right: 12px !important;
    }


    /*--------------------------------------------*/
    /* Ordnersymbole für Symbolleiste und Sidebar */
    /*--------------------------------------------*/


    @-moz-document url-prefix(chrome://browser/content/browser.xhtml),
    url("chrome://browser/content/places/places.xhtml") {
    .bookmark-item[container="true"]{
    list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzAImBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII=") !important;
    }
    }


    @-moz-document url("chrome://browser/content/places/bookmarksSidebar.xhtml") {
    treechildren::-moz-tree-image(container) {
    list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzAImBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII=") !important;
    }
    }

    /**********************************************/
    /* Anpassungen für MultiRowTabs.uc.js (START) */
    /**********************************************/

    .tabbrowser-tab[pinned] {
    flex-grow: 0 !important;
    min-width: 120px !important;
    }
       
    .tabbrowser-tab .tab-label {
    text-shadow: 1px 1px 0px #000000 !important;
    }

    .tab-background[selected],
    .tabbrowser-tab:hover > .tab-stack > .tab-background:not([selected]),
    .tabbrowser-tab:hover:not([selected]) :is(.tab-label,.tab-icon-stack),
    .tabbrowser-tab:hover > .tab-stack > .tab-background[multiselected]:not([selected]),
    .tab-background:not([selected]),
    .tab-background[multiselected]:not([selected])
    {
    filter: initial !important;
    }

    .tab-sharing-icon-overlay, .tab-icon-overlay:not([pinned]), .tab-icon-overlay[soundplaying] {
    transform: scale(1.0) !important;
    }
       
    #TabsToolbar #tabs-newtab-button > image {
    min-height: initial !important;
    max-height: initial !important;
    min-width: initial !important;
    max-width: initial !important;
    }
    #TabsToolbar #tabs-newtab-button > image {
    padding: 7px !important;
    }

    /*********************************************/
    /* Anpassungen für MultiRowTabs.uc.js (ENDE) */
    /*********************************************/


    MultiRowTab_Firefox107.js

    Spoiler anzeigen

    // ==UserScript==
    // Name MultiRowTabLiteforFx.uc.js
    // Namespace Based on Alice0775's zzzz-MultiRowTab_LiteforFx48.uc.js
    // @description Multi-Row tabs experimental version with embedded CSS, Lite version
    // @include main
    // @compatibility Firefox138+
    // @version 2025/04/07 12:00
    // ==/UserScript==
    "use strict";
    MultiRowTabLiteforFx();
    function MultiRowTabLiteforFx() {
    if (!window.gBrowser) { return; }
    // -- Config --
    // If you write similar CSS, “userChrome.css” will take priority
    const // Multi-Row tab, On/Off Number of tabs in tab bar
    MultiRowTab_OnOff_and_TabBar_Rows = -1 ,// [-1] = Multi-Row tab, On Unlimited number of columns
    // 0 = Multi-Row tab Off
    // 1 = Multi-Row tab On Normally, one tier is used and the second and subsequent tiers are displayed up to the specified number of tiers when the tab bar is moused over. *Specify the number of rows with “TabBar_Rows_on_MouseOver”.
    // 2~ = Multi-Row tab On Specify the number of columns
    TabBar_Rows_on_MouseOver = 3 ,// Specify the number of tiers you want to display when you mouse over the tab bar, usually one tier. Prerequisite: “MultiRowTab_OnOff_and_TabBar_Rows” is set to “1”.
    TabBar_DisplayTime_on_MouseOver = 1 ,// You can set the display time (in seconds) when the second and subsequent rows are displayed on mouse-over. The display will return to the first Row after displaying the set number of seconds.
    // Tab bar position
    TabBar_Position = 1 ,// [0] = Above Toolbar Default
    // 1 = Under the toolbar
    // 2 = Under Site Content
    // For people who want to swap the position of the tab bar and bookmark toolbar after setting the tab bar position below the toolbar.
    // Prerequisite: “TabBar_Position” is set to “1”.
    Bookmark_Toolbar_Position = true ,// [true] = Menu bar, navigation bar, bookmark bar, tab bar
    // false = Menu bar, navigation bar, tab bar, bookmark bar
    // Tab Height UI Density
    UI_Density_Compact = 29 ,// Default 29px, Compact
    UI_Density_Normal = 36 ,// Default 36px, Normal (set here your own Tab Height)
    UI_Density_Touch = 41 ,// Default 41px, Touch
    // Tab Width
    Tab_Min_Width = 212 ,// Default 76px, Min.
    Tab_Max_Width = 212 ,// Default 225px, Max.
    // If both values are the same, the width will be fixed.
    // Close Tab button
    Tab_Close_Button = 0 ,// [0] = Default
    // 1 = Hidden
    // 2 = Show in all tabs
    // 3 = Display tabs with mouse over
    // 4 = Active tabs are always visible, inactive tabs are shown on mouse-over *Default for vertical tab mode.
    // Tab Appearance ProtonUI
    Proton_Margins = true ,// [true] = ProtonUI Default
    // false = Make it look like it did when “browser.proton.enabled” was set to “false” in the Firefox 90 or earlier settings.
    // The space around the tabs is set to 0 and the UI density height is set to 0, so the tabs are 4px wider horizontally and 8px lower in height than the default.
    // Borders next to tabs
    Tab_Separators = false ,// [false] = Do not show
    // true = Show
    // The CSS of the border that could be displayed when “browser.proton.enabled” was set to “false” in Firefox 90 or earlier is extracted and adjusted.
    // Hide the title bar button [-□×] and use the wider width of the tab bar for it.
    // Prerequisite: “TabBar_Position” is set to “0”.
    TitleBar_Button_Autohide = false ,// [false] = Not used
    // true = Use Normally, the outer frame of the title bar button [-□×] is made small and transparent; if you want to display it, return the trigger area (36px x 6px) in the upper right corner of the tab bar to its original size with a mouseover to remove transparency.
    TitleBar_Button_DisplayTime = 0.6 ,// You can set the display time (in seconds) after the transparency is released by returning it to its original size on mouse over. The image will be displayed for the set number of seconds before it is hidden.
    // Set the tab bar to the height of the specified number of columns from the beginning.
    // Prerequisite: “MultiRowTab_OnOff_and_TabBar_Rows” is set to “2” or higher.
    Set_the_TabBar_to_the_Specified_Height = false ,// [false] = Not used
    // true = Use The tab bar is set to the height of the specified number of columns from the beginning, and tabs are lined up as usual, starting from the upper left corner.
    // Replacement of “.tabDropIndicator” that displays tabs during drag & drop movement
    // Prerequisite: Set “MultiRowTab_OnOff_and_TabBar_Rows” to something other than “0”.
    Tab_Drop_Indicator = false ,// [false] = No Pin icon Default
    // true = Red line icon(2px×29px)
    // Pinning tab position
    // Prerequisite: Set “MultiRowTab_OnOff_and_TabBar_Rows” to something other than “0”.
    Separate_Tabs_and_PinnedTabs = false ,// [false] = Default
    // true = Move pinned tabs to a line that can be separated from and above the row of tabs.
    // Adjust width of pinned tabs
    // Prerequisite: Set “Separate_Tabs_and_PinnedTabs” to “true”.
    PinnedTab_Width = false ,// [false] = Not default
    // true = The width of the pinned tabs can be adjusted to match the width of the tabs.
    PinnedTab_Min_Width = 76 ,// Default 76px Min.
    PinnedTab_Max_Width = 225 ,// Default 225px Max.
    // If both values are the same, the width will be fixed.
    // Pinned tabs Close tab button
    // Prerequisite: Set “Separate_Tabs_and_PinnedTabs” to “true”.
    PinnedTab_Close_Button = 0 ,// [0] = Default
    // 1 = Show in all tabs
    // 2 = Show tabs on mouse over
    // 3 = Active tabs are always visible, inactive tabs are shown on mouse-over *Vertical tab mode is the default.
    // Drag area on tab bar
    Left_Drag_Area = 0 ,// Default 40px left drag area
    Right_Drag_Area = 0 ,// Default 40px right drag area
    Maximize_Left_Drag_Area = false ,// [false] = Default
    // true = When the window is maximized, the left drag area, which is hidden, can be displayed.
    Fullscreen_Drag_Area = false ,// [false] = Default
    // true = The left and right drag areas that are hidden when in full-screen mode can be displayed.
    // When the title bar is displayed, “.titlebar-spacer” does not function as a drag area.
    // -- Config End --

    css = `

    #TabsToolbar:not([collapsed="true"]) {

    :root[uidensity="compact"] & {
    --tab-min-height: ${UI_Density_Compact}px;
    }
    :root:not([uidensity]) & {
    --tab-min-height: ${UI_Density_Normal}px;
    }
    :root[uidensity="touch"] & {
    --tab-min-height: ${UI_Density_Touch}px;
    }

    #tabbrowser-tabs {
    min-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);

    ${MultiRowTab_OnOff_and_TabBar_Rows != 0 ? `
    &[overflow] {
    padding-inline: 0 !important;
    & > #tabbrowser-arrowscrollbox {
    & > .tabbrowser-tab[pinned] {
    display: flex;
    margin-inline-start: 0 !important;
    position: static !important;
    }
    &::part(scrollbox) {
    padding-inline: 0;
    }
    }
    & + #new-tab-button {
    display: none;
    }
    }

    ${Tab_Drop_Indicator ? `
    & > .tab-drop-indicator {
    background: url(
    data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAdCAIAAAAPVCo9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY3growJEQ5+SUQEAOb1EM8kwskcAAAAASUVORK5CYII=
    ) no-repeat center;
    }
    ` : ``}

    #tabbrowser-arrowscrollbox {
    &::part(scrollbox) {
    & > slot {
    flex-wrap: wrap;
    }

    ${MultiRowTab_OnOff_and_TabBar_Rows != -1 ? `
    ${MultiRowTab_OnOff_and_TabBar_Rows == 1 ? `
    ${TabBar_Rows_on_MouseOver == 0 || TabBar_Rows_on_MouseOver == 1 ? `
    max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * 2);
    ` : `
    max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${TabBar_Rows_on_MouseOver});
    `}
    &:not(:hover) {
    max-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) !important;
    ${Proton_Margins ? `scrollbar-width: none;` : ``}
    transition: all 0s ease-in-out ${TabBar_DisplayTime_on_MouseOver}s;
    }
    ` : `
    ${Set_the_TabBar_to_the_Specified_Height ? `
    min-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${MultiRowTab_OnOff_and_TabBar_Rows});
    & > slot {
    max-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);
    }
    ` : `
    max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${MultiRowTab_OnOff_and_TabBar_Rows});
    `}
    `}

    overflow: hidden auto;
    & scrollbar {
    -moz-window-dragging: no-drag;
    }
    ` : ``}

    }
    &::part(overflow-start-indicator),
    &::part(overflow-end-indicator),
    &::part(scrollbutton-up),
    &::part(scrollbutton-down) {
    display: none;
    }

    ${Separate_Tabs_and_PinnedTabs ? `
    &:has(> .tabbrowser-tab[fadein][pinned]) {
    &::part(scrollbox) {
    & > slot::after {
    display: flow-root list-item;
    content: "";
    flex-basis: -moz-available;
    height: 0;
    overflow: hidden;
    }
    }
    }
    .tabbrowser-tab[fadein] {
    &:not([pinned]) {
    #tabbrowser-tabs[haspinnedtabs] & {
    &, & + :not(#tabs-newtab-button) {
    order: 1;
    }
    }
    }
    &[pinned] {
    .tab-background:after {
    content: "📌";
    font-size: 11px;
    right: -2px;
    position: absolute;
    top: -2px;
    }

    ${PinnedTab_Width ? `
    flex: 100 100;
    max-width: ${PinnedTab_Max_Width}px;
    min-width: ${PinnedTab_Min_Width}px;
    .tab-throbber, .tab-icon-pending, .tab-icon-image, .tab-sharing-icon-overlay, .tab-icon-overlay {
    margin-inline-end: 5.5px !important;
    }

    ${PinnedTab_Close_Button == 1 ? `
    .tab-close-button {
    display: flex;
    }
    ` : PinnedTab_Close_Button == 2 ? `
    .tab-close-button {
    display: none;
    }
    &:hover .tab-close-button {
    display: flex;
    }
    ` : PinnedTab_Close_Button == 3 ? `
    &:not([selected]):hover,
    &[selected] {
    .tab-close-button {
    display: flex;
    }
    }
    ` : ``}

    ` : ``}

    }
    }
    ` : ``}

    #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]):not([orient="vertical"]) > & {
    & > .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) {
    margin-inline-start: 0 !important;
    }
    }

    }
    ` : ``}
    }

    .tabbrowser-tab[fadein]:not([pinned]) {
    max-width: ${Tab_Max_Width}px;
    min-width: ${Tab_Min_Width}px;

    ${Tab_Close_Button == 1 ? `
    .tab-close-button {
    display: none;
    }
    ` : Tab_Close_Button == 2 ? `
    .tab-close-button {
    display: flex;
    }
    ` : Tab_Close_Button == 3 ? `
    .tab-close-button {
    display: none;
    }
    &:hover .tab-close-button {
    display: flex;
    }
    ` : Tab_Close_Button == 4 ? `
    &:not([selected]):hover {
    .tab-close-button {
    display: flex;
    }
    }
    ` : ``}

    }

    ${Tab_Separators ? `
    .titlebar-spacer[type="pre-tabs"] {
    border-inline-end: 1px solid color-mix(in srgb, currentColor 20%, transparent);
    }
    .tabbrowser-tab {
    &::after,
    &::before {
    border-left: 1px solid color-mix(in srgb, currentColor 50%, transparent);
    height: calc(var(--tab-min-height) - 15%);
    margin-block: auto;
    }
    &:hover::after,
    &[multiselected]::after,
    #tabbrowser-tabs:not([movingtab]) &:has(+ .tabbrowser-tab:hover)::after,
    #tabbrowser-tabs:not([movingtab]) &:has(+ [multiselected])::after {
    height: 100%;
    }
    &::after,
    #tabbrowser-tabs[movingtab] &[visuallyselected]::before {
    display: flex;
    content: "";
    }
    }
    ` : ``}

    ${Proton_Margins ? `` : `
    .tabbrowser-tab,
    .toolbarbutton-1 {
    padding: 0;
    }
    .tabbrowser-tab,
    #tabs-newtab-button {
    height: var(--tab-min-height);
    }
    .tabbrowser-tab {
    .tab-background {
    box-shadow: none;
    margin-block: 0;
    }
    .tab-label-container {
    height: var(--tab-min-height);
    max-height: 24px;
    }
    .tab-close-button {
    height: 20px !important;
    padding-block: 3px !important;
    }
    &[usercontextid] > .tab-stack > .tab-background > .tab-context-line {
    margin-block-start: 1px !important;
    }
    }
    `}

    ${TabBar_Position == 0 ? `
    .titlebar-buttonbox-container {
    height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);
    }

    ${TitleBar_Button_Autohide ? `
    & > .titlebar-buttonbox-container {
    background-color: color-mix(in srgb, currentColor 20%, transparent);
    position: fixed;
    right: 0;
    &:not(:hover) {
    height: 6px;
    .titlebar-button {
    padding: 0;
    }
    &,& .titlebar-button {
    opacity: 0;
    transition: all 0s ease-in-out ${TitleBar_Button_DisplayTime}s;
    }
    }
    }
    ` : ``}

    }` : `

    ${TabBar_Position == 1 || TabBar_Position == 2 ? `
    & > .titlebar-buttonbox-container {
    display: none;
    }}
    #nav-bar {
    &:not(.browser-titlebar) {
    :root[customtitlebar] #toolbar-menubar[autohide="true"] ~ &,
    :root[inFullscreen] #toolbar-menubar ~ & {
    & > .titlebar-buttonbox-container {
    display: flex;
    }
    }
    }
    .titlebar-button {
    padding-block: 0;
    }
    }
    ` : ``}

    body:has(> #navigator-toolbox:not([tabs-hidden])) {
    ${TabBar_Position == 1 ? `
    script, toolbar:not(#TabsToolbar ${Bookmark_Toolbar_Position ? `` : `, #PersonalToolbar`}) {
    order: -1;
    }
    ` : TabBar_Position == 2 ? `
    & > #fullscr-toggler[hidden] + tabbox,
    :root[inFullscreen] & > tabbox:hover {
    border-top: 0.01px solid var(--chrome-content-separator-color);
    }
    & > tabbox > #navigator-toolbox {
    border-block: none !important;
    }
    :root[inFullscreen] & {
    & > #navigator-toolbox {
    transition: none;
    &:has(~ tabbox:hover) {
    margin-top: 0 !important;
    }
    &:hover ~ tabbox > #navigator-toolbox {
    display: flex;
    }
    }
    & > tabbox:not(:hover) {
    border-top: 0.01px solid transparent;
    & > #navigator-toolbox {
    display: none;
    }
    }
    }
    ` : ``}
    }

    `}

    toolbar[id$="bar"].browser-titlebar {
    .titlebar-spacer {
    &[type="pre-tabs"] {
    width: ${Left_Drag_Area}px;
    }
    &[type="post-tabs"] {
    width: ${Right_Drag_Area}px;
    }
    ${Maximize_Left_Drag_Area ? `
    :root[customtitlebar]:not([sizemode="normal"], [inFullscreen]) &[type="pre-tabs"] {
    display: flex;
    }
    ` : ``}
    ${Fullscreen_Drag_Area ? `
    :root[customtitlebar][inFullscreen] & {
    display: flex;
    }
    ` : ``}
    }
    #navigator-toolbox[tabs-hidden] & {
    #new-tab-button {
    display: none;
    }
    }
    }

    `,
    sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
    uri = Services.io.newURI("data:text/css;charset=UTF=8," + encodeURIComponent(css));
    ["0", "2", "dragend", "SSTabRestored", "TabAttrModified"].find(eventType => {
    if(!sss.sheetRegistered(uri, eventType)) sss.loadAndRegisterSheet(uri, eventType);
    if (MultiRowTab_OnOff_and_TabBar_Rows > 0) {
    gBrowser.tabContainer.addEventListener(eventType, (e) => {
    e.target.scrollIntoView({ behavior: "instant", block: "nearest" })
    })
    }
    })

    if (TabBar_Position == 2) {
    document.body.appendChild(
    document.createXULElement("tabbox")
    ).appendChild(
    document.importNode(document.getElementById("navigator-toolbox"))
    ).appendChild(
    document.adoptNode(document.getElementById("TabsToolbar"))
    )
    }

    gBrowser.tabContainer._getDropIndex = function(event) {
    let tabToDropAt = getTabFromEventTarget(event, false);
    const tabPos = gBrowser.tabContainer.getIndexOfItem(tabToDropAt);

    if (window.getComputedStyle(this).direction == "ltr") {
    let rect = tabToDropAt.getBoundingClientRect();
    if (event.clientX < rect.x + rect.width / 2)
    return tabPos;
    else
    return tabPos + 1;
               
    } else {
    let rect = tabToDropAt.getBoundingClientRect();
    if (event.clientX > rect.x + rect.width / 2)
    return tabPos;
    else
    return tabPos + 1;
    }
    };

    // We set this to check if the listeners were added before
    let listenersActive = false;

    // This sets when to apply the fix (by default a new row starts after the 23th open tab, unless you changed the min-size of tabs)
    gBrowser.tabContainer.addEventListener("dragstart", () => {
    // Multiple tab select fix
    gBrowser.visibleTabs.forEach(t => t.style.transform = "");

    // Event handling
    if (!listenersActive) {
    gBrowser.tabContainer.getDropEffectForTabDrag = function(){};
    gBrowser.tabContainer._getDropEffectForTabDrag = function(){};
    gBrowser.tabContainer.on_dragover = (dragoverEvent) => performTabDragOver(dragoverEvent);
    gBrowser.tabContainer._onDragOver = (dragoverEvent) => performTabDragOver(dragoverEvent);
    gBrowser.tabContainer.ondrop = (dropEvent) => performTabDropEvent(dropEvent);
    listenersActive = true;
    }
    });
    }

    var lastKnownIndex = null;
    var lastGroupStart = null;
    var lastGroupEnd = null;

    /**
    * Gets the tab from the event target.
    * Param {*} event The event.
    * @returns The tab if it was part of the target or its parents, otherwise null
    */
    function getTabFromEventTarget(event, { ignoreTabSides = false } = {}) {
    let { target } = event;
    if (target.nodeType != Node.ELEMENT_NODE) {
    target = target.parentElement;
    }
    let tab = target?.closest("tab") || target?.closest("tab-group");
    const selectedTab = gBrowser.selectedTab;
    if (tab && ignoreTabSides) {
    let { width, height } = tab.getBoundingClientRect();
    if (
    event.screenX < tab.screenX + width * 0.25 ||
    event.screenX > tab.screenX + width * 0.75 ||
    ((event.screenY < tab.screenY + height * 0.25 ||
    event.screenY > tab.screenY + height * 0.75) &&
    gBrowser.tabContainer.verticalMode)
    ) {
    return selectedTab;
    }
    }
    if (!tab) {
    return selectedTab;
    }
    return tab;
    }

    /**
    * Performs the tab drag over event.
    * Param {*} event The drag over event.
    */
    function performTabDragOver(event) {
    event.preventDefault();
    event.stopPropagation();

    let ind = gBrowser.tabContainer._tabDropIndicator;

    let effects = orig_getDropEffectForTabDrag(event);
    let tab;
    if (effects == "link") {
    tab = getTabFromEventTarget(event, true);
    if (tab) {
    if (!gBrowser.tabContainer._dragTime)
    gBrowser.tabContainer._dragTime = Date.now();
    if (!tab.hasAttribute("pendingicon") && // annoying fix
    Date.now() >= gBrowser.tabContainer._dragTime + gBrowser.tabContainer._dragOverDelay)
    gBrowser.tabContainer.selectedItem = tab;
    ind.hidden = true;
    return;
    }
    }

    if (!tab) {
    tab = getTabFromEventTarget(event, false);
    }
       
    let newIndex = gBrowser.tabContainer._getDropIndex(event);
    if (newIndex == null)
    return;

    // Update the last known index and group position
    lastKnownIndex = newIndex;
       
    if (tab.nodeName == "tab-group" && !lastGroupStart) {
    lastGroupStart = tab.querySelector("tab:first-of-type")._tPos;
    lastGroupEnd = tab.querySelector("tab:last-of-type")._tPos;
    }

    let tabs = document.querySelectorAll("tab");
    let ltr = (window.getComputedStyle(gBrowser.tabContainer).direction == "ltr");
    let rect = gBrowser.tabContainer.arrowScrollbox.getBoundingClientRect();
    let newMarginX, newMarginY;
    if (newIndex == tabs.length) {
    let tabRect = tabs[newIndex - 1].getBoundingClientRect();
    if (ltr)
    newMarginX = tabRect.right - rect.left;
    else
    newMarginX = rect.right - tabRect.left;
    newMarginY = tabRect.top + tabRect.height - rect.top - rect.height; // multirow fix

    if (CSS.supports("offset-anchor", "left bottom")) // Compatibility fix for FF72+
    newMarginY += rect.height / 2 - tabRect.height / 2;
           
    } else if (newIndex != null || newIndex != 0) {
    let tabRect = tabs[newIndex].getBoundingClientRect();
    if (ltr)
    newMarginX = tabRect.left - rect.left;
    else
    newMarginX = rect.right - tabRect.right;
    newMarginY = tabRect.top + tabRect.height - rect.top - rect.height; // multirow fix

    if (CSS.supports("offset-anchor", "left bottom")) // Compatibility fix for FF72+
    newMarginY += rect.height / 2 - tabRect.height / 2;
    }

    newMarginX += ind.clientWidth / 2;
    if (!ltr)
    newMarginX *= -1;

    ind.hidden = false;

    ind.style.transform = "translate(" + Math.round(newMarginX) + "px," + Math.round(newMarginY) + "px)"; // multirow fix
    ind.style.marginInlineStart = (-ind.clientWidth) + "px";
    }

    /**
    * Performs the tab drop event.
    * Param {*} event The drop event.
    */
    function performTabDropEvent(event) {
    let newIndex;
    let dt = event.dataTransfer;
    let dropEffect = dt.dropEffect;
    let draggedTab;
    if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
    draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
    if (!draggedTab) {
    return;
    }
    }

    if (draggedTab && dropEffect != "copy" && draggedTab.container == gBrowser.tabContainer) {
    newIndex = gBrowser.tabContainer._getDropIndex(event);

    /* fix for moving multiple selected tabs and tab groups */
    let selectedTabs = gBrowser.selectedTabs;
    if (lastGroupStart) {
    selectedTabs = [draggedTab?.closest("tab-group")];
    if (lastKnownIndex >= lastGroupStart && lastKnownIndex <= lastGroupEnd) {
    newIndex = lastGroupStart;
    } else if (lastKnownIndex == lastGroupEnd + 1) {
    newIndex = lastGroupStart + 1;
    }
    }

    if (selectedTabs[selectedTabs.length - 1] == null){
    newIndex = lastKnownIndex;
    } else if (newIndex > selectedTabs[selectedTabs.length - 1]._tPos + 1)
    newIndex--;
    else if (newIndex >= selectedTabs[0]._tPos)
    newIndex = -1;

    if (newIndex == -1) {
    newIndex = lastKnownIndex;
    }
           
    const tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex);
    console.log("tabToMoveAt", tabToMoveAt);
    console.log("newIndex", newIndex);
    selectedTabs.forEach(t => gBrowser.moveTabBefore(t, tabToMoveAt));

    // Restart global vars
    lastKnownIndex = null;
    lastGroupStart = null;
    lastGroupEnd = null;
    }
    }

    // copy of the original and overrided _getDropEffectForTabDrag method
    function orig_getDropEffectForTabDrag(event) {
    let dt = event.dataTransfer;

    let isMovingTabs = dt.mozItemCount > 0;
    for (let i = 0; i < dt.mozItemCount; i++) {
    // tabs are always added as the first type
    let types = dt.mozTypesAt(0);
    if (types[0] != TAB_DROP_TYPE) {
    isMovingTabs = false;
    break;
    }
    }

    if (isMovingTabs) {
    let sourceNode = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
    if (XULElement.isInstance(sourceNode) &&
    sourceNode.localName == "tab" &&
    sourceNode.ownerGlobal.isChromeWindow &&
    sourceNode.ownerDocument.documentElement.getAttribute("windowtype") ==
    "navigator:browser" &&
    sourceNode.ownerGlobal.gBrowser.tabContainer == sourceNode.container) {
    // Do not allow transfering a private tab to a non-private window
    // and vice versa.
    if (PrivateBrowsingUtils.isWindowPrivate(window) !=
    PrivateBrowsingUtils.isWindowPrivate(sourceNode.ownerGlobal))
    return "none";

    if (window.gMultiProcessBrowser !=
    sourceNode.ownerGlobal.gMultiProcessBrowser)
    return "none";

    if (window.gFissionBrowser != sourceNode.ownerGlobal.gFissionBrowser)
    return "none";

    return dt.dropEffect == "copy" ? "copy" : "move";
    }
    }

    if (Services.droppedLinkHandler.canDropLink(event, true))
    return "link";

    return "none";
    }


    Zitat von Mira_Belle

    Oh Himmel.

    Nimm dieses Skript, ich habe für Dich Zeile 35 umgestellt.
    Die Tab-Leiste sollte damit unter der Symbolleiste sein.

    MultiRowTabLiteforFx.uc.js.zip

    Danke das geht auch Leiste ist nun wieder unten. Vielen Dank !!!
    Wo finde ich denn jetzt die Einstellungen für

    runde TAB
    länge TAB
    höhe TAB

    💖😇

  • Firefox 1:1 Backup auf neues Windows übertragen

    • GermanFreme82
    • 1. Mai 2025 um 21:38
    Zitat von .DeJaVu

    Letzteres sind eben die dedizierten Profile. Es wird zwar in den beiden Ini was hinterlegt, aber es gibt auch noch eine Sperre im Profil. Upgrade ja, Downgrade nein.

    LocalAppData ist schon länger nicht mehr notwendig. Es gab Zeiten, da hat manche Erweiterung dort auch Daten abgelegt, das ist aber eine Ewigkeit her.

    Sein Problem ist das automatische Update, was ihm derzeit ganz schnell die Nutzung der Scripte verhagelt. Wie hat Brokenheart es neckisch beschrieben?

    Zitat

    der Hamster braucht es wirklich "mundgerecht"

    Ich habe FF138 jetzt drauf und das ist nicht schlimm im virtuellen Windows da kann es machen was es will udn ich schrote das Ding, jetzt solange, bis es macht, was ich will.

    Das FF hat zu machen was ich will, ob es will, oder nicht.

    Ich brauche das alte Design nur noch zurück und das reinkopierne ging gut, also alles läuft wie gewohnt.

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 1. Mai 2025 um 21:30
    Zitat von Endor

    Hallo GermanFreme82
    Ne das schaff ich nicht. Ich brauche auch immer Hilfe....
    Ändere in Zeile 35 bei TabBar_Position die 0 auf 1, starte Firefox neu mit Cache leeren
    dann müsste die Tableiste wieder unten sein.
    Mfg.
    Endor

    Gibt es nicht diese Zeile finde ich nicht

    userChrome.css


    Zeile 35: /* Kontext-Menü / Einträge ausgeblendet */


    TabBar_Position = 1 ,// [0] = Above Toolbar Default
    // 1 = Under the toolbar
    // 2 = Under Site Content


    ??? Das auf 1 ja


    Jetzt ist die leiste wieder unten aber es fehlt das DEsign.

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 1. Mai 2025 um 19:53
    Zitat von Endor

    Hallo GermanFreme82
    Ne das schaff ich nicht. Ich brauche auch immer Hilfe....
    Ändere in Zeile 35 bei TabBar_Position die 0 auf 1, starte Firefox neu mit Cache leeren
    dann müsste die Tableiste wieder unten sein.
    Mfg.
    Endor

    Okay das werde ich ein wenig später versuchen.

    Was das DEsign betrifft so denke ich man könnte es findne in dem script aber ich weiß nur nicht wo ehheheh

  • Firefox 1:1 Backup auf neues Windows übertragen

    • GermanFreme82
    • 1. Mai 2025 um 17:46
    Zitat von grisu2099
    Zitat von GermanFreme82

    am "echten" PC mit FF137 weitermachen, bis FF138 richtig geht

    138 "geht" richtig! (Mittlerweile sogar 138.0.1!)

    ich weiß heheheh ich habe nur 137 und 138 geschrieben, weil ich keinen Bock hatte auf 0.1.2.3.4.5 udn so weiter 🤣

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 1. Mai 2025 um 17:45
    Zitat von Endor

    Sa die aktuelle Version des Scriptes auf Deutsch ist jetzt verfügbar:

    https://github.com/Endor8/userChr…LiteforFx.uc.js

    Mfg.
    Endor

    Hallo und liebe Grüße !

    Könntest du vielleicht einmal meine letzten Beiträge lesen und schauen, ob du eventuell in das letzte aktuelle Script die optischen Anpassung reinmachen könntest und die TAB-Leiste wieder unter die Adressleiste verschieben ?

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 1. Mai 2025 um 15:51
    Zitat von Mira_Belle

    GermanFreme82 Lösch' den Code wieder aus der "userChrome.css" !
    Ich weiß nicht weiter, warte auf 2002Andreas eventuell weiß er Rat.

    Okay mach ich dann sind dei TABs erstmal wieder da oben, aber es ist erstmal nur im virtuellen Windows defekt udn hier mache ich mit FF137 erstmal weiter.

    ... so gelöscht !

    Ich hoffe auch das 2002Andreas helfen kann sieht nämlich echt besch### so aus hehehe udn mein Design ist nur halb und halb drinnen.

  • Firefox 1:1 Backup auf neues Windows übertragen

    • GermanFreme82
    • 1. Mai 2025 um 15:48
    Zitat von .DeJaVu
    Zitat von GermanFreme82

    als wäre es mein PC

    Ist das jetzt dein neuer Rechner oder nicht?

    Ich habe 1x physisch meinen PC und 1x virtuell ein Windows (virtual Box) also JA alle beide gehören mir heheheh

    Ich möchte es alles nur in einer sicheren Umgebung testen udn erstmal am "echten" PC mit FF137 weitermachen, bis FF138 richtig geht. Danach führe ich die ganzen Dinge an meinem echten Windows aus.

  • Firefox 1:1 Backup auf neues Windows übertragen

    • GermanFreme82
    • 1. Mai 2025 um 15:40

    Also ich habe FF137 komplett gelöscht auf neuen PC
    Dann Ordner von meinem PC rüber kopiert Local, roaming, Programme
    Dann FF zum ersten mal gestartet und es geht.
    Danach macht FF137 ein Update auf FF138
    Geht immer noch alles bis auf das Script was im Arsch ist dieses "MultiRow" dingens

    Fazit:
    --------
    Ich kann am neuen PC jetzt alles rauf und runter zerstören wie ich möchte und alles testen, als wäre es mein PC
    Ziel erreicht denke ich heheheheh

    Achja nach dem Update auf FF138 war auch alles wie richtig installiert also gut würde ich sagen. Ich kann aber nicht alles testen mir fällt nicht alles ein was normalerweise so kaputt geht bei so eineim großen Update.

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 1. Mai 2025 um 15:35
    Zitat von Mira_Belle

    Trage den Code doch mal in die "userChrome.css" ein.
    Speichern und den Firefox neu starten.

    Habe ich gemacht sieht schlimm aus schau bitte einmal....



    ^^ TAB-Leiste dauerhaft da und leer und TABs sind geöffnet bei mir 3 Stk. aber die sind irgendwo im Jenseits nicht sichtbar.


    userChrome.css.txt

    ^^ Bitte prüfen sieht komisch aus ?????? Scheint irgendwie was dopplet zu sein keien Ahnung



    Tabs im Jenseits lol

  • Firefox 1:1 Backup auf neues Windows übertragen

    • GermanFreme82
    • 1. Mai 2025 um 15:29

    Update:
    -------------
    Habe FF nun vom neuen PC komplett gelöscht richtig mit extra Software nicht nur Windows Zeugs !
    Habe die Ordner einzeln reinkopiert und FF gestartet es ist jetzt alles da.

    Leider hat er gleich das Update auf FF138 gemacht, aber ich weiß nun was ich machen muss um es zu kopieren auf neuen PC.

    Beitrag bitte noch nicht schließen muss noch testen ob wirklich alles geht auf Dauer.

  • Firefox 1:1 Backup auf neues Windows übertragen

    • GermanFreme82
    • 1. Mai 2025 um 15:13
    Zitat von Mira_Belle

    Du hast den Firefox installiert!
    Befolge doch ganz einfach das, was ich geschrieben habe.
    Das geht! Selbst schon so gemacht.

    Ich versteh nicht ganz.
    Ich soll auf dem neuen PC FF installieren, oder nicht ?

    Ich habe auf dem neuen PC FF137.0.2 installiert (nicht gestartet) und dann alles gelöscht in den Ordnern udn meine Daten dann in "Local, Roaming, Programme" kopiert udn danach FF gestartet und das Profil war alles weiß Neu-Install nix da von meinen Sachen und er legt neues Profil an.

  • Firefox 1:1 Backup auf neues Windows übertragen

    • GermanFreme82
    • 1. Mai 2025 um 14:30
    Zitat von Mira_Belle

    Auf dem alten Rechner ganz einfach
    %ProgramFiles%\
    und den ganzen Installationsordner sichern!
    Sollte "Mozilla Firefox" sein.

    Dann
    %appdata%\
    und den kompletten Ordner "Mozilla" sichern.

    Einfach mit Zip oder WinRAR packen.

    Auf dem neuen Rechen dann, wenn Firefox installiert ist,
    Erst den Installationsordner löschen und dann durch die gesicherte Version ersetzen.
    :!:ACHTUNG:!:
    Den Firefox auf gar keinen Fall starten.
    Als nächstes ersetzt Du den kompletten Profilordner. ("Mozilla")

    Jetzt kannst Du den Firefox starten.
    Es sollte alles so sein, wie auf dem alten Rechner.

    Denke aber daran, auch das Update zu machen, wenn alles so ist, wie Du erwartest.

    Alles anzeigen

    Okay ich werde es versuchen.

    Ich habe bisher immer den Fehler gemacht, Firefox dann zuerst 1x zu starten.
    Habe alles so gemacht, aber es geht nicht alles nackt und er legt neues Profil an.

    Habe FF 137.0.2 Local, roaming,Programme bei mir kopiert und auf neuen PC FF137.0.2 isntalliert NICHT gestartet. Danach die Daten aus Local, Roaming und Programme reinkopiert und danach FF137.0.2 auf neuen PC zum ersten mal geöffnet. ER macht dann ein neues Profil und alle Daten von mir werden ignoriert.

    g432iqro.default-release
    0qoqc54j.default-release-1


    Was nun ?
    Soll ich alles nochmal in beide neuen Profile kopieren ?

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 1. Mai 2025 um 14:14
    Zitat von Mira_Belle

    Mit CSS kommst Du klar?

    CSS
        /*--------------------------------------------*/
        /****     Tabbar nach unten verschieben    ****/
        /*--------------------------------------------*/
        
        #navigator-toolbox {
            position: relative !important;
        /*    padding-bottom: calc( var(--tab-min-height) + 8px ); */               /*  44px */
            padding-bottom: 42px !important;
        }
        
        #TabsToolbar {
            position: absolute !important;
            display: block !important;
        }
    Alles anzeigen

    Das geht nicht ist immer noch oben, leider.


    AddonLeisteUnten.uc.txt
    F2URLLeiste.uc.txt
    F12Tabchließen.uc.txt
    HideTabbarWithOneTab.uc.txt
    MultiRowTab_Firefox107.txt
    PopUp.uc.txt
    RestartFirefoxButton2025.txt
    userChrome.txt
    userChrome.txt.js.txt



    ^^^Das ist drinnen bei mir

  • Firefox 1:1 Backup auf neues Windows übertragen

    • GermanFreme82
    • 1. Mai 2025 um 10:47

    Hallo liebe community !

    Könnt ihr mir bitte helfen dabei, ein 1:1 Backup von meinem Firefox 137.0.2 zu erstellen, damit ich es 1:1 wieder so starten kann an einem neuen PC ?

    Ich kopiere immer Local, Roaming und Programme Ordner und für die Daten jeweils in das neue Profil ein.
    Wenn ich FF dann öffne sind zwar alle Addons drinnen und aktiv, aber funktionieren nicht.
    Das sieht merkwürdig aus und ich bekomme es nicht mehr zum Laufen, wie es auf dem alten PC war.

    Mache ich beim Backup was falsch ?
    Wie kopiere ich die Daten richtig, damit es wieder wie früher ist am neuen PC ?

    Bitte keine Anleitungen Links posten, wo ich tagelang Standard XXX lesen muss, denn die Anleitungen habe ich des öfteren gesehen, aber helfen mit nicht wirklich weiter.

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 1. Mai 2025 um 10:22

    Das ist mein Design.

    Tab 8x pro Zeile, dann neue Zeile
    Tab rund
    Tab Breite
    Tab Höhe
    Tab Abstand
    Tab Farbe
    Tab keine Schatten, oder schwarze Ränder
    + Symbol Größe

    Ich versuche jetzt das neue Script, aber ich brauche dieses Design wieder und nur Jesus, oder der ERfinder weiß wo die Sachen stehen, ich nicht. Darum brauche ich bitte die Zeile mit Nummer im Script und was ich dort reinschreiben muss. Für mich ließt sich der Text im Script wie bablblablablablablabla.



    Neues Script geht, aber mein Design ist weg und die TAB Leiste irgendwo, nur nicht da wo sie sein muss.



    Ich möchte mein Design bitte zurück und Firefox soll machen, das die TAB-Leiste wieder unter der Adressleiste ist, so wie vorher. Wie bekomme ich die Änderungen dort rein und in welcher Zeile muss ich was schreiben ?

    Code einfügen hier verstehe ich nicht, darum poste ich die Datei geht schneller für mich.

    MultiRowTab_Firefox107.js.txt <=== aus Beitrag #973

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • GermanFreme82
    • 1. Mai 2025 um 09:31

    Hallo zusammen ich probiere das jetzt einmal im "virtuellen Windows" aus und melde mich danach gleich nochmal. ich versuche alle eure Kommentare zu beantworten für jeden einzeln. Ich brauche einen Moment dafür.

Unterstütze uns!

Jährlich (2025)

104,5 %

104,5% (679,10 von 650 EUR)

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