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

Beiträge von Endor

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

    • Endor
    • 1. November 2024 um 12:00

    Klasse. :thumbup:
    Vielen Dank.
    Mfg.
    Endor

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

    • Endor
    • 1. November 2024 um 11:56

    Hallo zusammen.
    Bitte testet mal dieses Script.
    Es fügt dem Rechtsklick Kontextmenü der Lesezeichen
    den Eintrag Lesezeichen Seitenleiste öffnen hinzu.
    Öffnet sich bei Euch die Seitenleiste?

    Code
    // ==UserScript==
    // @name           openSidebarContextMenu.uc.js
    // @namespace      http://space.geocities.yahoo.co.jp/gl/alice0775
    // @description    Seitenleiste über das Kontextmenü von Lesezeichen öffnen (einschließlich Suchergebnissen)
    // @description    Nachahmung von goParentFolder (Seitenleistenversion von openLibraryContextMenu.uc.js)
    // @include        main
    // @include        chrome://browser/content/places/places.xhtml
    // @include        chrome://browser/content/places/bookmarksSidebar.xhtml
    // @author         Alice0775
    // @compatibility  132
    // @version        2024/09/02 Bug 1916098 - Remove appcontent box.
    // @version        2024/05/05 Bug 1892965 - Rename Sidebar launcher and SidebarUI
    // @version        2023/01/10 Bug 1382992 - Remove the synchronous getFolderIdForItem()
    // @version        2021/12/24 remove menu in sidebar due to Bug 469441
    // @version        2021/06/22 remove document.popupNode
    // @version        2020/12/14 fix ucjs_expand_sidebar hack
    // @version        2020/12/14 simplify & ucjs_expand_sidebar hack
    // @version        2020/12/13 simplify
    // @version        2020/12/13 save folder state
    // @version        2020/12/12
    // ==/UserScript==
    
    
    var openSidebarContextMenu = {
      init: function () {
        this.db = this.openDB();
        var placesContext = document.getElementById("placesContext");
        if (!placesContext) return;
        if (location.href == "chrome://browser/content/places/bookmarksSidebar.xhtml") return;
          var menuitem = document.createXULElement("menuitem");
          menuitem.id = "placesContext_manageFolder3";
          menuitem.setAttribute("label", "Lesezeichen Seitenleiste öffnen");
          menuitem.setAttribute("accesskey", "L");
          menuitem.setAttribute("selectiontype", "single");
          menuitem.setAttribute("selection", "bookmark|folder|query|livemark/feedURI");
          menuitem.setAttribute("oncommand", "openSidebarContextMenu.showSidebar(this.parentNode.triggerNode);");
          var afterNode = placesContext.firstChild;
          placesContext.insertBefore(menuitem, afterNode);
      },
    
      showSidebar: function(atriggerNode) {
        let view = PlacesUIUtils.getViewForNode(atriggerNode);
        let node = view.selectedNode;
        let win = Services.wm.getMostRecentWindow("navigator:browser");
        win.SidebarController._show("viewBookmarksSidebar").then(() => {
          let sidebarWin = win.SidebarController.browser.contentWindow;
          sidebarWin.openSidebarContextMenu.show(node);
    
          // xxx ucjs_expand_sidebar hack
          if (typeof win.ucjs_expand_sidebar != "undefined" ) {
            win.SidebarController._box.collapsed = false;
    	      win.SidebarController._splitter.hidden = false;
            win.ucjs_expand_sidebar._opend = true;
            win.ucjs_expand_sidebar._loadKeepItSizes("viewBookmarksSidebar");
            if (win.ucjs_expand_sidebar._FLOATING_SIDEBAR) {
              let x = win.document.getElementById("tabbrowser-tabbox").getBoundingClientRect().x;
              win.ucjs_expand_sidebar._sidebar_box.style.setProperty("left", x + "px", "");
            }
          }
          /// xxx
        });
      },
    
      show: function(node) {
        let delay = 0;
        let tree = document.getElementById("bookmarks-view");
        if (document.getElementById("search-box").value) {
          document.getElementById("search-box").value = "";
          tree.place = tree.place;
          delay = 250;
        }
        let guid = node.bookmarkGuid
        setTimeout(() => {
          let aFolderItemId = openSidebarContextMenu.getFolderIdForItem(node.itemId);
          if (aFolderItemId) {
            tree.selectItems([guid]);
          } else {
            return;
          }
    
          // xxx
          this.xulStore(tree);
    
          let index = tree.currentIndex;
          if (tree.view.isContainer(index)) {
            if (!tree.view.isContainerOpen(index)) {
              tree.view.toggleOpenState(index);
            }
            let e = tree.view.selection.currentIndex
            tree.scrollToRow(e)
          } else {
            tree.ensureRowIsVisible(index);
          }
          tree.focus();
        }, delay);
      },
    
      xulStore: function(tree) {
        let docURI = tree.ownerDocument.documentURI;
        let view = tree.view;
        let node = view.nodeForTreeIndex(tree.currentIndex);
    
    
        var parent = node.parent;
        if (parent) {
          // Build a list of all of the nodes that are the parent of this one
          // in the result.
          var parents = [];
          var root = tree.result.root;
          while (parent && parent != root) {
            parents.push(parent);
            parent = parent.parent;
          }
    
          // Walk the list backwards (opening from the root of the hierarchy)
          // opening each folder as we go.
          for (var i = parents.length - 1; i >= 0; --i) {
            let index = view.treeIndexForNode(parents[i]);
            if (index != -1 && view.isContainer(index)) {
              let node = view._rows[index];
              let uri = node.uri;
              if (node.containerOpen) {
                Services.xulStore.setValue(docURI, uri, "open", "true");
              } else {
                Services.xulStore.removeValue(docURI, uri, "open");
              }
            }
          }
        }
      },
    
      getFolderIdForItem: function(aItemId) {
        let sql = `SELECT b.id, h.url, b.title, b.position, b.fk, b.parent AS folderId, b.type, 
                   b.dateAdded, b.lastModified, b.guid, t.guid, t.parent, 
                   b.syncStatus 
                   FROM moz_bookmarks b 
                   LEFT JOIN moz_bookmarks t ON t.id = b.parent 
                   LEFT JOIN moz_places h ON h.id = b.fk 
                   WHERE b.id = :item_id`;
        let stmt = this.db.createStatement(sql);
        stmt.params['item_id'] = aItemId;
        let FolderId = null;
        try {
          while (stmt.executeStep()) {
            FolderId = stmt.row.folderId;
          }
        } finally {
          stmt.finalize();
        }
        return FolderId;
      },
    
      openDB: function() {
        /*
        let targetPath = PathUtils.join(
          PathUtils.profileDir,
          "places.sqlite"
        );
        let file = new FileUtils.File(targetPath);
        return Services.storage.openDatabase(file);
        */
        return PlacesUtils.history.DBConnection;
      }
    }
    openSidebarContextMenu.init();
    Alles anzeigen

    Wenn alles passt lade ich es dann bei mir hoch.
    Mfg.
    Endor

  • ExtraConfigMenu.uc.js funktioniert nicht mehr

    • Endor
    • 31. Oktober 2024 um 14:54
    Zitat von Boersenfeger

    Danke, interner Fehler

    Ok. ;)
    Danke für die Info.
    Mfg.
    Endor

  • ExtraConfigMenu.uc.js funktioniert nicht mehr

    • Endor
    • 31. Oktober 2024 um 14:49

    Hallo Boersenfeger
    Tut hier auch was es soll.
    Stell mal deine Version rein.
    Mfg.
    Endor

  • MultiRowTabsLiteforFx – Fehlersuche und Kompaktierung

    • Endor
    • 31. Oktober 2024 um 14:27

    Hallo zusammen. War einige Tage beruflich weg. Daher erst heute die deutsche Version
    des aktuellen Scripts. Der Autor hat übrigens den CSS Teil zum Ausblenden der Alle Tabsschaltfläche
    aus der Tableiste entfernt weil man die jetzt ja mit Rechtsklick usw. entfernen kann.

    Script siehe hier:

    userChrome.js/Multirowtabs/Firefox 133/MultiRowTabLiteforFx.uc.js at master · Endor8/userChrome.js
    Skripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.
    github.com

    Mfg.
    Endor

  • MultiRowTabsLiteforFx – Fehlersuche und Kompaktierung

    • Endor
    • 7. Oktober 2024 um 17:34

    Hallo FuchsFan an .
    Danke für die Info.
    Diese Version scheint aber nur für Firefox 128esr zu sein.
    Optionen für Firefox 132 fehlen hier.

    Siehe Beschreibung auf Deiner verlinkten Seite:

    Code
    MultiRowTabLiteforFx.uc.js: Enthält Firefox128esr-Multi-Tab-Skript. _____Öffnen Sie „MultiRowTabLiteforFx.uc.js“ mit Notepad usw. und stellen Sie es nach Ihren Wünschen ein. _____2024/10/07___Als die Position der Tab-Leiste geändert wurde, funktionierte „Uploader [bbs2chreader] Refuge SearchWP (esr115)“ nicht mehr. Nachdem ich einen Bericht wie diesen gesehen hatte, stellte ich fest, dass das Problem an der Art und Weise lag, wie die Symbolleisten neu angeordnet wurden, und wechselte daher zu einer anderen Methode. Ich habe bei „esr, Developer, Nightly“ nachgefragt und es hat funktioniert, also denke ich, dass es in Ordnung ist. _____Sie waren eine Zeit lang bis zur Version vom 24.09.30 zusammen, aber mit der Änderung in 133 wurden „#toolbar-menubar“ und „#TabsToolbar“ zu untergeordneten Elementen von „#navigator-toolbox“, also habe ich beschlossen, sie zu trennen . Die Teile im Zusammenhang mit vertikalen Tabs, die in 128esr noch nicht vorhanden sind, wurden gelöscht.

    Übersetzung von Goggle.
    Mfg.
    Endor

  • MultiRowTabsLiteforFx – Fehlersuche und Kompaktierung

    • Endor
    • 5. Oktober 2024 um 16:15

    TheRave

    Wenn Du den Unterstrich meinst den habe ich eingefügt.
    Den hat der Autor anscheinend vergessen.

    Mfg.
    Endor

  • Was hört Ihr gerade?

    • Endor
    • 4. Oktober 2024 um 19:27

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

  • Der Glückwunsch-Thread

    • Endor
    • 2. Oktober 2024 um 07:40

    Hallo Horstmann!

    Auch von mir alles alles Gute zum Geburtstag.
    Vor allem viel Gesundheit, aber auch viel Glück und
    Wohlergehen wünsche ich Dir von ganzen Herzen.
    Mfg.
    Endor

  • MultiRowTabsLiteforFx – Fehlersuche und Kompaktierung

    • Endor
    • 1. Oktober 2024 um 10:30

    Hallo Herzmann .
    Der Autor hat wieder aktualisiert.
    Hier wieder die Deutsche Version:

    userChrome.js/Multirowtabs/Firefox 131 at master · Endor8/userChrome.js
    Skripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.
    github.com

    Mfg.
    Endor

  • In memoriam

    • Endor
    • 30. September 2024 um 07:31

    Kris Kristofferson ist tot.

    US-Star Kris Kristofferson ist tot
    Er gilt als einer der bedeutendsten Songwriter aller Zeiten, schrieb Hits für Janis Joplin und Elvis. Außerdem war er in Hollywood erfolgreich: Am Samstag ist…
    www.tagesschau.de

    R.I.P.

    Mfg.
    Endor

  • Mein Sidebar Script funktioniert seit einiger Zeit nicht mehr. Was muss angepasst werden? Gibt es bessere Alternativen?

    • Endor
    • 29. September 2024 um 07:32

    Hallo juras

    Alternativ gebe es vom selben Autor dieses Script:

    userChrome.js/130/SidebarModoki.uc.js at master · alice0775/userChrome.js
    Contribute to alice0775/userChrome.js development by creating an account on GitHub.
    github.com


    Mfg.
    Endor

  • "Neues", altes Appmenu. Update, und bräuchte Hilfe!

    • Endor
    • 20. September 2024 um 20:04

    Hallo Mira_Belle .
    Prima das freut mich, dass er dir weiter geholfen hat.
    Dass es etwas länger dauern würde wusste ich schon.
    Er ist auch Berufstätig und das geht halt vor.
    Bin schon gespannt auf dein Ergebnis.
    Mfg.
    Endor

  • "Neues", altes Appmenu. Update, und bräuchte Hilfe!

    • Endor
    • 17. September 2024 um 19:28

    Hallo Mira_Belle!

    Wirklich schade.
    jizz hat da auch ein eigenes Script usw.
    Vielleicht schaust Du Dir das mal an:

    FirefoxCustomize/userChromeJS/addMenuPlus at master · benzBrake/FirefoxCustomize
    Ryan 收集的 Firefox 个性化相关资源. Contribute to benzBrake/FirefoxCustomize development by creating an account on GitHub.
    github.com

    Mfg.
    Endor

  • MultiRowTabsLiteforFx – Fehlersuche und Kompaktierung

    • Endor
    • 16. September 2024 um 17:34

    Hallo FuchsFan.
    Ja hatte ich schon gesehen. Deutsche Version ist auch fertig.

    userChrome.js/Multirowtabs/Firefox 131 at master · Endor8/userChrome.js
    Skripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.
    github.com

    Mfg.
    Endor

  • MultiRowTabsLiteforFx – Fehlersuche und Kompaktierung

    • Endor
    • 11. September 2024 um 20:05
    Zitat von Herzmann

    Wäre es nicht schlauer, die Dateien auf Dein GitHub-Konto hochzuladen

    Ja das werde ich auch so machen.
    Gemacht! Siehe oben.
    Mfg.
    Endor

  • MultiRowTabsLiteforFx – Fehlersuche und Kompaktierung

    • Endor
    • 11. September 2024 um 10:14

    Hallo Herzmann
    Der Autor hat wieder aktualisiert siehe hier:

    userChrome.js/Multirowtabs/Firefox 131 at master · Endor8/userChrome.js
    Skripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.
    github.com

    Ich habe im Kopfbereich mal Versions Info eingefügt.
    // @version        2024/09/11 12:00 Firefox 131+
    So lassen sich dann die neuen Versionen leichter unterscheiden.
    Mfg.
    Endor

  • In memoriam

    • Endor
    • 10. September 2024 um 11:31

    R.I.P.

    Mfg.
    Endor

  • MultiRowTabsLiteforFx – Fehlersuche und Kompaktierung

    • Endor
    • 10. September 2024 um 11:30
    Zitat von Herzmann

    Schade, dass er sich nicht mal "persönlich" meldet.

    Ja das finde ich auch.
    Mfg.
    Endor

  • MultiRowTabsLiteforFx – Fehlersuche und Kompaktierung

    • Endor
    • 10. September 2024 um 08:36

    Herzmann Der Autor hat wieder aktualisiert.
    Hier die aktuelle Version:

    CSS
    // ==UserScript==
    // @name           zzzz-MultiRowTab_LiteforFx48.uc.js
    // @namespace      http://space.geocities.yahoo.co.jp/gl/alice0775
    // @description    Mehrzeilige Tableiste - Experimentelle CSS Version
    // @include        main
    // @compatibility  Firefox 128esr Firefox 131+
    // @author         Alice0775
    // @version        2016/08/05 00:00 Firefox 48
    // @version        2016/05/01 00:01 hide favicon if busy
    // @version        2016/03/09 00:01 Bug 1222490 - Actually remove panorama for Fx45+
    // @version        2016/02/09 00:01 workaround css for lwt
    // @version        2016/02/09 00:00
    // ==/UserScript==
    "use strict";
    
    MultiRowTabLiteforFx();
    function MultiRowTabLiteforFx() {
    if (!window.gBrowser) { return; }
    
        // -- Config --
    
        const                                        // Anzahl der Tab-Leistenzeilen angeben, oder unbegrenzte Anzahl von Zeilen wählen.
        TabBar_Rows =                      	false	,// [false] = unbegrenzt
                                                     // true    = Begrenzte Tabzeilen - Anzahl der Zeilen angeben
        Max_Rows =                      	3		,// Tabzeilen angeben (Standard: 3 Zeilen)
    
                                                     // ProtonUI Erscheinungsbild der Tabs ändern
        ProtonUI =                         	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.
                                                     //          Leerraum um die Tabs auf 0 anpassen, um der Höhe der UI-Dichte zu entsprechen.
    
                                                     // Position der Tab-Leiste.
        TabBar_Position =                  	0		,// [0] = Standard
                                                     // 1   = unter der Symbolleiste
                                                     // 2   = unter dem Fenster
    
                                                     // Standardposition der Tableiste Blenden Sie die Titelleistenschaltfläche [-□×] 
    												 // aus und verwenden Sie die Breite der Tableiste entsprechend
        TitleBar_Button_Autohide =         	false	,// [false] = Aktiviert
                                                     //  true   = Deaktiviert
                                                     // Äußeren Rahmen der Titelleistenschaltfläche [-□×] reduzieren und transparent machen.
    												 // Obere rechte Ecke der Tab-Leiste auf ihre ursprüngliche Größe zurücksetzen und Transparenz aufheben.
    
                                                     // Tab-Höhe „UI-Dichte“
        UI_Density_Compact =               	29		,// Standard = 29 Pixel bei Kompakt
        UI_Density_Normal =                	36		,// Standard = 36 Pixel bei Normal
        UI_Density_Touch =                 	41		,// Standard = 41 Pixel bei Touch
                                                     // Entsprechender CSS Code in UserChrome.css wird vorrangig behandelt!
    
                                                     // Tab-Breite
                                                     // Bei gleichen Werten bei Min und Max, wird Tabbreite fixiert!
        Tab_Min_Width =                    	76		,// Standard - Mindestwert = 76px
        Tab_Max_Width =                    	225		,// Standard - Maxwert = 225px
                                                     // Entsprechender CSS Code in UserChrome.css wird vorrangig behandelt!
    
                                                     // .Tab-Drop-Indikator-Icon-Ersetzung.
        Tab_Drop_Indicator =               	false	,// [false] = Stecknadel Symbol 📍
                                                     // true    = Rote Linie (2px × 29px) als Symbol
    
                                                     // 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.
    
                                                     // Tab-Leisten-Ziehbereich
        Left_Drag_Area =                   	0		,// Linker Ziehbereich Breite: Standard 40 Pixel
        Right_Drag_Area =                  	0		,// Rechter Ziehbereich Breite: Standard 40 Pixel
        Window_Maximize_Left_Drag_Area =   	false	,// true = Linken Ziehbereich bei maximiertem Fenster anzeigen. Standardmäßig ausgeblendet.
        Fullscreen_Drag_Area =             	false	,// true = Linken und rechten Ziehbereich bei Vollbild anzeigen. Standardmäßig ausgeblendet.
    
                                                     // Angeheftete Tabs neu positionieren
        Separate_Tabs_and_PinnedTabs =     	false	,// [false] = Standard
                                                     // true    = Angeheftete Tabs von der Tab-Leiste lösen und in die darüber liegende Zeile verschieben.
    
                                                     // „Tab schließen“ Schaltfläche .
        Tab_Close_Button =                 	0		,// [0] = Standard
                                                     //  1  = Ausgeblendet
                                                     //  2  = Auf allen Tabs anzeigen
    												 //  3  = Nur bei Mausberührung anzeigen
    
                                                     // Alle Tabs Schaltfläche
        All_Tabs_Button =                  	false	,// [false] = ausblenden
                                                     // true    = anzeigen
    
        // -- Config End --
    
        css = `
    
        #TabsToolbar {
    
          :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; }
    
          ${Tab_Drop_Indicator ? `
            #tabbrowser-tabs > .tab-drop-indicator {
              background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAdCAIAAAAPVCo9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY3growJEQ5+SUQEAOb1EM8kwskcAAAAASUVORK5CYII=) no-repeat center !important;
            }
          ` : ``}
    
          .titlebar-spacer[type="pre-tabs"] {
            width: ${Left_Drag_Area}px !important;
          }
    
          .titlebar-spacer[type="post-tabs"] {
            width: ${Right_Drag_Area}px !important;
          }
    
          ${Window_Maximize_Left_Drag_Area ? `
            .titlebar-spacer {
              :root:not([sizemode="normal"], [inFullscreen]) &[type="pre-tabs"] {
                display: block !important;
              }
            }
          ` : ``}
    
          ${Fullscreen_Drag_Area ? `
            .titlebar-spacer {
              :root[inFullscreen] &, :root:not([tabsintitlebar]) & {
                display: block !important;
              }
            }
          ` : ``}
    
          #tabbrowser-arrowscrollbox {
            &::part(scrollbox) {
    
              &:has(+ spacer) > slot,
              .scrollbox-clip > & {
                flex-wrap: wrap;
              }
    
              ${TabBar_Rows ? `
                max-height: calc((var(--tab-min-height) + ${ProtonUI ? 8 : 0}px) * ${Max_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 ? `
              &::part(scrollbox) {
                &:has(+ spacer) > slot::after,
                .scrollbox-clip > &::after {
                  display: flow-root list-item;
                  content: "";
                  flex-basis: -moz-available;
                  height: 0;
                  overflow: hidden;
                }
              }
              .tabbrowser-tab:not([pinned]) {
                #tabbrowser-tabs[haspinnedtabs] & {
                  &, & + :not(#tabs-newtab-button) {
                    order: 1;
                  }
                }
              }
            ` : ``}
    
            .tabbrowser-tab[fadein]:not([pinned]) {
              --tab-min-width: ${Tab_Min_Width}px;
              --tab-max-width: ${Tab_Max_Width}px;
              max-width: var(--tab-max-width);
    
              ${Tab_Close_Button !== 0 ? `
                ${Tab_Close_Button === 1 ? `
                  .tab-close-button {
                    display: none !important;
                  }
                ` : Tab_Close_Button === 2 ? `
                  .tab-close-button {
    			    display: block !important;
                  }
                ` : Tab_Close_Button === 3 ? `
                  .tab-close-button {
                    opacity: 0;
                  }
                  &:hover .tab-close-button {
                    opacity: 1;
                    display: block !important;
                  }
                ` : ``}
              ` : ``}
            }
    
            #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]):not([orient="vertical"]) > & > .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) {
              margin-inline-start: 0 !important;
            }
    
          }
    
          ${ProtonUI ? `` : `
            .toolbarbutton-1 {
              margin: 0 !important;
              padding: 0 !important;
            }
            .tabbrowser-tab,
            #tabs-newtab-button {
              height: var(--tab-min-height);
              padding: 0 !important;
            }
            .tab-background {
              box-shadow: none !important;
              margin-block: 0 !important;
            }
            .tabbrowser-tab[usercontextid] > .tab-stack > .tab-background > .tab-context-line {
              margin: 1px 2px 0 !important;
            }
          `}
    
          ${Tab_Separators ? `
            .titlebar-spacer[type="pre-tabs"] {
              border-inline-end: 1px solid color-mix(in srgb, currentColor 20%, transparent);
            }
            .tabbrowser-tab::after,
            .tabbrowser-tab::before {
              border-left: 1px solid color-mix(in srgb, currentColor 50%, transparent);
              height: calc(var(--tab-min-height) - 15%);
              margin-block: auto;
            }
            .tabbrowser-tab:hover::after,
            .tabbrowser-tab[multiselected]::after,
            #tabbrowser-tabs:not([movingtab]) .tabbrowser-tab:has(+ .tabbrowser-tab:hover)::after,
            #tabbrowser-tabs:not([movingtab]) .tabbrowser-tab:has(+ [multiselected])::after {
              height: 100%;
            }
            .tabbrowser-tab::after,
            #tabbrowser-tabs[movingtab] .tabbrowser-tab[visuallyselected]::before {
              content: "";
              display: block;
            }
          ` : ``}
    
          ${All_Tabs_Button ? `` : `
            #alltabs-button {
              display: none;
            }
          `}
    
        }
    
        ${TabBar_Position === 0 ? `
          #TabsToolbar {
            .titlebar-buttonbox-container {
              height: calc(var(--tab-min-height) + ${ProtonUI ? 8 : 0}px);
              margin-bottom: 0 !important;
    
              ${TitleBar_Button_Autohide ? `
                background-color: color-mix(in srgb, currentColor 20%, transparent);
                height: 6px;
                opacity: 0;
                position: fixed;
                right: 0;
                z-index: 2147483647;
                .titlebar-button {
                  opacity: 0;
                  padding: 0;
                }
                &:hover {
                  height: calc(var(--tab-min-height) + ${ProtonUI ? 8 : 0}px);
                  opacity: 1;
                  .titlebar-button {
                    opacity: 1;
                    padding: 8px 17px;
                  }
                }
              ` : ``}
    
            }
          }
        ` : `
          #nav-bar {
            :root:not([inFullscreen]) #toolbar-menubar:not([inactive]) + & > .titlebar-buttonbox-container {
              display: none;
            }
            .titlebar-button {
              padding-block: 0 !important;
            }
          }
        `}
    
        ${TabBar_Position !== 2 ? `` : `
          body {
            & > #fullscr-toggler[hidden] + tabbox,
            :root[inFullscreen] & > tabbox:hover {
              border-top: 0.5px solid var(--toolbar-bgcolor);
            }
            & > tabbox > #navigator-toolbox {
              border-block: none !important;
            }
            :root[inFullscreen] & {
              & > #navigator-toolbox {
                transition: none;
                &:has(~ tabbox:hover) {
                  margin-top: 0 !important;
                }
                &:hover ~ tabbox > #navigator-toolbox {
                  max-height: 100%;
              }}
              & > tabbox:not(:hover) {
                border-top: .5px solid transparent;
                & > #navigator-toolbox {
                  max-height: 0;
                }
              }
            }
          }
        `}
    
        `,
        sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
        uri = Services.io.newURI("data:text/css;charset=UTF=8," + encodeURIComponent(css));
        if (TabBar_Rows == false) {
          ["0", "2"].find(type => {
            if(sss.sheetRegistered(uri, type)) sss.unregisterSheet(uri, type); sss.loadAndRegisterSheet(uri, type);
          });
        } else {
          ["0", "2", "SSTabRestored", "TabMove", "TabOpen", "TabSelect"].find(type => {
            if(sss.sheetRegistered(uri, type)) sss.unregisterSheet(uri, type); sss.loadAndRegisterSheet(uri, type);
            gBrowser.tabContainer.addEventListener(type, (e) => { e.target.scrollIntoView({ block: "nearest" }); });
          });
        }
    
        if (TabBar_Position !== 0) {
          if (TabBar_Position === 1) {
            document.getElementById("navigator-toolbox").prepend(
              document.getElementById("toolbar-menubar"),
              document.getElementById("nav-bar"),
              document.getElementById("PersonalToolbar"),
              document.getElementById("titlebar"),
            );
          } else {
            document.getElementById("navigator-toolbox").prepend(
              document.getElementById("toolbar-menubar"),
              document.getElementById("nav-bar"),
              document.getElementById("PersonalToolbar"),
            );
          }
          document.getElementById("nav-bar").appendChild(
            document.querySelector("#TabsToolbar > .titlebar-buttonbox-container")
          );
        }
    
        if (TabBar_Position === 2) {
          document.body.appendChild(
            document.createXULElement("tabbox")
          ).appendChild(
            document.importNode(document.getElementById("navigator-toolbox"))
          ).appendChild(
            document.getElementById("titlebar")
          );
        }
    
        gBrowser.tabContainer.addEventListener("dragover", function(event) { this._on_dragover(event); }, false)
        gBrowser.tabContainer.addEventListener("drop", function(event) { this._on_drop(event); }, false)
    
        gBrowser.tabContainer.on_dragover = function(event) { return false; }
        gBrowser.tabContainer.on_drop = function(event) { return false; }
    
        gBrowser.tabContainer._on_dragover = function(event) {
          var effects = this.getDropEffectForTabDrag(event);
    
          var ind = this._tabDropIndicator;
          if (effects == "" || effects == "none") {
            ind.hidden = true;
            return;
          }
          event.preventDefault();
          event.stopPropagation();
    
          if (effects == "link") {
            let tab = this._getDragTargetTab(event, { ignoreTabSides: true });
            if (tab) {
              if (!this._dragTime) {
                this._dragTime = Date.now();
              }
              if (Date.now() >= this._dragTime + this._dragOverDelay) {
                this.selectedItem = tab;
              }
              ind.hidden = true;
              return;
            }
          }
    
          let tabRect, rect = this.arrowScrollbox.getBoundingClientRect(),
          newIndex = this._getDropIndex(event),
          newMarginX = ind.clientWidth / 2 - rect.left +
            ((newIndex === this.allTabs.length)
              ? (tabRect = this._getVisibleTabs().at(-1).getBoundingClientRect()).right												 
              : (tabRect = this.allTabs[newIndex].getBoundingClientRect()).left),
            newMarginY = tabRect.top - rect.top + tabRect.height / 2 - rect.height / 2;
    
          ind.hidden = false;
          ind.style.transform = "translate(" + Math.round(newMarginX) + "px," + Math.round(newMarginY) + "px)";
        }
    
        gBrowser.tabContainer._on_drop = function(event) {
          var dt = event.dataTransfer;
          var dropEffect = dt.dropEffect;
          var draggedTab;
          let movingTabs;
          if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
            // tab copy or move
            draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
            // not our drop then
            if (!draggedTab) {
              return;
            }
            movingTabs = draggedTab._dragData.movingTabs;
            draggedTab.container._finishGroupSelectedTabs(draggedTab);
          }
    
          this._tabDropIndicator.hidden = true;
          event.stopPropagation();
          if (draggedTab && dropEffect == "copy") {
            // copy the dropped tab (wherever it's from)
            let newIndex = this._getDropIndex(event);
            let draggedTabCopy;
            for (let tab of movingTabs) {
              let newTab = gBrowser.duplicateTab(tab);
              gBrowser.moveTabTo(newTab, newIndex++);
              if (tab == draggedTab) {
                draggedTabCopy = newTab;
              }
            }
            if (draggedTab.container != this || event.shiftKey) {
              this.selectedItem = draggedTabCopy;
            }
          } else if (draggedTab && draggedTab.container == this) {
            let oldTranslate = Math.round(draggedTab._dragData.translatePos);
            let tabSize = Math.round(draggedTab._dragData.tabSize);
            let translateOffset = oldTranslate % tabSize;
            let newTranslate = oldTranslate - translateOffset;
            if (oldTranslate > 0 && translateOffset > tabSize / 2) {
              newTranslate += tabSize;
            } else if (oldTranslate < 0 && -translateOffset > tabSize / 2) {
              newTranslate -= tabSize;
            }
    
            let dropIndex;
            if (draggedTab._dragData.fromTabList) {
              dropIndex = this._getDropIndex(event);
            } else {
              dropIndex = this._getDropIndex(event);
             // "animDropIndex" in draggedTab._dragData &&
             // draggedTab._dragData.animDropIndex;
            }
            let incrementDropIndex = true;
            if (dropIndex && dropIndex > movingTabs[0]._tPos) {
              dropIndex--;
              incrementDropIndex = false;
            }
    
            if (oldTranslate && oldTranslate != newTranslate && !gReduceMotion) {
              for (let tab of movingTabs) {
                tab.toggleAttribute("tabdrop-samewindow", true);
                tab.style.transform = this.verticalMode
                  ? "translateY(" + newTranslate + "px)"
                  : "translateX(" + newTranslate + "px)";
                let postTransitionCleanup = () => {
                  tab.removeAttribute("tabdrop-samewindow");
    
                  this._finishAnimateTabMove();
                  if (dropIndex !== false) {
                    gBrowser.moveTabTo(tab, dropIndex);
                    if (incrementDropIndex) {
                      dropIndex++;
                    }
                  }
    
                  gBrowser.syncThrobberAnimations(tab);
                };
                if (gReduceMotion) {
                  postTransitionCleanup();
                } else {
                  let onTransitionEnd = transitionendEvent => {
                    if (
                      transitionendEvent.propertyName != "transform" ||
                      transitionendEvent.originalTarget != tab
                    ) {
                      return;
                    }
                    tab.removeEventListener("transitionend", onTransitionEnd);
    
                    postTransitionCleanup();
                  };
                  tab.addEventListener("transitionend", onTransitionEnd);
                }
              }
            } else {
              this._finishAnimateTabMove();
              if (dropIndex !== false) {
                for (let tab of movingTabs) {
                  gBrowser.moveTabTo(tab, dropIndex);
                  if (incrementDropIndex) {
                    dropIndex++;
                  }
                }
              }
            }
          } else if (draggedTab) {
            // Move the tabs. To avoid multiple tab-switches in the original window,
            // the selected tab should be adopted last.
            const dropIndex = this._getDropIndex(event);
            let newIndex = dropIndex;
            let selectedTab;
            let indexForSelectedTab;
            for (let i = 0; i < movingTabs.length; ++i) {
              const tab = movingTabs[i];
              if (tab.selected) {
                selectedTab = tab;
                indexForSelectedTab = newIndex;
              } else {
                const newTab = gBrowser.adoptTab(tab, newIndex, tab == draggedTab);
                if (newTab) {
                  ++newIndex;
                }
              }
            }
            if (selectedTab) {
              const newTab = gBrowser.adoptTab(
                selectedTab,
                indexForSelectedTab,
                selectedTab == draggedTab
              );
              if (newTab) {
                ++newIndex;
              }
            }
    
            // Restore tab selection
            gBrowser.addRangeToMultiSelectedTabs(
              gBrowser.tabs[dropIndex],
              gBrowser.tabs[newIndex - 1]
            );
          } else {
            // Pass true to disallow dropping javascript: or data: urls
            let links;
            try {
              links = browserDragAndDrop.dropLinks(event, true);
            } catch (ex) {}
    
            if (!links || links.length === 0) {
              return;
            }
    
            let inBackground = Services.prefs.getBoolPref(
              "browser.tabs.loadInBackground"
            );
            if (event.shiftKey) {
              inBackground = !inBackground;
            }
    
            let targetTab = this._getDragTargetTab(event, { ignoreTabSides: true });
            let userContextId = this.selectedItem.getAttribute("usercontextid");
            let replace = !!targetTab;
            let newIndex = this._getDropIndex(event);
            let urls = links.map(link => link.url);
            let csp = browserDragAndDrop.getCsp(event);
            let triggeringPrincipal =
              browserDragAndDrop.getTriggeringPrincipal(event);
    
            (async () => {
              if (
                urls.length >=
                Services.prefs.getIntPref("browser.tabs.maxOpenBeforeWarn")
              ) {
                // Sync dialog cannot be used inside drop event handler.
                let answer = await OpenInTabsUtils.promiseConfirmOpenInTabs(
                  urls.length,
                  window
                );
                if (!answer) {
                  return;
                }
              }
    
              gBrowser.loadTabs(urls, {
                inBackground,
                replace,
                allowThirdPartyFixup: true,
                targetTab,
                newIndex,
                userContextId,
                triggeringPrincipal,
                csp,
              });
            })();
          }
    
          if (draggedTab) {
            delete draggedTab._dragData;
          }
        }
    
    };
    Alles anzeigen

    Mfg.
    Endor

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