grade Update
Danke!
grade Update
Danke!
Bei mir hat die Nightly gerade das default-Profil zerschossen...Bei euch auch?
Finger weg von der momentanen Nightly...
The Hungry Giant
🫎️🛒💰
Micha Kemner ist tot. Er war ein Teil meiner jugendlichen Subkultur.
Hat es übrigens jemand geschafft, ::part(scrollbutton-up) etc. für die Lesezeichen Popups mit der userChromeShadow.css zu manipulieren?
Leider nur auf diesem Weg:
In dem Sinne auch sowas; das Problem ist, dass initial nicht greift (den nativen Wert benutzt), wenn eine Variable nicht ausdrücklich gesetzt ist, zB wenn man --ug-scroller_hoverbgcolor: orange; ganz oben löscht.
Es funzt, siehe Scrollbuttons in der Tableiste (die einen Wert haben müssen, da die Var nicht gefunden wird).
Das sind für mich "Böhmische Wälder".
Ich meinte diese Möglichkeit (gehört in die userChrome.css):
#PlacesToolbar menupopup{
--uc-background-color: green;
}
scrollbox {
background-color: var(--uc-background-color,initial);
}
oder besser:
#PlacesToolbar menupopup{
--mp-background-color: green;
--mp-background-color-over: blue;
}
#scrollbutton-down,
#scrollbutton-up {
background-color: var(--mp-background-color,initial);
}
#scrollbutton-down:hover,
#scrollbutton-up:hover {
background-color: var(--mp-background-color-over,initial);
}
Alles anzeigen
falls das mal jemand testen möchte
Was hat das denn mit dem originalen Script zu tun? Eigenes Thema?
Das ist 'shadowroot' und deshalb auch nur in der userChromeShadow.css auseinander zuhalten (Hier mal 'meine' mit genau dieser Problematik [meine user-Variablen müssen selbstverständlich ersetzt werden]) als Beispiel:
/*■■■■■■■■■■■■■■■■scrollbuttons tableiste■■■■■■■■■■■■■■■■■■■■■■■■■*/
#tabbrowser-arrowscrollbox::part(scrollbutton-up),
#tabbrowser-arrowscrollbox::part(scrollbutton-down) {
appearance: none !important;
background-color: var(--uc-color-theme-grey) !important;
box-shadow: var(--uc-shadow-tabs-border-bottom) !important;
border: 0 !important;
border-radius: 0 !important;
width: 28px !important;
min-width: 28px !important;
max-width: 28px !important;
height: var(--uc-tabs-height) !important;
min-height: var(--uc-tabs-height) !important;
max-height: var(--uc-tabs-height) !important;
overflow: hidden !important;
padding-top: 0px !important;
padding-bottom: 0px !important;
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
#tabbrowser-arrowscrollbox::part(scrollbutton-up):hover,
#tabbrowser-arrowscrollbox::part(scrollbutton-down):hover {
appearance: none !important;
background-color: var(--button-hover-bgcolor) !important;
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
#tabbrowser-arrowscrollbox {
&::part(scrollbutton-up), &::part(scrollbutton-down) {
--arrowscrollbox-scrollicon-hover-background-color: unset !important;
--arrowscrollbox-scrollicon-active-background-color: unset !important;
}
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
#tabbrowser-arrowscrollbox::part(scrollbutton-up),
#tabbrowser-arrowscrollbox::part(scrollbutton-down) {
fill: var(--uc-color-green-font) !important;
fill-opacity: 1.0 !important;
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
#tabbrowser-arrowscrollbox::part(scrollbutton-up):hover,
#tabbrowser-arrowscrollbox::part(scrollbutton-down):hover {
fill: var(--uc-color-theme-font) !important;
fill-opacity: 1.0 !important;
}
#tabbrowser-arrowscrollbox[scrolledtostart]::part(scrollbutton-up),
#tabbrowser-arrowscrollbox[scrolledtoend]::part(scrollbutton-down) {
fill: var(--uc-color-redorange-button) !important;
fill-opacity: 1.0 !important;
opacity: 1.0 !important;
background-color: var(--uc-color-theme-grey) !important;
}
#tabbrowser-arrowscrollbox[scrolledtostart]::part(scrollbutton-up):hover,
#tabbrowser-arrowscrollbox[scrolledtoend]::part(scrollbutton-down):hover {
fill: var(--uc-color-redorange-button) !important;
fill-opacity: 0.6 !important;
opacity: 1.0 !important;
}
/*■■■■■■■■■■■■■■■■scrollbuttons dropdown kontext■■■■■■■■■■■■■■■■■*/
menupopup:not([placespopup="true"])::part(arrowscrollbox) {
background-color: var(--uc-border-color) !important;
border-radius: 0!important;
}
menupopup:not([placespopup="true"]):hover::part(arrowscrollbox) {
background-color: var(--uc-border-color) !important;
border-radius: 0 !important;
}
/*■■■■■■■■■■■■■■■■scrollbuttons dropdown bookmarks■■■■■■■■■■■■■■■*/
menupopup[placespopup="true"]::part(arrowscrollbox) {
background-color: var(--uc-border-color) !important;
}
menupopup[placespopup="true"]:hover::part(arrowscrollbox) {
background-color: var(--uc-border-color) !important;
}
Alles anzeigen
Ich hoffe es hilft dir weiter...
Eine weitere Möglichkeit wäre: Shadowroot ist von außen über Variablen ansprechbar. Diese müssen auf einer höhere Ebene deklariert werden um dann auf der auszuführenden Ebene anwendbar zu sein...
Das wäre dann die bessere Lsg.
Ein friedliches neues Jahr 2026 wünsche ich allen Menschen, achtet auf eure Gesundheit. Viel Glück...
Ein kleiner Update
Knapp 1000 Zeilen für eine Leiste? Geht auch kürzer (CSS muss angepasst werden):
/* Statusleiste für Firefox, für Änderungen ab 118/119:
https://www.camp-firefox.de/forum/thema/112673-userchrome-js-scripte-f%C3%BCr-den-fuchs-diskussion/?postID=1234805#post1234805*/
(function() {
if (location != 'chrome://browser/content/browser.xhtml')
return;
var tb = document.createXULElement('toolbar');
tb.id = 'new-toolbar';
tb.setAttribute('customizable', true);
tb.setAttribute('mode', 'icons');
tb.setAttribute("context","toolbar-context-menu");
var vbox = document.createXULElement('vbox');
document.getElementById('browser').parentNode.insertBefore( vbox, null);
vbox.appendChild(tb);
CustomizableUI.registerArea('new-toolbar', {legacy: true});
CustomizableUI.registerToolbarNode(tb);
})();
Alles anzeigen
#new-toolbar{
background-color: gray !important;
border: none !important;
border-top: 1px solid orange !important;
box-shadow: none !important;
--toolbarbutton-inner-padding: 6px !important;
--toolbarbutton-outer-padding: 0px !important;
overflow: hidden !important;
bottom: 0 !important;
height: 0px !important;
min-height: 0px !important;
max-height: 0px !important;
margin-top: -4px !important;
margin-bottom: 0px !important;
opacity: 0 !important;
transition: height .1s linear .1s, min-height .1s linear .1s, max-height .1s linear .1s, opacity .1s linear .1s, margin-top .1s linear .1s !important;
}
#new-toolbar:hover {
height: 22px !important;
min-height: 22px !important;
max-height:22px !important;
margin-top: 1px !important;
opacity: 1 !important;
transition: height .3s linear .3s, min-height .3s linear .3s, max-height .3s linear .3s, opacity .3s linear .3s, margin-top .3s linear .3s !important;
overflow: hidden !important;
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
#new-toolbar {
background-color: gray!important;
max-height: 22px!important;
box-shadow: none !important;
overflow: hidden!important;
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
#new-toolbar toolbarbutton .toolbarbutton-icon {
margin-bottom: -3px !important;
margin-top: -3px !important;
overflow: hidden !important;
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
#new-toolbar toolbarbutton,
#new-toolbar .toolbarbutton-1 {
height: 22px !important;
min-height: 22px !important;
max-height: 22px !important;
overflow: hidden !important;
min-width: fit-content !important;
}
#new-toolbar toolbarbutton:hover,
#new-toolbar .toolbarbutton-1:hover {
background-color: lightgray !important;
}
#new-toolbar toolbarbutton:active,
#new-toolbar .toolbarbutton-1:active {
background-color: lightgray !important;
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
#new-toolbar .toolbarbutton-1 {
margin-top: -2px !important;
}
#new-toolbar toolbarbutton {
margin-bottom: -1px !important;
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
:root[customizing] #new-toolbar{
height: 22px !important;
min-height: 22px !important;
max-height: 22px !important;
margin-top: 0px !important;
opacity: 1 !important;
transition: none !important;
}
:root[customizing] #new-toolbar:hover{
height: 22px !important;
min-height: 22px !important;
max-height: 22px !important;/**/
margin-top: 0px !important;
opacity: 1 !important;
transition: none !important;
}
Alles anzeigen
Uwe Kockisch aka Commissario Brunetti ist leider gestorben
@Horstmann
Wenn ich keine CSS-Hervorhebung im jeweiligen Editor möchte, kann ich das CSS einfach nur in js einbinden (auch shadowroot funzt damit). Genauso war es in der Zeit vor diesem wirklich nützlichen Script.
Icons in shadow-root könnte man damit im Prinzip auch ändern mit einem relativen Pfad, dazu habe ich aber keine komplett überzeugende Lösung gefunden
Ich mach das so (In dieser Datei befindet sich lediglich der relative Pfad auf das Icon; fill usw. nicht):
// userChromeShadowIcons.css.uc.js
(function() {
if (location != 'chrome://browser/content/browser.xhtml') return;
const
// ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
IconPath1 = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons', 'ff_svg')), // Pfad zum 1.Ordner der das .svg-Symbol (mit: fill="context-fill" fill-opacity="context-fill-opacity") beinhaltet.
IconPath2 = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons')); // Pfad zum 2.Ordner der das .svg-Symbol (mit: fill="context-fill" fill-opacity="context-fill-opacity") beinhaltet.
// ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const sss = Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService);
const uri = Services.io.newURI('data:text/css;charset=utf-8,' + encodeURIComponent(`
#tabbrowser-arrowscrollbox::part(scrollbutton-up),
#tabbrowser-arrowscrollbox::part(scrollbutton-down) {
list-style-image: url("${IconPath2}/arrow-left.svg") !important;
}
#tabbrowser-arrowscrollbox[scrolledtostart="true"]::part(scrollbutton-up),
#tabbrowser-arrowscrollbox[scrolledtoend="true"]::part(scrollbutton-down) {
list-style-image: url("${IconPath2}/arrow-right.svg") !important;
}
`), null, null);
sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
})();
Alles anzeigen
Hier die dazugehörige userChromeShadow.css:
/* userChromeShadow.css*/
/*■■■■■■■■■■■■■■■■scrollbuttons tableiste■■■■■■■■■■■■■■■■■■■■■■■■■*/
#tabbrowser-arrowscrollbox::part(scrollbutton-up),
#tabbrowser-arrowscrollbox::part(scrollbutton-down) {
appearance: none !important;
background-color: gray !important;
box-shadow: none !important;
border: 0 !important;
border-radius: 0 !important;
width: 32px !important;
min-width: 32px !important;
max-width: 32px !important;
overflow: hidden !important;
padding-top: 0 !important;
padding-bottom: 0 !important;
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
#tabbrowser-arrowscrollbox::part(scrollbutton-up):hover,
#tabbrowser-arrowscrollbox::part(scrollbutton-down):hover {
appearance: none !important;
background-color: lightgray !important;
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
#tabbrowser-arrowscrollbox {
&::part(scrollbutton-up), &::part(scrollbutton-down) {
--arrowscrollbox-scrollicon-hover-background-color: unset !important;
--arrowscrollbox-scrollicon-active-background-color: unset !important;
}
}
/*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
#tabbrowser-arrowscrollbox::part(scrollbutton-up),
#tabbrowser-arrowscrollbox::part(scrollbutton-down) {
fill: green !important;
fill-opacity: 1.0 !important;
}
#tabbrowser-arrowscrollbox::part(scrollbutton-up):hover,
#tabbrowser-arrowscrollbox::part(scrollbutton-down):hover {
fill: white !important;
fill-opacity: 1.0 !important;
}
#tabbrowser-arrowscrollbox[scrolledtostart]::part(scrollbutton-up),
#tabbrowser-arrowscrollbox[scrolledtoend]::part(scrollbutton-down) {
fill: red !important;
fill-opacity: 1.0 !important;
opacity: 1.0 !important;
background-color: gray !important;
}
#tabbrowser-arrowscrollbox[scrolledtostart]::part(scrollbutton-up):hover,
#tabbrowser-arrowscrollbox[scrolledtoend]::part(scrollbutton-down):hover {
fill: red !important;
fill-opacity: 0.6 !important;
opacity: 1.0 !important;
}
Alles anzeigen
Habt ihr eine Idee wie man das anpassen muss?
Im Wesentlichen geht es um #urlbar-background. Daraus wurde .urlbar-background.
Hier mal 'mein' bereits angepasstes Script als Beispiel:
// JavaScript Document
// LoadingBar.uc.js
// Location Bar Enhancer5.1; Loading Bar0.3.0
// Firefox 145
(function (){
if (location.href !== 'chrome://browser/content/browser.xhtml') return;
var cssStr = `
#urlbar {
--lb-stripes-A-0: rgba(74,74,74,0) !important;
--lb-stripes-A-1: rgba(74,74,74,1) !important;
--lb-stripes-B-0: rgba(204, 82, 0,0) !important;
--lb-stripes-B-1: rgba(204, 82, 0,0.5) !important;
}
.urlbar-background {
background-color: var(--lb-stripes-A-1) !important;
}
.urlbar-background {
background-image: repeating-linear-gradient(-60deg, var(--lb-stripes-A-0), var(--lb-stripes-A-0) 4px, var(--lb-stripes-A-1) 4px, var(--lb-stripes-A-1) 8px), linear-gradient(to right, var(--lb-stripes-B-0) 0%, var(--lb-stripes-B-1) 100%);
background-size: 0% 0%;
background-repeat:repeat-x, no-repeat;
transition: background-size 350ms ease-in-out 0ms;
}
.urlbar-background:not([style="background-size: 0% 100%;"]) {
/* transition: background-size 350ms ease-in-out 0ms;*/
animation: progress-bar-stripes 5s linear infinite;
}
@keyframes progress-bar-stripes {
from {
background-position: -360px 0;
}
to {
background-position: 360px 0;
}
}
`.replace(/\s{2,}|\r|\n/,"");
var style = document.createProcessingInstruction("xml-stylesheet", "type=\"text/css\"" + " href=\"data:text/css;base64," + btoa(cssStr) + "\"");
var mainW = document.getElementById("main-window");
document.insertBefore(style, mainW);
function main(window) {
var {document, gBrowser} = window;
function $(id) { return document.getElementById(id) };
var urlbar = $("urlbar");
const cl = '.urlbar-background';
let pageProgress = 0;
let async = makeWindowHelpers(window).async;
var LoadingBar = {
listener: {
onChangeTab: function(e) {
urlbar.querySelector(cl).style.backgroundSize = '0% 100%';
pageProgress = 0;
},
onProgressChange: function(aBrowser,webProgress,request,curSelfProgress,maxSelfProgress,curTotalProgress,maxTotalProgress) {
if (gBrowser.contentDocument === aBrowser.contentDocument) {
var val = (curTotalProgress-1)/(maxTotalProgress-1);
pageProgress = val;
urlbar.querySelector(cl).style.backgroundSize = (100*val) + '% 100%';
if (val > 0.9)
async(function() {
if (pageProgress > 0.95)
urlbar.querySelector(cl).style.backgroundSize = '100% 100%';
}, 1000);
}
},
onStateChange: function() {
if (pageProgress > 0.95){
async(function() {
urlbar.querySelector(cl).style.backgroundSize = '0% 100%';
pageProgress = 0;
}, 1000);
}else{
urlbar.querySelector(cl).style.backgroundSize = '0% 100%';
}
}
}
};
gBrowser.tabContainer.addEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);
gBrowser.addTabsProgressListener(LoadingBar.listener);
unload(function() {
gBrowser.tabContainer.removeEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);
gBrowser.removeTabsProgressListener(LoadingBar.listener);
}, window);
}
watchWindows(main, "navigator:browser");
function runOnLoad(window, callback, winType) {
window.addEventListener("load", function() {
window.removeEventListener("load", arguments.callee, false);
if (window.document.documentElement.getAttribute("windowtype") == winType)
callback(window);
}, false);
}
function runOnWindows(callback, winType) {
function watcher(window) {
try {
callback(window);
}
catch(ex) {}
}
let browserWindows = Services.wm.getEnumerator(winType);
while (browserWindows.hasMoreElements()) {
let browserWindow = browserWindows.getNext();
if (browserWindow.document.readyState == "complete")
watcher(browserWindow);
else
runOnLoad(browserWindow, watcher, winType);
}
}
function watchWindows(callback, winType) {
function watcher(window) {
try {
callback(window);
}
catch(ex) {}
}
runOnWindows(callback, winType);
function windowWatcher(subject, topic) {
if (topic == "domwindowopened")
runOnLoad(subject, watcher, winType);
}
Services.ww.registerNotification(windowWatcher);
unload(function() { Services.ww.unregisterNotification(windowWatcher) });
}
function unload(callback, container) {
let unloaders = unload.unloaders;
if (unloaders == null)
unloaders = unload.unloaders = [];
if (callback == null) {
unloaders.slice().forEach(function(unloader) { unloader() });
unloaders.length = 0;
return null;
}
if (container != null) {
container.addEventListener("unload", removeUnloader, false);
let origCallback = callback;
callback = function() {
container.removeEventListener("unload", removeUnloader, false);
origCallback();
}
}
function unloader() {
try {
callback();
}
catch(ex) {}
}
unloaders.push(unloader);
function removeUnloader() {
let index = unloaders.indexOf(unloader);
if (index != -1)
unloaders.splice(index, 1);
}
return removeUnloader;
}
function makeWindowHelpers(window) {
let {clearTimeout, setTimeout} = window;
function async(callback, delay) {
delay = delay || 0;
let timer = setTimeout(function() {
stopTimer();
callback();
}, delay);
function stopTimer() {
if (timer == null)
return;
clearTimeout(timer);
timer = null;
}
}
return {
async: async,
};
}
})();
Alles anzeigen
Moin 2002Andreas . Ich habe das über eine Rufumleitung auf einen internen Anrufbeantworter gelöst.
Ungefähr so:
Rufumleitung > Alle Anrufe ohne Rufnummer an.... > Anrufe umleiten auf internen Anrufbeantworter > unbekannter Anrufer > Hier können Sie die konfigurierte Rufumleitung bearbeiten > Alle Anrufe ohne Rufnummer an > Anrufe umleiten auf internen Anrufbeantworter
und
Anrufbeantworter Name: unbekannter Anrufer>
Anrufbeantworter > Anrufe > an alle Rufnummern > Rufannahme sofort > Nachrichten aufnehmen
Klingelt nicht, und so kann auch der Bot selber eintscheiden ob er dir eine Nachricht hinterlässt,![]()
Der Privatanrufer mit versteckter Nummer hat aber wenigstens die Chance eine Nachricht zu hinterlassen und verschwindet nicht gleich im Nirvana..
Ich will aber nichts hören, hab extra die Testmaschine angeworfen
👏![]()
Das Scroll Feature funktioniert bei mir am Mac leider nicht.
Hast du das in einem neuen Profil (ohne andere Toolbars) getestet? Mein Verdacht: Doppelte Nutzung der id #vert_toolbox. Und dort top: mit !important;. Dann kann das js toolbox.style.top = curPos + 'px'; das css nicht überschreiben. Sonst habe ich auch keine Lsg. parat.
FuchsFan DANKESCHÖN für das Testen! Das beruhigt mich dann ja schoneinmal ein wenig...
Update am 2025-12-05: Neue Version (Die vertikale Position der Leiste kann jetzt gescrollt werden).