Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№80106-05-2023 15:21:05

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 101
UA: Firefox 112.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Может у тебя есть какие-нибудь скрипты, которые уже что-то делают на about:addons ?
Я в том смысле, что тогда можно было бы попробовать дописать туда ещё кусок кода.

Только этот:

скрытый текст

Выделить код

Код:

(async (css, self) => ({

	//===[ Buttons ]===================================================================

	vertical: true,
	btnActions: ["preferences", "toggle-disabled", "remove", "install-update"],

	cn: "ucf-cloned-button",
	update(e) {
		var trg = e.target;
		trg.nodeName == "ADDON-CARD" && trg.addon.type != "theme" && this.onCard(trg);
	},
	onCard(card, again) {
		var btnsParent = card.querySelector("addon-options");
		if (!btnsParent) return again || card.ownerGlobal
			.requestAnimationFrame(() => this.onCard(card, true));

		var doc = card.ownerDocument;
		var [span] = card.getElementsByClassName(this.ccn);
		if (span) span.textContent = "";
		else
			card.querySelector("button.more-options-button")
				.before(span = doc.createElement("span")),
			span.className = this.ccn;

		var item, num = 0;
		for(var sel of this.btnActions) {
			if (num++ == this.tInd) {
				if (!card.querySelector(this.ts)) continue;
				item = this.createPanelItem(doc);
				item.setAttribute("action", "toggle-disabled");
				doc.l10n.setAttributes(item, `${
					btnsParent.parentNode.getAttribute("active") == "true" ? "dis" : "en"
				}able-addon-button`);
			} else {
				item = btnsParent.querySelector(sel);
				if (!item) continue;
				item = this.clone(item);
			}
			span.append(item);
			item.shadowRoot.querySelector("button").classList.add(this.cn);
		}
	},

	//===[ Popup ]=====================================================================

	items: {
		"Копировать имя": [
			addon => self.copy(addon.name),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
		],
		"Копировать ID": [
			addon => self.copy(addon.id),
			"Копировать имя"
		],
		"Копировать версию": [
			addon => self.copy(addon.version),
			"Копировать имя",
			addon => !addon.version
		],
		"Копировать имя и версию": [
			addon => self.copy(addon.name + " " + addon.version),
			"Копировать имя",
			addon => !addon.version
		],
		"Копировать URL кнопки": [
			(addon, win) => {
				var btn = Object.assign({
					parameters: {},
					get initcode() {return this.initCode;},
					setText(doc, name, t, cds) {
						win.custombutton.buttonSetText(doc, name, this[name], cds);
					}
				}, win.custombuttons.cbService.getButtonParameters(addon.buttonLink));
				self.copy(win.custombutton.buttonGetURI(btn));
			},
			"Копировать имя",
			addon => addon.type != "custombuttons"
		],
		"Домашняя страница": [
			(addon, win) => win.openURL(addon.homepageURL || addon.reviewURL.replace(/\/reviews\/.*$/, "/")),
			"data:image/png;base64,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",
			addon => !addon.homepageURL && !addon.reviewURL
		],
		"Поиск на АМО": [
			(addon, win) => win.openURL(
				addon.homepageURL || ("https://addons.mozilla.org/search/?q=" + encodeURIComponent(addon.name))
			),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJGSURBVDjLjdJLSNRBHMDx78yqLZaKS75DPdgDDaFDbdJmde5QlhCJGxgpRJfqEEKnIsJLB7skQYQKZaSmdLaopPCgEvSCShCMzR5a7oq7/3l12RVtjfzBMA/4fWZ+MyOccwBM3g8HEbIdfCEhfAFnLVapOa28Uevpjrqz/WOsERJgsu9Uq5CZQzgqrJfo9BajNd5irEYn4p3OUiFExtCLmw2tawFi4l5zUMjMIau9u7K+qxeoAcoAA0wDb2OPwmfA16LiiaOHLj1edRLpkO3WmIis7+oBDgJbgQ2AH6gC6jY19N62RkcctKeVIJAhp9QgUA3kJXdONZVcq9JxPSgQoXRAyIDRth8oAXQyKdWnoCKrTD9CBv4GMqx1WGNZkeRWJKbG2hiD1Cb9FbTnzWFdY/LCdLKlgNQ84gyNKqHm0gDjqVHnxDHgA/B9RQkpaB6YklkZl62np9KBhOqwjpKFgeY2YAz4BESBWHI8Hhs6PVVSvc3v98ye4fP7T676B845nt040ip98qpWJmI9PWiU6bfWgXGN2YHcKwU7tsuc4kpUPMbU0+f8+vKt+Pitl7PLAMDI9cNBoB0hQwICzjqUp6MZvsy8yvp95BRuQUjJ75mPvH4wYo1NlJ64Mza7DPwrhi8cCOeXl/aUB4P4c/NJxKLMvpngycCrzxVFG2v/CwAMnguF80oLe8p27cQh+fnpPV/fTc95S6piXQDAw7a9YbWkezZXFbAwMx/xPFXb1D3+Y90AQF/L7kAsri9mZ4lrTd0TcYA/Kakr+x2JSPUAAAAASUVORK5CYII=",
			["custombuttons", "theme", "plugin"]
		],
		"Папка установки": [
			addon => self.getFile(addon).reveal(),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABAklEQVR42mNkoBAwAjEXEAcCMTsW+U9AvB6I/+I0gJ2Noe3QJoZKASEgjwkq+h+C795lYPCKZMgC8mZg0fsfbICIIMOcF6cZkrGZ/v8fA0PndIa/7z8BXfAPqgVKv//A8GPeZoYERmE+hjmP1+AwAOgiTjOIP7HZLyjLMJNRmB/ogjMMyYzsUC8wIhQwsgCFWHAHoKAy0AARIYY5r69idwEhIKgBMgAYBq8vkGmALsyAU2QaYAwz4CiZBliADBAAGnCATANsYQbsJtMAJ5ABwGh8uZE8A4R9gAYwMzHkT8hl6Bfgxp5ecIH3Xxj+F05hyIdpUmXAnpnwge9AfJckW7EBAC/gSzisxsnmAAAAAElFTkSuQmCC",
			["custombuttons", "theme", "plugin"]
		],
		"Файл установки": [
			addon => self.getFile(addon).launch(),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA51AAAOdQG5Y1EyAAAAhklEQVQ4y6WT0QnAIAxE78Bt2v1cod3PznP9kVLTRKUGBD+Sd5eQUBJWggCWCAkAJPGXOqlUPyVKkrSPQIoCQJGE6AF4HFyGuBmrR3cGQX8Wmp2cL8Cqv5JPD5Zm1D0nFZjTjHpQ7DuI1L3iBjBS9/pvhtjr21OukVkXiX/ug6SWj4mr53wDMz1vldHlLJkAAAAASUVORK5CYII=",
			["custombuttons", "theme", "plugin"]
		],
		"Проверить обновления": [
			Cr.NS_ERROR_NET_TIMEOUT_EXTERNAL // Fx 87+
				? (addon, win) => win.content.checkForUpdate(addon)
				: (addon, win) => win.content.frames[0].checkForUpdate(addon),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAACVUlEQVQ4jXWT30vTYRTGP3Mb+ZbiXmm6DGUO0pkQGQR2URBdKZWWIHRlFHYhXnQRdVUEBUn/gBddFZERaalUoAUhYUglVIjO5TKbjMDtq2vDQ9t8u0jnr3Xgvfuch/M87zk2rTX/K+u05QROUMBVlrmkn+lvWxlHzsbjVj4uzlHFFec15/7UYCrFU6xcrF0ptbn5jNVADS9o47yvxed24yZRnchLz6dbpUSUlMhHNavSa3zeNskMIZzYOQChPyGmolNIXGz+Tn/lvu59d6jhtdVkZX1vm0AFVFSKpZfPNHKQ3SSBPsxCfMEWi8Rwtbkq5L3UqnH1OCtgNVleqRaf+MUjXrH0Sx2TUuklQAt+XPRykyAzFHNIfgkUUyV58k4FVOifhVLe0sUnGhknnyoAPaAjzHGUbkYxjOlHup0R7iPATqCI9vUMHHhwAR7SGCJrdnS/DjPOMd2nhwD4zS2CZEgCBRxZF8gQJgrkYwcqNmaiJ3QGMADMMMsyMeyAE/e6QII3TEP54XIbhXSufqfXarEebEwcH7swFBIDUqSyIYpPFrFzIV4ZhwLqBDGskOE6XUxwUsqkRwWVyF6xscw0P3lOgodqSgXRWqO1tnGZVwxiiGAYw3CbpWbTbDpMh+EGH2jDvcpuetk9EK8ME6UBQwkOoJUdc445RodHqb9YXxaeDJ8StwyogIrnXGUVUEkplx7mKWKJWn7gTH1PwQqEv4bBQRHzLKlJNbJRwJbrGq2zlps9fKEOD5MIEZ6Q5K7u1xNb2ZzXiEFYxDBEF8I9PaBDOTngLwkg8PzzO00cAAAAAElFTkSuQmCC",
			addon => !addon.applyBackgroundUpdates || addon.isBuiltin
		],
	},
	listContainerId: "ucf-aa-extra-items-container",
	showing(e) {
		var card = e.target.closest("addon-card");
		if (!card) return;

		this.labs = [];
		var imgs = new Map();
		var set = (key, val) => imgs.set(key, imgs.has(key) ? imgs.get(key).concat(val) : [val]);
		var entries = Object.entries(this.items);

		entries.forEach(([lab, [func, img, hideOn]], ind) => {
			this.labs.push(lab);
			(this[lab] = func).hideOn = hideOn;
			img && set(this.items[img]?.[1] ? entries.findIndex(a => a[0] == img): ind, ind);
		});
		if (imgs.size) {
			var cspRe = /^(?:chrome|file|jar|resource|moz-extension|https?):/;
			var [s, p, o] = this.vers >= 110
				? ["::part(button)", "background-image", "AUTHO"] : ["", "--icon", "USE"];

			var reg = [], push = (ind, icon) => {
				var chromeImg = "chrome://user_chrome_files/content/aaepiimg_" + ind;
				reg.push(["override", chromeImg, icon]);
				return chromeImg;
			}
			var rules = [];
			for(var [ind, nums] of imgs) {
				var sel = [], img = entries[ind][1][1];
				for(var num of nums) sel.push(
					`\t#${this.listContainerId} > panel-item:nth-child(${num + 1})${s}`
				);
				rules.push(`${sel.join(",\t\n")} {\n\t\t${p}: url(${
					cspRe.test(img) ? img : push(ind, img)
				}) !important;\n\t}`);
			}
			if (reg.length) {
				var ams = Cc["@mozilla.org/addons/addon-manager-startup;1"]
					.getService(Ci.amIAddonManagerStartup);
				var mUri = Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile));
				this.chromeReg = ams.registerChrome(mUri, reg);
			}
			this.regSheet(`\n${rules.join("\n")}\n}`, o + "R_SHEET");
		}
		delete this.items;

		self = this;
		this.sym = Symbol.for(this.listContainerId);
		(this.showing = e => {
			var card = e.target.closest("addon-card");
			card && this.onListShowind(card.addon, e.target);
		})(e);
		this.onListShowind(card.addon, e.target);
	},
	async onListShowind(addon, list) {
		var doc = list.ownerDocument, win = doc.ownerGlobal;
		var container = doc[this.sym];
		if (!container) {
			container = doc[this.sym] = doc.createElement("div");
			container.onclick = this.cclick;
			container.id = this.listContainerId;
			for(var lab of this.labs)
				container.appendChild(this.createPanelItem(doc)).append(lab);

			var mo = new win.MutationObserver(this.mut);
			(container.mo = mo).container = container;
		}
		for(var item of container.children) {
			var h = this[item.textContent].hideOn;
			item.hidden = h && (h.call ? h(addon) : h.includes(addon.type));
		}
		var {mo} = container;
		mo.disconnect();
		list.contains(container) || list.prepend(container);
		mo.count = 0;
		mo.ts = Date.now();
		mo.observe(list, {childList: true});
	},
	mut(muts, mo) {
		if (++mo.count > 10 || Date.now() - mo.ts > 100)
			return mo.disconnect();
		var list = muts[0].target, {container} = mo;
		if (list.firstElementChild != container)
			mo.disconnect(),
			list.prepend(container),
			mo.observe(list, {childList: true});
	},
	cclick(e) {
		e.stopImmediatePropagation();
		this.parentNode.hide();
		self[e.target.textContent](
			e.target.closest("addon-card").addon,
			e.view.windowRoot.ownerGlobal
		);
	},
	copy: str => (self.copy =
		Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString
	)(str),
	getFile(addon) {
		var file, uri = addon.getResourceURI();
		if (uri instanceof Ci.nsIJARURI) uri = uri.JARFile;
		if (uri instanceof Ci.nsIFileURL) file = uri.file;
		return file;
	},

	//================================================================================

	init(topic, quit) {
		Services.obs.addObserver(this, topic);
		Services.obs.addObserver(quit = (s, t) => {
			Services.obs.removeObserver(quit, t);
			Services.obs.removeObserver(this, topic);
		}, "quit-application-granted");
	},
	isTargetDoc: doc => doc.ownerGlobal.docShell
		.currentDocumentChannel.name.endsWith("/aboutaddons.html"),
	observe(doc) {
		if (!this.isTargetDoc(doc)) return;

		var vers = this.vers = parseInt(Services.appinfo.platformVersion);
		this.ts = `${vers >= 111 ? "moz-toggle" : "input"}[action="toggle-disabled"]`;

		css = css.replace("%TS%", this.ts)
			.replace(/%CN%/g, this.cn)
			.replace(/;$/gm, " !important;")
			.replace("%FD%", this.vertical ? "column" : "row");

		this.regSheet(css, "USER_SHEET");

		var unload = e => {
			e.target.removeEventListener("update", this, true);
			e.target.removeEventListener("showing", this, true);
		}
		var load = doc => {
			doc.addEventListener("update", this, true);
			doc.addEventListener("showing", this, true);
			doc.ownerGlobal.addEventListener("unload", unload, {once: true});
		}
		this.handleEvent = e => this[e.type](e);
		this.observe = doc => this.isTargetDoc(doc) && load(doc);

		this.ccn = this.cn + "s-container";
		this.tInd = this.btnActions.findIndex(s => s == "toggle-disabled");

		this.btnActions = this.btnActions.map(
			action => `panel-list > panel-item[action="${action}"]`
		);
		this.createPanelItem = vers == 110
			? doc => new (doc.ownerGlobal.customElements.get("panel-item"))
			: doc => doc.createElement("panel-item");

		if (vers >= 89) this.clone = item => item.cloneNode(true);
		else {
			var cf = function(e) {
				var win = e.view;
				win.InspectorUtils.removeContentState(this, 4, true);
				Services.focus.clearFocus(win);
			}
			this.clone = item => {
				var clone = item.cloneNode(true);
				clone.onclick = cf;
				return clone;
			}
		}
		load(doc);
	},
	regSheet(...args) {
		var prfx = "data:text/css;charset=utf8,@-moz-document url(about:addons),%0A"
			+ "url(chrome://mozapps/content/extensions/aboutaddons.html) {";
		var sss = Cc["@mozilla.org/content/style-sheet-service;1"]
			.getService(Ci.nsIStyleSheetService);
		(this.regSheet = (code, origin) => sss.loadAndRegisterSheet(
			Services.io.newURI(prfx + encodeURIComponent(code)), sss[origin]
		))(...args);
	}
}).init("chrome-document-loaded"))(`\

	span.%CN%s-container {
		display: flex;
		flex-direction: %FD%;
		row-gap: 1px;
	}
	addon-card[expanded] span.%CN%s-container {
		flex-direction: row;
	}
	button.%CN% {
		-moz-appearance: none;

		margin: 0 1px;
		padding: 1px 6px 3px 6px;
		background-image: none;
		background-color: rgba(174, 236, 235, 0.9);

		border-radius: 0;
		border: 1px solid #bbb;

		font-size: 13px;
		white-space: nowrap;
		font-family: Segoe UI;
	}
	button.%CN%:hover {
		background-color: gold;
	}
	button.%CN%:after, %TS% {
		display: none;
	}
}`);

Addons.1683375076.png

В основном стилями обходился.

Dumby пишет

Ой, сейчас немного неохота, и некогда.

Не вопрос, конечно. Только, если можно, в мусорку просьбу мою не выкидывать... когда желание и время появятся - посмотреть, что можно сделать.

Отсутствует

 

№80206-05-2023 20:40:00

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

LGS пишет

Только этот

OK. Возвращаю модифицированный.
Вписал результат неких экспериментов на предмет просьбы,
которые, в 113, чисто с веб-консоли проводились.

скрытый текст

Выделить код

Код:

(async (css, self) => ({

	//===[ Buttons ]===================================================================

	vertical: true,
	btnActions: ["preferences", "toggle-disabled", "remove", "install-update"],

	cn: "ucf-cloned-button",
	update(e) {
		var trg = e.target;
		trg.nodeName == "ADDON-CARD" && trg.addon.type != "theme" && this.onCard(trg);
	},
	onCard(card, again) {
		var btnsParent = card.querySelector("addon-options");
		if (!btnsParent) return again || card.ownerGlobal
			.requestAnimationFrame(() => this.onCard(card, true));

		var doc = card.ownerDocument;
		var [span] = card.getElementsByClassName(this.ccn);
		if (span) span.textContent = "";
		else
			card.querySelector("button.more-options-button")
				.before(span = doc.createElement("span")),
			span.className = this.ccn;

		var item, num = 0;
		for(var sel of this.btnActions) {
			if (num++ == this.tInd) {
				if (!card.querySelector(this.ts)) continue;
				item = this.createPanelItem(doc);
				item.setAttribute("action", "toggle-disabled");
				doc.l10n.setAttributes(item, `${
					btnsParent.parentNode.getAttribute("active") == "true" ? "dis" : "en"
				}able-addon-button`);
			} else {
				item = btnsParent.querySelector(sel);
				if (!item) continue;
				item = this.clone(item);
			}
			span.append(item);
			item.shadowRoot.querySelector("button").classList.add(this.cn);
		}
	},

	//===[ Popup ]=====================================================================

	items: {
		"Копировать имя": [
			addon => self.copy(addon.name),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
		],
		"Копировать ID": [
			addon => self.copy(addon.id),
			"Копировать имя"
		],
		"Копировать версию": [
			addon => self.copy(addon.version),
			"Копировать имя",
			addon => !addon.version
		],
		"Копировать имя и версию": [
			addon => self.copy(addon.name + " " + addon.version),
			"Копировать имя",
			addon => !addon.version
		],
		"Копировать URL кнопки": [
			(addon, win) => {
				var btn = Object.assign({
					parameters: {},
					get initcode() {return this.initCode;},
					setText(doc, name, t, cds) {
						win.custombutton.buttonSetText(doc, name, this[name], cds);
					}
				}, win.custombuttons.cbService.getButtonParameters(addon.buttonLink));
				self.copy(win.custombutton.buttonGetURI(btn));
			},
			"Копировать имя",
			addon => addon.type != "custombuttons"
		],
		"Домашняя страница": [
			(addon, win) => win.openURL(addon.homepageURL || addon.reviewURL.replace(/\/reviews\/.*$/, "/")),
			"data:image/png;base64,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",
			addon => !addon.homepageURL && !addon.reviewURL
		],
		"Поиск на АМО": [
			(addon, win) => win.openURL(
				addon.homepageURL || ("https://addons.mozilla.org/search/?q=" + encodeURIComponent(addon.name))
			),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJGSURBVDjLjdJLSNRBHMDx78yqLZaKS75DPdgDDaFDbdJmde5QlhCJGxgpRJfqEEKnIsJLB7skQYQKZaSmdLaopPCgEvSCShCMzR5a7oq7/3l12RVtjfzBMA/4fWZ+MyOccwBM3g8HEbIdfCEhfAFnLVapOa28Uevpjrqz/WOsERJgsu9Uq5CZQzgqrJfo9BajNd5irEYn4p3OUiFExtCLmw2tawFi4l5zUMjMIau9u7K+qxeoAcoAA0wDb2OPwmfA16LiiaOHLj1edRLpkO3WmIis7+oBDgJbgQ2AH6gC6jY19N62RkcctKeVIJAhp9QgUA3kJXdONZVcq9JxPSgQoXRAyIDRth8oAXQyKdWnoCKrTD9CBv4GMqx1WGNZkeRWJKbG2hiD1Cb9FbTnzWFdY/LCdLKlgNQ84gyNKqHm0gDjqVHnxDHgA/B9RQkpaB6YklkZl62np9KBhOqwjpKFgeY2YAz4BESBWHI8Hhs6PVVSvc3v98ye4fP7T676B845nt040ip98qpWJmI9PWiU6bfWgXGN2YHcKwU7tsuc4kpUPMbU0+f8+vKt+Pitl7PLAMDI9cNBoB0hQwICzjqUp6MZvsy8yvp95BRuQUjJ75mPvH4wYo1NlJ64Mza7DPwrhi8cCOeXl/aUB4P4c/NJxKLMvpngycCrzxVFG2v/CwAMnguF80oLe8p27cQh+fnpPV/fTc95S6piXQDAw7a9YbWkezZXFbAwMx/xPFXb1D3+Y90AQF/L7kAsri9mZ4lrTd0TcYA/Kakr+x2JSPUAAAAASUVORK5CYII=",
			["custombuttons", "theme", "plugin"]
		],
		"Папка установки": [
			addon => self.getFile(addon).reveal(),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABAklEQVR42mNkoBAwAjEXEAcCMTsW+U9AvB6I/+I0gJ2Noe3QJoZKASEgjwkq+h+C795lYPCKZMgC8mZg0fsfbICIIMOcF6cZkrGZ/v8fA0PndIa/7z8BXfAPqgVKv//A8GPeZoYERmE+hjmP1+AwAOgiTjOIP7HZLyjLMJNRmB/ogjMMyYzsUC8wIhQwsgCFWHAHoKAy0AARIYY5r69idwEhIKgBMgAYBq8vkGmALsyAU2QaYAwz4CiZBliADBAAGnCATANsYQbsJtMAJ5ABwGh8uZE8A4R9gAYwMzHkT8hl6Bfgxp5ecIH3Xxj+F05hyIdpUmXAnpnwge9AfJckW7EBAC/gSzisxsnmAAAAAElFTkSuQmCC",
			["custombuttons", "theme", "plugin"]
		],
		"Файл установки": [
			addon => self.getFile(addon).launch(),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA51AAAOdQG5Y1EyAAAAhklEQVQ4y6WT0QnAIAxE78Bt2v1cod3PznP9kVLTRKUGBD+Sd5eQUBJWggCWCAkAJPGXOqlUPyVKkrSPQIoCQJGE6AF4HFyGuBmrR3cGQX8Wmp2cL8Cqv5JPD5Zm1D0nFZjTjHpQ7DuI1L3iBjBS9/pvhtjr21OukVkXiX/ug6SWj4mr53wDMz1vldHlLJkAAAAASUVORK5CYII=",
			["custombuttons", "theme", "plugin"]
		],
		"Проверить обновления": [
			Cr.NS_ERROR_NET_TIMEOUT_EXTERNAL // Fx 87+
				? (addon, win) => win.content.checkForUpdate(addon)
				: (addon, win) => win.content.frames[0].checkForUpdate(addon),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAACVUlEQVQ4jXWT30vTYRTGP3Mb+ZbiXmm6DGUO0pkQGQR2URBdKZWWIHRlFHYhXnQRdVUEBUn/gBddFZERaalUoAUhYUglVIjO5TKbjMDtq2vDQ9t8u0jnr3Xgvfuch/M87zk2rTX/K+u05QROUMBVlrmkn+lvWxlHzsbjVj4uzlHFFec15/7UYCrFU6xcrF0ptbn5jNVADS9o47yvxed24yZRnchLz6dbpUSUlMhHNavSa3zeNskMIZzYOQChPyGmolNIXGz+Tn/lvu59d6jhtdVkZX1vm0AFVFSKpZfPNHKQ3SSBPsxCfMEWi8Rwtbkq5L3UqnH1OCtgNVleqRaf+MUjXrH0Sx2TUuklQAt+XPRykyAzFHNIfgkUUyV58k4FVOifhVLe0sUnGhknnyoAPaAjzHGUbkYxjOlHup0R7iPATqCI9vUMHHhwAR7SGCJrdnS/DjPOMd2nhwD4zS2CZEgCBRxZF8gQJgrkYwcqNmaiJ3QGMADMMMsyMeyAE/e6QII3TEP54XIbhXSufqfXarEebEwcH7swFBIDUqSyIYpPFrFzIV4ZhwLqBDGskOE6XUxwUsqkRwWVyF6xscw0P3lOgodqSgXRWqO1tnGZVwxiiGAYw3CbpWbTbDpMh+EGH2jDvcpuetk9EK8ME6UBQwkOoJUdc445RodHqb9YXxaeDJ8StwyogIrnXGUVUEkplx7mKWKJWn7gTH1PwQqEv4bBQRHzLKlJNbJRwJbrGq2zlps9fKEOD5MIEZ6Q5K7u1xNb2ZzXiEFYxDBEF8I9PaBDOTngLwkg8PzzO00cAAAAAElFTkSuQmCC",
			addon => !addon.applyBackgroundUpdates || addon.isBuiltin
		],
	},
	listContainerId: "ucf-aa-extra-items-container",
	showing(e) {
		var card = e.target.closest("addon-card");
		if (!card) return;

		this.labs = [];
		var imgs = new Map();
		var set = (key, val) => imgs.set(key, imgs.has(key) ? imgs.get(key).concat(val) : [val]);
		var entries = Object.entries(this.items);

		entries.forEach(([lab, [func, img, hideOn]], ind) => {
			this.labs.push(lab);
			(this[lab] = func).hideOn = hideOn;
			img && set(this.items[img]?.[1] ? entries.findIndex(a => a[0] == img): ind, ind);
		});
		if (imgs.size) {
			var cspRe = /^(?:chrome|file|jar|resource|moz-extension|https?):/;
			var [s, p, o] = this.vers >= 110
				? ["::part(button)", "background-image", "AUTHO"] : ["", "--icon", "USE"];

			var reg = [], push = (ind, icon) => {
				var chromeImg = "chrome://user_chrome_files/content/aaepiimg_" + ind;
				reg.push(["override", chromeImg, icon]);
				return chromeImg;
			}
			var rules = [];
			for(var [ind, nums] of imgs) {
				var sel = [], img = entries[ind][1][1];
				for(var num of nums) sel.push(
					`\t#${this.listContainerId} > panel-item:nth-child(${num + 1})${s}`
				);
				rules.push(`${sel.join(",\t\n")} {\n\t\t${p}: url(${
					cspRe.test(img) ? img : push(ind, img)
				}) !important;\n\t}`);
			}
			if (reg.length) {
				var ams = Cc["@mozilla.org/addons/addon-manager-startup;1"]
					.getService(Ci.amIAddonManagerStartup);
				var mUri = Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile));
				this.chromeReg = ams.registerChrome(mUri, reg);
			}
			this.regSheet(`\n${rules.join("\n")}\n}`, o + "R_SHEET");
		}
		delete this.items;

		self = this;
		this.sym = Symbol.for(this.listContainerId);
		(this.showing = e => {
			var card = e.target.closest("addon-card");
			card && this.onListShowind(card.addon, e.target);
		})(e);
		this.onListShowind(card.addon, e.target);
	},
	async onListShowind(addon, list) {
		var doc = list.ownerDocument, win = doc.ownerGlobal;
		var container = doc[this.sym];
		if (!container) {
			container = doc[this.sym] = doc.createElement("div");
			container.onclick = this.cclick;
			container.id = this.listContainerId;
			for(var lab of this.labs)
				container.appendChild(this.createPanelItem(doc)).append(lab);

			var mo = new win.MutationObserver(this.mut);
			(container.mo = mo).container = container;
		}
		for(var item of container.children) {
			var h = this[item.textContent].hideOn;
			item.hidden = h && (h.call ? h(addon) : h.includes(addon.type));
		}
		var {mo} = container;
		mo.disconnect();
		list.contains(container) || list.prepend(container);
		mo.count = 0;
		mo.ts = Date.now();
		mo.observe(list, {childList: true});
	},
	mut(muts, mo) {
		if (++mo.count > 10 || Date.now() - mo.ts > 100)
			return mo.disconnect();
		var list = muts[0].target, {container} = mo;
		if (list.firstElementChild != container)
			mo.disconnect(),
			list.prepend(container),
			mo.observe(list, {childList: true});
	},
	cclick(e) {
		e.stopImmediatePropagation();
		this.parentNode.hide();
		self[e.target.textContent](
			e.target.closest("addon-card").addon,
			e.view.windowRoot.ownerGlobal
		);
	},
	copy: str => (self.copy =
		Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString
	)(str),
	getFile(addon) {
		var file, uri = addon.getResourceURI();
		if (uri instanceof Ci.nsIJARURI) uri = uri.JARFile;
		if (uri instanceof Ci.nsIFileURL) file = uri.file;
		return file;
	},

	//================================================================================

	init(topic, quit) {
		Services.obs.addObserver(this, topic);
		Services.obs.addObserver(quit = (s, t) => {
			Services.obs.removeObserver(quit, t);
			Services.obs.removeObserver(this, topic);
		}, "quit-application-granted");
	},
	isTargetDoc: doc => doc.ownerGlobal.docShell
		.currentDocumentChannel.name.endsWith("/aboutaddons.html"),
	observe(doc) {
		if (!this.isTargetDoc(doc)) return;

		var vers = this.vers = parseInt(Services.appinfo.platformVersion);
		this.ts = `${vers >= 111 ? "moz-toggle" : "input"}[action="toggle-disabled"]`;

		css = css.replace("%TS%", this.ts)
			.replace(/%CN%/g, this.cn)
			.replace(/;$/gm, " !important;")
			.replace("%FD%", this.vertical ? "column" : "row");

		this.regSheet(css, "USER_SHEET");

		var unload = e => {
			e.target.removeEventListener("update", this, true);
			e.target.removeEventListener("showing", this, true);
		}
		var load = doc => {
			doc.addEventListener("update", this, true);
			doc.addEventListener("showing", this, true);
			var win = doc.ownerGlobal;
			win.addEventListener("unload", unload, {once: true});
			this.inactiveAddonsVersion(win);
		}
		this.handleEvent = e => this[e.type](e);
		this.observe = doc => this.isTargetDoc(doc) && load(doc);

		this.ccn = this.cn + "s-container";
		this.tInd = this.btnActions.findIndex(s => s == "toggle-disabled");

		this.btnActions = this.btnActions.map(
			action => `panel-list > panel-item[action="${action}"]`
		);
		this.createPanelItem = vers == 110
			? doc => new (doc.ownerGlobal.customElements.get("panel-item"))
			: doc => doc.createElement("panel-item");

		if (vers >= 89) this.clone = item => item.cloneNode(true);
		else {
			var cf = function(e) {
				var win = e.view;
				win.InspectorUtils.removeContentState(this, 4, true);
				Services.focus.clearFocus(win);
			}
			this.clone = item => {
				var clone = item.cloneNode(true);
				clone.onclick = cf;
				return clone;
			}
		}
		load(doc);
	},
	inactiveAddonsVersion(win) {
		var desc = win.Object.getOwnPropertyDescriptor(win.HTMLElement.prototype, "title");
		var {set} = desc, cfg = {attributes: true, attributeFilter: ["title"]};

		var handleMuts = function(m, {trg, val}) {
			this.disconnect();
			var txt = trg.firstChild;
			if (txt) txt.data = txt.data.replace(trg.closest("addon-card").addon.name, val);
		}
		desc.set = function(val) {
			set.call(this, val);
			if (this.getAttribute("data-l10n-id") != "addon-name-disabled") return;

			var mo = new win.MutationObserver(handleMuts);
			mo.val = val;
			mo.observe(mo.trg = this, cfg);
		}
		for(var Elm of [win.HTMLAnchorElement, win.HTMLHeadingElement])
			win.Object.defineProperty(Elm.prototype, "title", desc);
	},
	regSheet(...args) {
		var prfx = "data:text/css;charset=utf8,@-moz-document url(about:addons),%0A"
			+ "url(chrome://mozapps/content/extensions/aboutaddons.html) {";
		var sss = Cc["@mozilla.org/content/style-sheet-service;1"]
			.getService(Ci.nsIStyleSheetService);
		(this.regSheet = (code, origin) => sss.loadAndRegisterSheet(
			Services.io.newURI(prfx + encodeURIComponent(code)), sss[origin]
		))(...args);
	}
}).init("chrome-document-loaded"))(`\

	span.%CN%s-container {
		display: flex;
		flex-direction: %FD%;
		row-gap: 1px;
	}
	addon-card[expanded] span.%CN%s-container {
		flex-direction: row;
	}
	button.%CN% {
		-moz-appearance: none;

		margin: 0 1px;
		padding: 1px 6px 3px 6px;
		background-image: none;
		background-color: rgba(174, 236, 235, 0.9);

		border-radius: 0;
		border: 1px solid #bbb;

		font-size: 13px;
		white-space: nowrap;
		font-family: Segoe UI;
	}
	button.%CN%:hover {
		background-color: gold;
	}
	button.%CN%:after, %TS% {
		display: none;
	}
}`);

Отсутствует

 

№80306-05-2023 21:25:02

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 101
UA: Firefox 112.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Возвращаю модифицированный.

Шедеврально! Большое спасибо!
Addons-1.1683397339.png
Работает также в 78, 91, 102.

Отсутствует

 

№80407-05-2023 19:09:40

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 112.0

Re: UCF - ваши кнопки, скрипты…

Dumby
Вы копирование uuid можете добавить? Иногда надо в расширении что то подправить и приходится в отладку идти, и там искать, выделять, копировать.

Отсутствует

 

№80507-05-2023 22:03:26

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 112.0

Re: UCF - ваши кнопки, скрипты…

Попытался скрестить этот стиль со скриптом и максимум что у меня получилось:
   
ae46ed52c168278c12a7105a9795536d.jpeg  68311a36b936a3ddb129f4e4a52aec4b.jpeg 
Не знаю как flex-ы разделить, что бы меню скрипта оставалось как меню, а не встраивалось в таблицу, если это вообще возможно.

Отредактировано _zt (07-05-2023 22:04:54)

Отсутствует

 

№80607-05-2023 23:28:49

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

_zt пишет

Иногда надо в расширении что то подправить и приходится в отладку идти, и там искать, выделять, копировать

Далее, ожидалось «, затем …», но найдено «.»

Вы копирование uuid можете добавить?

Не исключено

скрытый текст

Выделить код

Код:

//...
		"копирование uuid": [
			addon => self.copy(addon.isActive
				? Cu.getGlobalForObject(Cu).WebExtensionPolicy.getByID(addon.id).mozExtensionHostname
				: JSON.parse(Services.prefs.getCharPref("extensions.webextensions.uuids", "{}"))[addon.id]
			),
			"Копировать имя",
			addon => addon.type != "extension" || !(addon.isWebExtension ?? true)
		],

Попытался скрестить этот стиль со скриптом и максимум что у меня получилось:

Ожидался код стиля попытки получившегося максимума, но найдено ничего.

Отсутствует

 

№80708-05-2023 00:39:11

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 112.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Далее, ожидалось «, затем …», но найдено «.»

:) Затем userContent.css

скрытый текст

Выделить код

Код:

@-moz-document url-prefix(moz-extension://uuid/) {
…
}

а далее Reload userChrome/userContent
   

Dumby пишет

Ожидался код стиля попытки получившегося максимума, но найдено ничего.

Так это просто заготовка. Я ни в чем не уверен и тестировал только на full_theme от VitalyV.

скрипт

Выделить код

Код:

удалено

стиль

Выделить код

Код:

удалено

Отредактировано _zt (08-05-2023 18:05:34)

Отсутствует

 

№80808-05-2023 01:17:09

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 112.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Не исключено

Спасибо, работает.
   
И по поводу скрипта, у меня не везде срабатывал поиск на AMO, вместо этого пытался открыть домашнюю страницу, поэтому изменил пункт. Не знаю, верно или нет.

Отсутствует

 

№80908-05-2023 08:25:49

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

_zt пишет

userContent.css

Ааа, вот оно что.
Я-то прочитал «в расширении что то подправить»,
как «влезьть внутрь .xpi и там похозяйничать».

скрипт

Ух, неслабо ты его покрамсал.


Я так понимаю, предпочтение отдано
стилем-выведенным кнопкам, а не скриптом-добавленным кнопкам.
Тогда я тоже не знаю что здесь можно сделать.


Если бы наоборот, то хоть что-то можно было бы попробовать.
Я вот в стиле закомментировал этот кусок

скрытый текст

Выделить код

Код:

addon-card panel-list {
    position: static !important;
    display: block !important;
    background: none !important;
    border: none !important;
    border-radius: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
    box-shadow: none !important;
    min-width: 0 !important;
}


а в скрипте поменял
скрытый текст

Выделить код

Код:

/*
	vertical: true,
	btnActions: ["toggle-disabled"],
*/
	vertical: false,
	btnActions: ["remove", "install-update", "preferences"],
Выделить код

Код:

/*
	onCard(card, again) {
		var btnsParent = card.querySelector("addon-options");
		if (!btnsParent) return again || card.ownerGlobal
			.requestAnimationFrame(() => this.onCard(card, true));

		var doc = card.ownerDocument;
		var [span] = card.getElementsByClassName(this.ccn);
		if (span) span.textContent = "";
		else
			card.querySelector("button.more-options-button")
				.before(span = doc.createElement("span")),
			span.className = this.ccn;
	},
*/
	onCard(card, again) {
		var btnsParent = card.querySelector("addon-options");
		if (!btnsParent) return again || card.ownerGlobal
			.requestAnimationFrame(() => this.onCard(card, true));

		var doc = card.ownerDocument;
		var [span] = card.getElementsByClassName(this.ccn);

		var moreOptionsButton = card.querySelector("button.more-options-button");

		if (span) span.textContent = "";
		else
			moreOptionsButton.before(span = doc.createElement("span")),
			span.className = this.ccn;

		for(var sel of this.btnActions) {
			var item = btnsParent.querySelector(sel);
			if (item)
				span.append(item = this.clone(item)),
				item.shadowRoot.querySelector("button").classList.add(this.cn);
		}
		span.querySelector("[action=remove]").before(moreOptionsButton);
	},


и, у меня, в 113, выглядит так
(отображение добра в <panel-list>'е, конечно, надо править)
скрытый текст

Выделить код

Код:

data:image/png;base64,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

изменил пункт. Не знаю, верно или нет.

Ну, не то, чтобы прямо совсем неверно, но выражение
("https://addons.mozilla.org/search/?q=" + encodeURIComponent(addon.name)) || addon.homepageURL
это типа true || something
Результатом такого выражения никогда не будет something.
То есть, можно оставить только то, что в скобках.

Отсутствует

 

№81008-05-2023 17:59:18

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 112.0

Re: UCF - ваши кнопки, скрипты…

Dumby
Отлично, спасибо. Видимо я недотыркал. :)
   
Последняя проблема, при наличии обновлений тултип кнопки с меню обрезается по высоте. На первой анимации видно.

gif-ки
BrmPUqvM.gif
   
e66uHz7s.gif
скрипт

Выделить код

Код:

(async (css, self) => ({

	//===[ Buttons ]===================================================================

	vertical: false,
	btnActions: ["remove", "install-update", "preferences"],

	cn: "ucf-cloned-button",
	update(e) {
		var trg = e.target;
		trg.nodeName == "ADDON-CARD" && trg.addon.type != "theme" && this.onCard(trg);
	},
	onCard(card, again) {
		var btnsParent = card.querySelector("addon-options");
		if (!btnsParent) return again || card.ownerGlobal
			.requestAnimationFrame(() => this.onCard(card, true));

		var doc = card.ownerDocument;
		var [span] = card.getElementsByClassName(this.ccn);
		if (span) span.textContent = "";
		else
			card.querySelector("button.more-options-button")
				.before(span = doc.createElement("span")),
			span.className = this.ccn;

		var item, num = 0;
		for(var sel of this.btnActions) {
			if (num++ == this.tInd) {
				if (!card.querySelector(this.ts)) continue;
				item = this.createPanelItem(doc);
				item.setAttribute("action", "toggle-disabled");
				doc.l10n.setAttributes(item, `${
					btnsParent.parentNode.getAttribute("active") == "true" ? "dis" : "en"
				}able-addon-button`);
			} else {
				item = btnsParent.querySelector(sel);
				if (!item) continue;
				item = this.clone(item);
			}
			span.append(item);
			item.shadowRoot.querySelector("button").classList.add(this.cn);
		}
	},

	//===[ Popup ]=====================================================================

	items: {
		"Копировать имя": [
			addon => self.copy(addon.name),
		],
		"Копировать ID": [
			addon => self.copy(addon.id),
			"Копировать имя"
		],
		"Копировать UUID": [
			addon => self.copy(addon.isActive
				? Cu.getGlobalForObject(Cu).WebExtensionPolicy.getByID(addon.id).mozExtensionHostname
				: JSON.parse(Services.prefs.getCharPref("extensions.webextensions.uuids", "{}"))[addon.id]
			),
			"Копировать имя",
			addon => addon.type != "extension" || !(addon.isWebExtension ?? true)
		],
//		"Копировать версию": [
//			addon => self.copy(addon.version),
//			"Копировать имя",
//			addon => !addon.version
//		],
//		"Копировать имя и версию": [
//			addon => self.copy(addon.name + " " + addon.version),
//			"Копировать имя",
//			addon => !addon.version
//		],
		"Коп. URL кнопки": [
			(addon, win) => {
				var btn = Object.assign({
					parameters: {},
					get initcode() {return this.initCode;},
					setText(doc, name, t, cds) {
						win.custombutton.buttonSetText(doc, name, this[name], cds);
					}
				}, win.custombuttons.cbService.getButtonParameters(addon.buttonLink));
				self.copy(win.custombutton.buttonGetURI(btn));
			},
			"Копировать имя",
			addon => addon.type != "custombuttons"
		],
		"Домашняя страница": [
			(addon, win) => win.openURL(addon.homepageURL || addon.reviewURL.replace(/\/reviews\/.*$/, "/")),
			addon => !addon.homepageURL && !addon.reviewURL
		],
		"Поиск на АМО": [
			(addon, win) => win.openURL(
				("https://addons.mozilla.org/search/?q=" + encodeURIComponent(addon.name))
			),
			["custombuttons", "theme", "plugin"]
		],
		"Папка установки": [
			addon => self.getFile(addon).reveal(),
			["custombuttons", "theme", "plugin"]
		],
		"Файл установки": [
			addon => self.getFile(addon).launch(),
			["custombuttons", "theme", "plugin"]
		],
		"Проверить обновления": [
			Cr.NS_ERROR_NET_TIMEOUT_EXTERNAL // Fx 87+
				? (addon, win) => win.content.checkForUpdate(addon)
				: (addon, win) => win.content.frames[0].checkForUpdate(addon),
			addon => !addon.applyBackgroundUpdates || addon.isBuiltin
		],
	},
	listContainerId: "ucf-aa-extra-items-container",
	showing(e) {
		var card = e.target.closest("addon-card");
		if (!card) return;

		this.labs = [];
		var imgs = new Map();
		var set = (key, val) => imgs.set(key, imgs.has(key) ? imgs.get(key).concat(val) : [val]);
		var entries = Object.entries(this.items);

		entries.forEach(([lab, [func, img, hideOn]], ind) => {
			this.labs.push(lab);
			(this[lab] = func).hideOn = hideOn;
			img && set(this.items[img]?.[1] ? entries.findIndex(a => a[0] == img): ind, ind);
		});

		self = this;
		this.sym = Symbol.for(this.listContainerId);
		(this.showing = e => {
			var card = e.target.closest("addon-card");
			card && this.onListShowind(card.addon, e.target);
		})(e);
		this.onListShowind(card.addon, e.target);
	},
	async onListShowind(addon, list) {
		var doc = list.ownerDocument, win = doc.ownerGlobal;
		var container = doc[this.sym];
		if (!container) {
			container = doc[this.sym] = doc.createElement("div");
			container.onclick = this.cclick;
			container.id = this.listContainerId;
			for(var lab of this.labs)
				container.appendChild(this.createPanelItem(doc)).append(lab);

			var mo = new win.MutationObserver(this.mut);
			(container.mo = mo).container = container;
		}
		for(var item of container.children) {
			var h = this[item.textContent].hideOn;
			item.hidden = h && (h.call ? h(addon) : h.includes(addon.type));
		}
		var {mo} = container;
		mo.disconnect();
		list.contains(container) || list.prepend(container);
		mo.count = 0;
		mo.ts = Date.now();
		mo.observe(list, {childList: true});
	},
	mut(muts, mo) {
		if (++mo.count > 10 || Date.now() - mo.ts > 100)
			return mo.disconnect();
		var list = muts[0].target, {container} = mo;
		if (list.firstElementChild != container)
			mo.disconnect(),
			list.prepend(container),
			mo.observe(list, {childList: true});
	},
	cclick(e) {
		e.stopImmediatePropagation();
		this.parentNode.hide();
		self[e.target.textContent](
			e.target.closest("addon-card").addon,
			e.view.windowRoot.ownerGlobal
		);
	},
	copy: str => (self.copy =
		Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString
	)(str),
	getFile(addon) {
		var file, uri = addon.getResourceURI();
		if (uri instanceof Ci.nsIJARURI) uri = uri.JARFile;
		if (uri instanceof Ci.nsIFileURL) file = uri.file;
		return file;
	},

	//================================================================================

	init(topic, quit) {
		Services.obs.addObserver(this, topic);
		Services.obs.addObserver(quit = (s, t) => {
			Services.obs.removeObserver(quit, t);
			Services.obs.removeObserver(this, topic);
		}, "quit-application-granted");
	},
	isTargetDoc: doc => doc.ownerGlobal.docShell
		.currentDocumentChannel.name.endsWith("/aboutaddons.html"),
	observe(doc) {
		if (!this.isTargetDoc(doc)) return;

		var vers = this.vers = parseInt(Services.appinfo.platformVersion);
		this.ts = `${vers >= 111 ? "moz-toggle" : "input"}[action="toggle-disabled"]`;

		css = css.replace("%TS%", this.ts)
			.replace(/%CN%/g, this.cn)
			.replace(/;$/gm, " !important;")
			.replace("%FD%", this.vertical ? "column" : "row");

		this.regSheet(css, "USER_SHEET");

		var unload = e => {
			e.target.removeEventListener("update", this, true);
			e.target.removeEventListener("showing", this, true);
		}
		var load = doc => {
			doc.addEventListener("update", this, true);
			doc.addEventListener("showing", this, true);
			var win = doc.ownerGlobal;
			win.addEventListener("unload", unload, {once: true});
			this.inactiveAddonsVersion(win);
		}
		this.handleEvent = e => this[e.type](e);
		this.observe = doc => this.isTargetDoc(doc) && load(doc);

		this.ccn = this.cn + "s-container";
		this.tInd = this.btnActions.findIndex(s => s == "toggle-disabled");

		this.btnActions = this.btnActions.map(
			action => `panel-list > panel-item[action="${action}"]`
		);
		this.createPanelItem = vers == 110
			? doc => new (doc.ownerGlobal.customElements.get("panel-item"))
			: doc => doc.createElement("panel-item");

		if (vers >= 89) this.clone = item => item.cloneNode(true);
		else {
			var cf = function(e) {
				var win = e.view;
				win.InspectorUtils.removeContentState(this, 4, true);
				Services.focus.clearFocus(win);
			}
			this.clone = item => {
				var clone = item.cloneNode(true);
				clone.onclick = cf;
				return clone;
			}
		}
		load(doc);
	},
	inactiveAddonsVersion(win) {
		var desc = win.Object.getOwnPropertyDescriptor(win.HTMLElement.prototype, "title");
		var {set} = desc, cfg = {attributes: true, attributeFilter: ["title"]};

		var handleMuts = function(m, {trg, val}) {
			this.disconnect();
			var txt = trg.firstChild;
			if (txt) txt.data = txt.data.replace(trg.closest("addon-card").addon.name, val);
		}
		desc.set = function(val) {
			set.call(this, val);
			if (this.getAttribute("data-l10n-id") != "addon-name-disabled") return;

			var mo = new win.MutationObserver(handleMuts);
			mo.val = val;
			mo.observe(mo.trg = this, cfg);
		}
		for(var Elm of [win.HTMLAnchorElement, win.HTMLHeadingElement])
			win.Object.defineProperty(Elm.prototype, "title", desc);
	},
	regSheet(...args) {
		var prfx = "data:text/css;charset=utf8,@-moz-document url(about:addons),%0A"
			+ "url(chrome://mozapps/content/extensions/aboutaddons.html) {";
		var sss = Cc["@mozilla.org/content/style-sheet-service;1"]
			.getService(Ci.nsIStyleSheetService);
		(this.regSheet = (code, origin) => sss.loadAndRegisterSheet(
			Services.io.newURI(prfx + encodeURIComponent(code)), sss[origin]
		))(...args);
	}
}).init("chrome-document-loaded"))(`\

	span.%CN%s-container {
		display: flex;
		flex-direction: %FD%;
		row-gap: 1px;
	}
	addon-card[expanded] span.%CN%s-container {
		flex-direction: row;
	}
}`);

стиль

Выделить код

Код:

@media (prefers-color-scheme: dark) {
#details-deck .inline-options-stack {
    background-color: rgba(43,42,51,.8) !important;
  }
}
#categories button.category {
    border: none !important;
}
/********* Показывает версии дополнений ***************************************/
@-moz-document  url("about:addons"), url("chrome://mozapps/content/extensions/aboutaddons.html") {
*|*[current-view="list"] .addon-name-link[title] {
    font-size: 0 !important;
    display: flex !important;
    flex-direction: row !important;
  }
*|*[current-view="list"] .addon-name-link[title]::after {
    display: block !important;
    content: attr(title) !important;
    font-size: 1rem !important;
    line-height: 1em !important;
  }
/* hide version number on updates category */
div[current-view="updates"] .addon-name-link[title]::after {
    display: none !important;
    visibility: collapse !important;
    opacity: 0 !important;
  }
}
/* Добавляет кнопки вместо меню: включить, отключить, удалить, настройки... ***/
/* https://forum.mozilla-russia.org/viewtopic.php?pid=793823#p793823
 * Чтобы вернуть текст кнопкам, то в #main:
 * --v-buttons-font-size: Xrem;
 * Чтобы убрать текст для кнопок определенного типа там есть пример
 * addon-card panel-item[action="report"]
 * Убрать иконки: --v-buttons-icon-size: 0px;                                 */
@-moz-document  url("about:addons"), url("chrome://mozapps/content/extensions/aboutaddons.html") {
:root {
    --v-content-button-border-color: var(--in-content-box-border-color, rgba(12, 12, 13, 0.3));
    --v-content-button-border-color-hover: var(--in-content-border-hover, rgba(12, 12, 13, 0.5));
    --v-content-button-background: var(--in-content-button-background, rgba(12, 12, 13, 0.1));
    --v-content-button-background-hover: var(--in-content-button-background-hover, rgba(12, 12, 13, 0.15));
    --v-content-button-background-active: var(--in-content-button-background-active, rgba(12, 12, 13, 0.2));
    --v-content-button-color: var(--in-content-button-text-color, #0c0c0d);
    --v-content-button-color-hover: var(--in-content-button-text-color-hover, #0c0c0d);
    --v-content-button-color-active: var(--in-content-button-text-color-hover, #0c0c0d);
    --v-buttons-tooltip-color: var(--in-content-page-color, #0c0c0d);
    --v-buttons-tooltip-background: var(--in-content-box-background, #ffffff);
    --v-buttons-tooltip-border-color: var(--in-content-box-border-color, rgba(12, 12, 13, 0.3));
    --v-main-max-width: 1000px;
    --card-padding: 8px !important;
    --section-width: 664px !important;
    --addon-icon-size: 32px !important;
}
#main {
    --v-buttons-font-size: 0.8rem; // 0;
    --v-buttons-font-weight: bold;
    --v-buttons-border-radius: 4px;
    --v-buttons-border-width: 1px;
    --v-buttons-min-height: 26px;
    --v-buttons-tooltip-font-size: 0.8rem;
    --v-buttons-tooltip-border-radius: 2px;
    --v-buttons-tooltip-delay: .5s;
    --v-buttons-tooltip-translate-x: -132px;
    --v-buttons-tooltip-translate-y: 15px;
    --v-buttons-width: auto;
    --v-list-display-flex: flex;
}
@media (prefers-color-scheme: dark) {
:root {
    --v-content-button-border-color: var(--in-content-box-border-color, rgba(200, 200, 210, 0.2));
    --v-content-button-border-color-hover: var(--in-content-border-hover, rgba(249, 249, 250, 0.3));
    --v-content-button-background: var(--in-content-button-background, rgba(249, 249, 250, 0.1));
    --v-content-button-background-hover: var(--in-content-button-background-hover, rgba(249, 249, 250, 0.15));
    --v-content-button-background-active: var(--in-content-button-background-active, rgba(249, 249, 250, 0.2));
    --v-content-button-color: var(--in-content-button-text-color, #f9f9fa);
    --v-content-button-color-hover: var(--in-content-button-text-color-hover, #f9f9fa);
    --v-content-button-color-active: var(--in-content-button-text-color-hover, #f9f9fa);
    --v-buttons-tooltip-color: var(--in-content-page-color, rgba(200, 200, 210, 0.5));
    --v-buttons-tooltip-background: rgba(40, 40, 50, 0.85);
    --v-buttons-tooltip-border-color: rgba(120, 120, 120, 0.3);
}
}
#moz-toggle-button.toggle-button,
addon-card .theme-enable-button {
    --v-buttons-font-size: 0;
    --v-buttons-toggle-button-content: "Включить";
    --v-buttons-tooltip-content: "Включить дополнение";
    --v-buttons-tooltip-display: block;
    --icon: url("chrome://global/skin/icons/check-partial.svg");
}
#moz-toggle-button.toggle-button[aria-pressed="true"],
addon-card .card[active="true"] .theme-enable-button {
    --v-buttons-toggle-button-content: "Отключить";
    --v-buttons-tooltip-content: "Отключить дополнение";
    --v-buttons-tooltip-display: block;
    --icon: url("chrome://global/skin/icons/check.svg");
    --v-content-button-background: rgba(85,255,85, 0.2);
}
addon-card panel-item[action="remove"] {
    --v-buttons-font-size: 0;
    --v-buttons-tooltip-content: "Удалить дополнение";
    --v-buttons-tooltip-display: block;
    --icon: url("chrome://global/skin/icons/delete.svg");
    --v-content-button-background: rgba(255,85,85, 0.3);
    --v-content-button-background-hover: rgba(255,85,85, 0.8);
}
addon-card panel-item[action="install-update"] {
    --v-buttons-font-size: 0;
    --v-buttons-tooltip-content: "Обновить дополнение";
    --v-buttons-tooltip-display: block;
    --icon: url("chrome://global/skin/icons/update-icon.svg");
    --v-content-button-background: rgba(49,140,231, 0.3);
    --v-content-button-background-hover: rgba(49,140,231, 0.8);
}
addon-card panel-item[action="preferences"] {
    --v-buttons-font-size: 0;
    --v-buttons-tooltip-content: "Настройки дополнения";
    --v-buttons-tooltip-display: block;
    --icon: url("chrome://global/skin/icons/settings.svg");
    --v-content-button-background: rgba(85,85,255, 0.3);
    --v-content-button-background-hover: rgba(85,85,255, 0.8);
}
/* Скрыть "Пожаловаться на дополнение" */
addon-card panel-item[action="report"] {
    display: none !important;
}
addon-list[type="plugin"] addon-card panel-item:not([checked]) {
    --icon: url("chrome://global/skin/icons/check-partial.svg");
}
addon-card button.more-options-button {
    --v-buttons-tooltip-content: "Дополнительные действия";
    --v-buttons-tooltip-display: block;
    --v-buttons-tooltip-translate-x: 0px !important;
    width: 26px !important;
    height: 26px !important;
    margin: 0 0 0 2px !important;
    padding: 0 0 0 0 !important;
    border-radius: 4px !important;
}
body {
    margin: 0 !important;
}
#main {
    max-width: var(--v-main-max-width) !important;
    margin-inline-start: 16px !important;
    margin-inline-end: 16px !important;
}
addon-card message-bar {
    --card-padding: inherit !important;
}
addon-card .card-contents {
    width: auto !important;
    overflow-x: hidden !important;
    flex-grow: 1 !important;
}
addon-card .card {
    display: grid !important;
    grid-template-columns: 1fr auto !important;
}
addon-card .card > * {
    grid-column-start: 1 !important;
    grid-column-end: 3 !important;
}
addon-card .card > .addon-card-collapsed {
    grid-column-start: 1 !important;
    grid-column-end: 2 !important;
    grid-row-start: 1 !important;
    overflow-x: hidden !important;
}
addon-card .card > addon-options {
    grid-column-start: 2 !important;
    grid-column-end: 3 !important;
    grid-row-start: 1 !important;
    align-self: start !important;
    min-width: 0 !important;
    overflow-x: hidden !important;
}
img.card-heading-image {
    margin: calc(var(--card-padding) * -1) calc(var(--card-padding) * -1) var(--card-padding) !important;
    width: calc(var(--card-padding) * 2 + 100%) !important;
    height: auto !important;
    object-fit: cover !important;
}
addon-card .card > img.card-heading-image:not([hidden]) {
    display: inline !important;
}
addon-card .card > img.card-heading-image:not([hidden]) + .addon-card-collapsed,
addon-card .card > img.card-heading-image:not([hidden]) + .addon-card-collapsed ~ addon-options {
    grid-row-start: 2 !important;
}
addon-card .addon-name-container {
    margin-top: 0 !important;
}
div.arrow.top ~ div.list {
    display: var(--v-list-display-flex, block) !important;
    justify-content: end !important;
}
#ucf-aa-extra-items-container panel-item {
    --v-buttons-font-size: 0.8rem;
    --v-buttons-font-weight: normal;
    --v-buttons-border-radius: 2px;
    --v-buttons-border-width: 1px;
    --v-buttons-min-height: 16px;
    --v-buttons-width: 100%;
}
addon-card panel-list {
    border: 1px solid var(--v-buttons-tooltip-border-color) !important;
    padding: 1px 0 !important;
    margin: 1px !important;
    opacity: 0.9 !important; /**/
}
addon-card panel-list panel-item[data-l10n-id="remove-addon-button"],
addon-card panel-list panel-item[data-l10n-id="install-update-button"],
addon-card panel-list panel-item[data-l10n-id="preferences-addon-button"],
addon-card panel-list panel-item[data-l10n-id="report-addon-button"],
addon-card panel-list panel-item[data-l10n-id="manage-addon-button"] {
    display: none !important;
}
addon-card panel-list panel-item {
    margin: 1px !important;
}
addon-card panel-item:where(:not([hidden])) {
    padding: 0 !important;
    margin: 0 !important;
    display: flex !important;
    align-items: center !important;
}
style + div.container {
    padding-top: 0 !important;
    padding-bottom: 0 !important;
}
addon-card panel-item[action="expand"],
div.arrow.top, div.arrow.bottom,
addon-card panel-item-separator {
    display: none !important;
}
#moz-toggle-button.toggle-button,
addon-card button.theme-enable-button,
link[href$="panel-item.css"] ~ button {
    display: flex !important;
    align-items: center !important;
    width: var(--v-buttons-width, 100%) !important;
    min-height: var(--v-buttons-min-height, 26px) !important;
    height: auto !important;
    line-height: 1.25em !important;
    padding: 0px calc(4px + .25em) !important;
    margin: 0 2px !important;
    background-image: var(--icon, none) !important;
    background-repeat: no-repeat !important;
    background-size: var(--v-buttons-icon-size, 16px) !important;
    background-position-y: center !important;
    background-position-x: left 4px !important;
    padding-inline-start: calc(4px + .25em + var(--v-buttons-icon-size, 16px)) !important;
    background-color: var(--v-content-button-background) !important;
    border-color: var(--v-content-button-border-color) !important;
    border-style: solid !important;
    border-width: var(--v-buttons-border-width, 0px) !important;
    color: var(--v-content-button-color) !important;
    border-radius: var(--v-buttons-border-radius, 0) !important;
    font-weight: var(--v-buttons-font-weight, inherit) !important;
    font-size: var(--v-buttons-font-size, inherit) !important;
    appearance: none !important;
    box-shadow: none !important;
    outline: none !important;
    -moz-context-properties: fill;
    fill: currentColor;
}
#moz-toggle-button.toggle-button,
addon-card button.theme-enable-button {
    padding-inline-start: 0 !important;
}
#moz-toggle-button.toggle-button {
    border-color: var(--v-content-button-border-color) !important;
}
#moz-toggle-button.toggle-button:enabled:hover,
addon-card button.theme-enable-button:enabled:hover,
addon-card button.more-options-button:enabled:hover,
link[href$="panel-item.css"] ~ button:enabled:hover {
    background-color: var(--v-content-button-background-hover) !important;
    color: var(--v-content-button-color-hover) !important;
    border-color: var(--v-content-button-border-color-hover) !important;
}
#moz-toggle-button.toggle-button:hover:active,
addon-card button.theme-enable-button:enabled:hover:active,
link[href$="panel-item.css"] ~ button:enabled:hover:active {
    background-color: var(--v-content-button-background-active) !important;
    color: var(--v-content-button-color-active) !important;
}
#moz-toggle-button.toggle-button::-moz-focus-inner,
addon-card button.theme-enable-button::-moz-focus-inner,
link[href$="panel-item.css"] ~ button::-moz-focus-inner {
    border: none !important;
}
link[href$="panel-item.css"] ~ button::after {
    inset: 0px !important;
    bottom: auto !important;
    height: 3px !important;
    width: auto !important;
    border-radius: 0 !important;
}
#moz-toggle-button.toggle-button::before {
    all: unset !important;
    display: inline-block !important;
    content: var(--v-buttons-toggle-button-content, none) !important;
    white-space: nowrap !important;
    margin-inline-start: calc(4px + .25em + var(--v-buttons-icon-size, 16px)) !important;
}
#moz-toggle-button.toggle-button:dir(rtl),
addon-card button.theme-enable-button:dir(rtl),
addon-card button.more-options-button:dir(rtl),
link[href$="panel-item.css"] ~ button:dir(rtl) {
    background-position-x: right 4px !important;
}
link[href$="panel-item.css"] ~ button > label {
    padding: 0 !important;
    margin: 0 !important;
}
addon-card .more-options-menu {
    flex-grow: 0 !important;
    position: static !important;
    margin: 0 !important;
    align-self: start !important;
}
addon-card .addon-name,
addon-card .addon-description {
    white-space: nowrap !important;
    overflow-x: hidden !important;
    text-overflow: ellipsis !important;
}
#moz-toggle-button.toggle-button::after,
addon-card button.theme-enable-button::after,
addon-card button.more-options-button::after,
addon-card panel-item::after {
    display: var(--v-buttons-tooltip-display, none) !important;
    content: "";
    max-width: 0;
    pointer-events: none !important;
}
#moz-toggle-button.toggle-button:hover::after,
addon-card button.theme-enable-button:hover::after,
addon-card button.more-options-button:hover::after,
addon-card panel-item:hover::after {
    animation-name: tooltip_delay !important;
    animation-timing-function: step-end !important;
    animation-duration: 0s !important;
    animation-iteration-count: 1 !important;
    animation-fill-mode: forwards !important;
    animation-delay: var(--v-buttons-tooltip-delay, .5s) !important;
    --v-buttons-tooltip-transform: translate(calc(1px + var(--v-buttons-tooltip-translate-x)), calc(100% + var(--v-buttons-tooltip-translate-y)));
}
@keyframes tooltip_delay {
    from {
        max-width: 0;
    }
    to {
        content: var(--v-buttons-tooltip-content, "");
        align-self: flex-end;
        position: absolute;
        color: var(--v-buttons-tooltip-color);
        background: var(--v-buttons-tooltip-background);
        border: 1px solid var(--v-buttons-tooltip-border-color);
        border-radius: var(--v-buttons-tooltip-border-radius, 0);
        padding: 2px 0px 4px 0px;
        min-width: 15em;
        max-width: 50em;
        line-height: 1.25em;
        font-size: 0.7rem;
        font-weight: normal;
        text-align: center;
        z-index: var(--z-index-popup, 10);
        overflow: hidden;
        text-overflow: ellipsis;
        transform: var(--v-buttons-tooltip-transform, none);
    }
}
addon-card .toggle-button:hover::after,
addon-card button.theme-enable-button:hover::after {
    --v-buttons-tooltip-transform: translate(calc(var(--v-buttons-tooltip-translate-x) - 1px), calc(100% + 1px + var(--v-buttons-tooltip-translate-y)));
}
addon-card button.theme-enable-button::before {
    content: "";
    display: inline-block;
    width: calc(4px + .25em + var(--v-buttons-icon-size, 16px));
  }
}
/* custom_css_for_fx - recentupdates_category_always_visible ******************/
/* Github: https://github.com/aris-t2/customcssforfx **************************/
@-moz-document url-prefix(about:addons),
    url-prefix(chrome://mozapps/content/extensions/aboutaddons.html) {
    #categories .category[name="recent-updates"][disabled],
    #category-recentUpdates[disabled] {
      overflow: visible !important;
      height: 48px !important;
      min-height: 48px !important;
      opacity: 1 !important;
      transition-property: unset !important;
      transition-duration: unset !important;
      -moz-user-input: unset !important;
    }
    #categories .category[name="recent-updates"][hidden],
    #category-recentUpdates[hidden] {
      opacity: 1 !important;
      min-height: 48px !important;
      height: 48px !important;
      display: inherit !important;
      transition: unset !important;
    }
}

В стиле заодно поправил отображение заголовка в представлениях обновлений, а то скрывался вместе с версией.

Отсутствует

 

№81108-05-2023 21:17:06

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

_zt пишет

при наличии обновлений тултип кнопки с меню обрезается по высоте

Увы, не получилось воспроизвести.


Может добавить в @keyframes, в to {…}, какой-нибудь min-height
Так, пальцем в небо.

Отсутствует

 

№81208-05-2023 22:32:48

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 112.0

Re: UCF - ваши кнопки, скрипты…

Dumby
Пробовал. Потом еще раз посмотрю, когда с сюрпризами 113 разберусь - стили менюшек развалились.

Отсутствует

 

№81309-05-2023 07:07:04

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 113.0

Re: UCF - ваши кнопки, скрипты…

Dumby, в 113 [firefox] вертикальная панель отвалилась. Есть уже решение?

Отсутствует

 

№81409-05-2023 11:49:53

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 599
UA: Firefox 113.0

Re: UCF - ваши кнопки, скрипты…

voqabuhe пишет

в 113  вертикальная панель отвалилась. Есть уже решение?

Заменить в vertical_top_bottom_bar.css:


display: -moz-box --> display: flex
-moz-box-flex --> flex-grow
-moz-box-orient: vertical --> flex-direction: column
-moz-box-align --> align-items
-moz-box-pack --> justify-content

Отредактировано unter_officer (09-05-2023 11:53:58)


«The Truth Is Out There»

Отсутствует

 

№81509-05-2023 12:03:13

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

voqabuhe
Я вот так написал в vertical_top_bottom_bar.css

скрытый текст

Выделить код

Код:

/*
#ucf-additional-vertical-container {
    display: -moz-box !important;
}
*/
@supports (display: -moz-box) {
    #ucf-additional-vertical-container {
        display: -moz-box !important;
    }
}
@supports not (display: -moz-box) {
    #ucf-additional-vertical-container {
        display: flex !important;
    }
    #ucf-additional-vertical-bar {
        flex-grow: 1 !important;
    }
}

Отсутствует

 

№81609-05-2023 12:22:40

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 113.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Я вот так написал в vertical_top_bottom_bar.css

Во, спасибо, появилась.

unter_officer пишет

Заменить в vertical_top_bottom_bar.css:

Спасибо. Но вариант от Dumby требует меньше движений.

Отсутствует

 

№81709-05-2023 12:26:48

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 599
UA: Firefox 113.0

Re: UCF - ваши кнопки, скрипты…

voqabuhe пишет

Спасибо. Но вариант от Dumby требует меньше движений.

Пожалуйста.
Только мой вариант не совсем мой. Он от автора UCF. ;)

Отредактировано unter_officer (09-05-2023 12:27:18)


«The Truth Is Out There»

Отсутствует

 

№81809-05-2023 12:28:27

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 113.0

Re: UCF - ваши кнопки, скрипты…

Dumby, а посмотри ещё пожайлуста, чего-то Findbar вниз уехал.

скрытый текст

Выделить код

Код:

@-moz-document url("chrome://browser/content/browser.xhtml") {
:root {
    --v-findbar-flex-direction: row; /* row-reverse - findbar справа */
    --v-findbar-container-start: 4px; /* 100%; */ /* 1px - findbar справа */
    --v-findbar-container-end: 1px; /* 100% - findbar справа */
    --v-findbar-margin-right: 17px; /* отступ для скроллбара */
    --v-findbar-duration: 150ms; /* длительность анимации */
    --v-findbar-border-radius: 6px; /* радиус скругления findbar */
    --v-findbar-textbox-radius: 3px; /* радиус скругления поля ввода */
    --v-findbar-textbox-width: 14em; /* длина поля ввода */
    --v-findbar-toolbarbutton-border-radius: 3px; /* радиус скругления кнопок */
    --v-findbar-toolbarbutton-inner-padding: 3px; /* влияет на размер кнопок и поля ввода */
    --v-findbar-toolbarbutton-icon-display: -moz-box; /* none - скрыть иконки на кнопках */
    --v-findbar-toolbarbutton-text-display: none; /* -moz-box - показать текст на кнопках */
}
.browserContainer > findbar {
    -moz-box-ordinal-group: 0 !important;
    height: 0 !important;
    min-height: 0 !important;
    max-height: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
    margin-right: var(--v-findbar-margin-right) !important;
    border: none !important;
    display: flex !important;
    flex-direction: var(--v-findbar-flex-direction) !important;
    transition: none !important;
    visibility: visible !important;
    opacity: 1 !important;
    color: var(--toolbar-color, -moz-DialogText) !important;
    box-shadow: none !important;
    overflow: visible !important;
    --toolbarbutton-inner-padding: var(--v-findbar-toolbarbutton-inner-padding);
    --toolbarbutton-border-radius: var(--v-findbar-toolbarbutton-border-radius);
}
.browserContainer > findbar > .findbar-container {
    position: fixed !important;
    display: flex !important;
    align-items: center !important;
    flex-direction: var(--v-findbar-flex-direction) !important;
    inset: auto !important;
    margin: -1px 0 0 0 !important;
    height: auto !important;
    min-width: 0 !important;
    padding: 1px !important;
    padding-inline-start: min(calc(2 * var(--toolbarbutton-inner-padding) + 19px), var(--v-findbar-container-start)) !important;
    padding-inline-end: min(calc(2 * var(--toolbarbutton-inner-padding) + 19px), var(--v-findbar-container-end)) !important;
    overflow: hidden !important;
    border: 1px solid var(--chrome-content-separator-color, rgba(0,0,0,.25)) !important;
    border-top-width: 0 !important;
    box-shadow: none !important;
    z-index: 2 !important;
    border-radius: 0 0 var(--v-findbar-border-radius) var(--v-findbar-border-radius) !important;
    background-color: var(--toolbar-bgcolor, -moz-Dialog) !important;
    background-image: var(--toolbar-bgimage, linear-gradient(rgba(255,255,255,.15), rgba(255,255,255,.15))) !important;
    opacity: 1;
    animation-name: findbar-animation, findbar-animation-opacity !important;
    animation-delay: 0s !important;
    animation-duration: var(--v-findbar-duration) !important;
    animation-timing-function: linear, ease-out !important;
    animation-iteration-count: 1 !important;
    animation-fill-mode: none !important;
}
.browserContainer > findbar > #findbar-close-container,
.browserContainer > findbar > toolbarbutton.findbar-closebutton {
    margin: 1px 3px !important;
    padding: 0 !important;
    border: none !important;
    border-radius: var(--v-findbar-toolbarbutton-border-radius) !important;
    -moz-appearance: none !important;
    appearance: none !important;
    position: fixed !important;
    /* display: flex !important; */  display: none !important;
    z-index: 2 !important;
    height: calc(2 * var(--toolbarbutton-inner-padding) + 16px) !important;
    width: calc(2 * var(--toolbarbutton-inner-padding) + 16px) !important;
    opacity: 1;
    animation-name: findbar-animation, findbar-animation-opacity !important;
    animation-delay: 0s !important;
    animation-duration: var(--v-findbar-duration) !important;
    animation-timing-function: linear, ease-out !important;
    animation-iteration-count: 1 !important;
    animation-fill-mode: none !important;
}
.browserContainer > findbar > #findbar-close-container > toolbarbutton.findbar-closebutton {
    appearance: none !important;
    margin: 0 !important;
    padding: 0 !important;
    height: 100% !important;
    width: 100% !important;
    border: none !important;
    border-radius: var(--v-findbar-toolbarbutton-border-radius) !important;
}
.browserContainer > findbar toolbarbutton.findbar-closebutton > .toolbarbutton-icon {
    margin: 0 !important;
    padding: 0 !important;
    border: none !important;
    height: 16px !important;
    width: 16px !important;
    border-radius: var(--v-findbar-toolbarbutton-border-radius) !important;
}
.browserContainer > findbar[hidden="true"] > .findbar-container,
.browserContainer > findbar[hidden="true"] > #findbar-close-container,
.browserContainer > findbar[hidden="true"] > toolbarbutton.findbar-closebutton {
    transform: translateY(-100%);
    animation-name: findbar-animation-hide, findbar-animation-opacity-hide !important;
    animation-timing-function: linear, ease-in !important;
    pointer-events: none !important;
    opacity: 0;
}
@keyframes findbar-animation {
    from {
        transform: translateY(-100%);
        pointer-events: none;
    }
    to {
        transform: translateY(0%);
        pointer-events: none;
    }
}
@keyframes findbar-animation-opacity {
    from {
        opacity: 0;
    }
    to {
        opacity: 1;
    }
}
@keyframes findbar-animation-hide {
    from {
        transform: translateY(0%);
    }
    to {
        transform: translateY(-100%);
    }
}
@keyframes findbar-animation-opacity-hide {
    from {
        opacity: 1;
    }
    to {
        opacity: 0;
    }
}
.browserContainer > findbar:-moz-lwtheme {
    color: var(--toolbar-color, inherit) !important;
}
.browserContainer > findbar:-moz-lwtheme > .findbar-container {
    background-color: var(--lwt-accent-color, white) !important;
    background-image: linear-gradient(var(--toolbar-bgcolor, rgba(255,255,255,.4)), var(--toolbar-bgcolor, rgba(255,255,255,.4))) !important;
}
.browserContainer > findbar:-moz-lwtheme-brighttext > .findbar-container {
    background-color: var(--lwt-accent-color, black) !important;
}
:root[lwtheme-image] .browserContainer > findbar:-moz-lwtheme > .findbar-container {
    background-repeat: repeat-y !important;
    background-size: auto auto !important;
    background-attachment: fixed !important;
    background-position: right top !important;
    background-image: linear-gradient(var(--toolbar-bgcolor, rgba(255,255,255,.4)), var(--toolbar-bgcolor, rgba(255,255,255,.4))), var(--lwt-header-image, none) !important;
}
.browserContainer > findbar > .findbar-container > :is(checkbox,toolbarbutton) {
    align-self: normal !important;
}
.browserContainer > findbar > .findbar-container > * {
    margin: 1px !important;
    outline: none !important;
}
.browserContainer > findbar > .findbar-container > hbox[anonid="findbar-textbox-wrapper"] {
    display: flex !important;
    flex-direction: row !important;
    align-items: normal !important;
}
.browserContainer > findbar > .findbar-container > description:empty {
    margin: 0 !important;
}
.browserContainer > findbar > .findbar-container > hbox[anonid="findbar-textbox-wrapper"] > toolbarbutton.tabbable,
.browserContainer > findbar > .findbar-container > hbox[anonid="findbar-textbox-wrapper"] > .findbar-textbox {
    padding-block: 0 !important;
    margin-inline: 0 !important;
    min-height: 22px !important;
    box-sizing: border-box !important;
}
.browserContainer > findbar > .findbar-container > hbox[anonid="findbar-textbox-wrapper"] > toolbarbutton.findbar-find-previous {
    margin-inline: 2px !important;
}
.browserContainer > findbar > .findbar-container > hbox[anonid="findbar-textbox-wrapper"] > toolbarbutton.tabbable {
    min-width: calc(2 * var(--toolbarbutton-inner-padding) + 16px) !important;
    border: none !important;
    border-radius: var(--toolbarbutton-border-radius) !important;
    background-color: transparent !important;
    padding-inline: var(--toolbarbutton-inner-padding) !important;
    outline: none !important;
}
.browserContainer > findbar > .findbar-container > hbox[anonid="findbar-textbox-wrapper"] > .findbar-textbox {
    border-radius: var(--v-findbar-textbox-radius) !important;
    min-height: calc(2 * var(--toolbarbutton-inner-padding) + 16px) !important;
    width: var(--v-findbar-textbox-width) !important;
}
.browserContainer > findbar > .findbar-container > hbox[anonid="findbar-textbox-wrapper"] > .findbar-textbox,
.browserContainer > findbar > .findbar-container > description,
.browserContainer > findbar > .findbar-container > label {
    padding-bottom: 1px !important;
}
.browserContainer > findbar > .findbar-container > checkbox > .checkbox-label-box > .checkbox-icon,
.browserContainer > findbar > .findbar-container > hbox[anonid="findbar-textbox-wrapper"] > toolbarbutton.tabbable > .toolbarbutton-text,
.browserContainer > findbar > .findbar-container > .find-status-icon {
    display: none !important;
}
.browserContainer > findbar > .findbar-container > :is(checkbox,toolbarbutton) > :is(.checkbox-label-box,.toolbarbutton-text) {
    display: var(--v-findbar-toolbarbutton-text-display) !important;
    margin-inline: 2px !important;
}
.browserContainer > findbar > .findbar-container > hbox[anonid="findbar-textbox-wrapper"] > toolbarbutton.tabbable > .toolbarbutton-icon,
.browserContainer > findbar > .findbar-container > :is(checkbox,toolbarbutton) > :is(.checkbox-check,.toolbarbutton-icon) {
    margin: 0 !important;
    padding: 0 !important;
    border: none !important;
    height: 16px !important;
    width: 16px !important;
}
.browserContainer > findbar > .findbar-container > :is(checkbox,toolbarbutton) > :is(.checkbox-check,.toolbarbutton-icon) {
    display: var(--v-findbar-toolbarbutton-icon-display) !important;
    appearance: none !important;
    background: none !important;
    color: inherit !important;
    filter: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='0'><filter id='fill'><feComposite in='FillPaint' in2='SourceGraphic' operator='in'/></filter></svg>#fill");
    fill: currentColor;
}
.browserContainer > findbar > .findbar-container > :is(checkbox,toolbarbutton) {
    appearance: none !important;
    padding: var(--toolbarbutton-inner-padding) !important;
    border-radius: var(--toolbarbutton-border-radius) !important;
}
.browserContainer > findbar > .findbar-container > hbox[anonid="findbar-textbox-wrapper"] > toolbarbutton.tabbable:not([disabled="true"]):hover,
.browserContainer > findbar > .findbar-container > :is(checkbox,toolbarbutton):not([disabled="true"]):hover {
    background-color: var(--toolbarbutton-hover-background, color-mix(in srgb, currentColor 17%, transparent)) !important;
}
.browserContainer > findbar > .findbar-container > hbox[anonid="findbar-textbox-wrapper"] > toolbarbutton.tabbable:not([disabled="true"]):is([checked="true"],:hover:active),
.browserContainer > findbar > .findbar-container > :is(checkbox,toolbarbutton):not([disabled="true"]):is([checked="true"],:hover:active) {
    background-color: var(--toolbarbutton-active-background, color-mix(in srgb, currentColor 30%, transparent)) !important;
}
.browserContainer > findbar > .findbar-container > :is(checkbox,toolbarbutton).findbar-highlight {
    list-style-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16'><path style='fill:rgb(142, 142, 152);' d='M 2,3 V 4.2 H 6 V 12 h 1.2 l 0,-7.8 h 4 L 11.2,3 Z M 12.5,6 C 11.8,8.39 10,10.3 10,11.6 10,12.9 11.1,14 12.5,14 13.9,14 15,12.9 15,11.6 15,10.3 13.2,8.39 12.5,6 Z m 0,6.8 c -1,0 -1.3,-0.8 -1.3,-1.2 0,-1.1 0.8,-2.1 1.3,-3 0.5,0.9 1.3,1.9 1.3,3 0,0.4 -0.3,1.2 -1.3,1.2 z' /></svg>") !important;
}
.browserContainer > findbar > .findbar-container > :is(checkbox,toolbarbutton).findbar-case-sensitive {
    list-style-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16'><path style='fill:rgb(142, 142, 152);' d='m 6,3 -5,9 h 1.2 l 1.1,-2 h 2.5 v 2 H 7 V 3 Z M 5.8,5.5 5.8,9 H 3.9 Z M 13,6 V 6.77 C 12.5,6.28 11.7,6 11,6 9.34,6 8,7.34 8,9 c 0,1.7 1.34,3 3,3 0.7,0 1.5,-0.3 2,-0.8 V 12 h 1 V 6 Z m -2,1 c 1.1,0 2,0.9 2,2 0,1.1 -0.9,2 -2,2 C 9.9,11 9,10.1 9,9 9,7.9 9.9,7 11,7 Z' /></svg>") !important;
}
.browserContainer > findbar > .findbar-container > :is(checkbox,toolbarbutton).findbar-match-diacritics {
    list-style-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16'><path style='fill:rgb(142, 142, 152);' d='M 5,3 3,0 H 0 M 12,5 10,2 H 7 M 6,3 1,12 h 1.2 l 1.1,-2 h 2.5 v 2 H 7 V 3 M 5.8,5.5 V 9 H 3.9 Z M 13,6 V 6.77 C 12.5,6.28 11.7,6 11,6 9.34,6 8,7.34 8,9 c 0,1.7 1.34,3 3,3 0.7,0 1.5,-0.3 2,-0.8 V 12 h 1 V 6 Z m -2,1 c 1.1,0 2,0.9 2,2 0,1.1 -0.9,2 -2,2 C 9.9,11 9,10.1 9,9 9,7.9 9.9,7 11,7 Z'/></svg>") !important;
}
.browserContainer > findbar > .findbar-container > :is(checkbox,toolbarbutton).findbar-entire-word {
    list-style-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16'><path style='fill:rgb(142, 142, 152);' d='M 15,13.8 V 15 H 1 V 13.8 M 15,2.2 15,1 H 1 V 2.2 M 6,3 1,12 h 1.2 l 1.1,-2 h 2.5 v 2 H 7 V 3 M 5.8,5.5 V 9 H 3.9 Z M 13,6 V 6.77 C 12.5,6.28 11.7,6 11,6 9.34,6 8,7.34 8,9 c 0,1.7 1.34,3 3,3 0.7,0 1.5,-0.3 2,-0.8 V 12 h 1 V 6 Z m -2,1 c 1.1,0 2,0.9 2,2 0,1.1 -0.9,2 -2,2 C 9.9,11 9,10.1 9,9 9,7.9 9.9,7 11,7 Z' /></svg>") !important;
}
}

Добавлено 09-05-2023 12:30:33

unter_officer пишет

Пожалуйста.
Только мой вариант не совсем мой. Он от автора UCF.

Да, где ты его нашёл?

Отредактировано voqabuhe (09-05-2023 12:30:33)

Отсутствует

 

№81909-05-2023 12:35:48

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 599
UA: Firefox 113.0

Re: UCF - ваши кнопки, скрипты…

voqabuhe пишет

Да, где ты его нашёл?

Здесь, через личку.
И хочу ещё раз, уже публично, поблагодарить Виталия за помощь!


«The Truth Is Out There»

Отсутствует

 

№82009-05-2023 12:54:41

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 113.0

Re: UCF - ваши кнопки, скрипты…

unter_officer
Ну вот попробовал вариант от Виталия. С ним у меня вертикальная панель стала по высоте  короче примерно на  2/3, как бы поднялась вся вверх.

скрытый текст
e0575b472a543034e46a87d132538dea.png

Отсутствует

 

№82109-05-2023 12:59:47

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 599
UA: Firefox 113.0

Re: UCF - ваши кнопки, скрипты…

voqabuhe
Может где-то ошиблись, когда производили замену?
У меня с первого раза все завелось и прекрасно работает.


«The Truth Is Out There»

Отсутствует

 

№82209-05-2023 13:05:30

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 113.0

Re: UCF - ваши кнопки, скрипты…

unter_officer
А как там ошибёшься, скопировал - нашёл, скопировал - заменил. У вас были кнопки внизу панели? У меня четыре последние кнопки на скрине были в самом низу, а теперь поднялись вверх. С вариантом от Dumby всё нормально. Ну попробую ещё раз, позже перепроверить.

Отсутствует

 

№82309-05-2023 13:11:57

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 599
UA: Firefox 113.0

Re: UCF - ваши кнопки, скрипты…

Untitled-3.png


Мой vertical_top_bottom_bar.css:

скрытый текст

Выделить код

Код:

toolbarpaletteitem[place="palette"] > toolbaritem.ucf-additional-springs {
    background: white url("./svg/spring.svg") center no-repeat;
    border: none;
    outline: 1px solid currentColor;
    outline-offset: -1px;
    min-height: 37px;
    opacity: 0.3;
}
toolbarpaletteitem[place="toolbar"] > toolbaritem.ucf-additional-springs,
toolbarpaletteitem[place="panel"] > toolbaritem.ucf-additional-springs,
toolbarpaletteitem[place="menu-panel"] > toolbaritem.ucf-additional-springs {
    background: white url("./svg/spring.svg") center no-repeat;
    border: none;
    min-width: 34px;
    min-height: 14px;
    outline: 1px solid currentColor;
    outline-offset: -1px;
    margin-block: 2px !important;
    margin-inline: 1px !important;
    opacity: 0.3;
}
toolbarpaletteitem[place="palette"][id*="ucf-additional-top-spring"],
toolbarpaletteitem[place="palette"][id*="ucf-additional-vertical-spring"],
toolbarpaletteitem[place="palette"][id*="ucf-additional-bottom-spring"] {
    vertical-align: top;
}
toolbarpaletteitem[place] > toolbaritem.ucf-additional-springs {
    -moz-window-dragging: no-drag !important;
}
#ucf-restart-app {
    list-style-image: url("./svg/restart-app-16.svg") !important;
    fill: #f38725 !important;
}
#ucf-additional-vertical-toggle-button {
    list-style-image: url("./svg/vert-toolbar.svg") !important;
}
#ucf-additional-top-toggle-button {
    list-style-image: url("./svg/top-toolbar.svg") !important;
}
#ucf-additional-bottom-toggle-button {
    list-style-image: url("./svg/bottom-toolbar.svg") !important;
}
#ucf-view-history-sidebar-button {
    list-style-image: url("./svg/history-16.svg") !important;
}
#ucf-view-bookmarks-sidebar-button {
    list-style-image: url("./svg/bookmark-16.svg") !important;
}
#ucf-open-directories-button {
    list-style-image: url("./svg/user-home-16.svg") !important;
}
#browser-bottombox:not([lwthemefooter="true"]):-moz-lwtheme {
    background-color: transparent !important;
}
#ucf-additional-vertical-box {
    background: none !important;
    border: none !important;
    box-shadow: none !important;
    position: relative !important;
    z-index: 3 !important;
    margin: -1px 0 !important;
}
#ucf-additional-top-bar,
#ucf-additional-vertical-bar,
#ucf-additional-bottom-bar {
    -moz-appearance: none !important;
    appearance: none !important;
    padding: 0 !important;
    border-block: none !important;
    overflow: -moz-hidden-unscrollable;
    overflow: clip;
}
#ucf-additional-bottom-bar {
    border-top: 1px solid var(--chrome-content-separator-color, var(--toolbox-border-bottom-color, rgba(0,0,0,0.1))) !important;
}
#ucf-additional-bottom-bar #ucf-additional-bottom-closebutton {
    margin: 0 var(--toolbarbutton-outer-padding, 1px) !important;
    padding: var(--toolbarbutton-inner-padding, 4px) !important;
}
#ucf-additional-bottom-bar #ucf-additional-bottom-closebutton .toolbarbutton-icon {
    margin: 0 !important;
    padding: 0 !important;
    height: 16px !important;
    width: 16px !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar,
#ucf-additional-bottom-bar {
    -moz-window-dragging: no-drag !important;
    background-clip: border-box !important;
    background-origin: border-box !important;
    background-color: var(--toolbar-bgcolor, -moz-Dialog) !important;
    background-image: var(--toolbar-bgimage, linear-gradient(rgba(255,255,255,.15), rgba(255,255,255,.15))) !important;
    color: var(--toolbar-color, -moz-DialogText) !important;
    border-inline: none !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar {
    padding: 1px 0 !important;
    margin: 0 !important;
    font-size: 1rem !important;
    min-width: 20px !important;
    width: auto !important;
    flex-grow: 1 !important;
    align-items: stretch !important;
    justify-content: start !important;
    flex-direction: column !important;
}
:root:-moz-lwtheme[style*="--lwt-additional-images"] #navigator-toolbox {
    background-attachment: fixed !important;
}
#ucf-additional-vertical-box:-moz-lwtheme > #ucf-additional-vertical-bar,
#ucf-additional-bottom-bar:-moz-lwtheme {
    color: var(--toolbar-color, inherit) !important;
    background-repeat: no-repeat, var(--lwt-background-tiling, repeat-y) !important;
    background-size: auto auto !important;
    background-attachment: fixed !important;
    background-position: right top, var(--lwt-background-alignment, right top) !important;
    background-color: transparent !important;
    background-image: linear-gradient(var(--toolbar-bgcolor, rgba(255,255,255,.4)), var(--toolbar-bgcolor, rgba(255,255,255,.4))), var(--lwt-header-image, var(--lwt-additional-images, none)) !important;
}
:root[lwtheme-image="true"] #ucf-additional-vertical-box:-moz-lwtheme > #ucf-additional-vertical-bar,
:root[lwtheme-image="true"] #ucf-additional-bottom-bar:-moz-lwtheme {
    background-repeat: no-repeat, repeat-y !important;
}
:root #browser-bottombox[lwthemefooter="true"] #ucf-additional-bottom-bar:-moz-lwtheme {
    background-repeat: initial !important;
    background-attachment: initial !important;
    background-position: initial !important;
    background-color: var(--toolbar-bgcolor, rgba(255,255,255,.4)) !important;
    background-image: none !important;
}
#ucf-additional-vertical-box[vertautohide="true"]:-moz-lwtheme > #ucf-additional-vertical-bar {
    background-color: var(--lwt-accent-color, white) !important;
}
#ucf-additional-vertical-box[vertautohide="true"]:-moz-lwtheme-brighttext > #ucf-additional-vertical-bar {
    background-color: var(--lwt-accent-color, black) !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar:not([collapsed="true"]) {
    border-inline-end: 1px solid var(--chrome-content-separator-color, var(--toolbox-border-bottom-color, rgba(0,0,0,0.1))) !important;
}
#ucf-additional-vertical-box[v_vertical_bar_start="false"] > #ucf-additional-vertical-bar:not([collapsed="true"]) {
    border-inline-end: none !important;
    border-inline-start: 1px solid var(--chrome-content-separator-color, var(--toolbox-border-bottom-color, rgba(0,0,0,0.1))) !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar[collapsed="true"] {
    padding: 0 !important;
    border: none !important;
    min-width: 0 !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar > toolbaritem.toolbaritem-combined-buttons {
    flex-direction: column !important;
    margin-inline: 0 !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar > toolbaritem.toolbaritem-combined-buttons > toolbarbutton.toolbarbutton-combined > .toolbarbutton-text {
    padding-inline: 1px !important;
    margin-inline: 0 !important;
    min-width: 0 !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar > toolbaritem.toolbaritem-combined-buttons separator {
    display: none !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar > toolbarspring {
	min-width: 0 !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar > toolbarseparator {
    -moz-appearance: none !important;
    appearance: none !important;
    padding: 0 !important;
    margin: 2px !important;
    margin-top: 4px !important;
    margin-bottom: 0 !important;
    border: none !important;
    border-top: 1px solid currentColor !important;
    width: auto !important;
    max-width: none !important;
    height: 5px !important;
    min-height: 5px !important;
    max-height: 5px !important;
    opacity: 0.3 !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar > toolbarspacer {
	height: 15px !important;
}
#ucf-additional-vertical-container {
    display: flex !important;
}
#ucf-additional-vertical-container[vertautohide="true"] {
    position: relative !important;
    min-width: 100px !important;
    width: 100px !important;
    max-width: 100px !important;
    overflow: visible !important;
    margin-inline-start: 0 !important;
    margin-inline-end: -100px !important;
    pointer-events: none !important;
    visibility: hidden !important;
}
#ucf-additional-vertical-container[vertautohide="true"][v_vertical_bar_start="false"] {
    margin-inline-start: -100px !important;
    margin-inline-end: 0 !important;
}
#ucf-additional-vertical-box[vertautohide="true"] {
    position: absolute !important;
    display: block !important;
    top: 0 !important;
    bottom: 0 !important;
    left: 0 !important;
    right: auto !important;
    font-size: 0px !important;
}
#ucf-additional-vertical-box[vertautohide="true"][v_vertical_bar_start="false"],
#ucf-additional-vertical-box[vertautohide="true"]:-moz-locale-dir(rtl) {
    left: auto !important;
    right: 0 !important;
}
#ucf-additional-vertical-box[vertautohide="true"][v_vertical_bar_start="false"]:-moz-locale-dir(rtl) {
    left: 0 !important;
    right: auto !important;
}
#ucf-additional-vertical-box[vertautohide="true"] > #ucf-additional-vertical-bar:not([collapsed="true"]) {
    left: calc(-1 * (100% - 5px));
    right: auto;
    opacity: 0;
    animation-name: toolbar-hide !important;
    animation-timing-function: linear !important;
    animation-duration: 0.2s !important;
    animation-iteration-count: 1 !important;
    animation-delay: 0s !important;
    transition-property: opacity !important;
    transition-timing-function: step-start !important;
    transition-duration: 0s !important;
    transition-delay: 0.2s !important;
    pointer-events: auto !important;
    height: 100% !important;
    visibility: visible !important;
    position: relative !important;
}
#ucf-additional-vertical-box[vertautohide="true"]:-moz-locale-dir(rtl) > #ucf-additional-vertical-bar:not([collapsed="true"]),
#ucf-additional-vertical-box[vertautohide="true"][v_vertical_bar_start="false"] > #ucf-additional-vertical-bar:not([collapsed="true"]) {
    left: auto;
    right: calc(-1 * (100% - 5px));
    animation-name: toolbar-hide-rtl !important;
}
#ucf-additional-vertical-box[vertautohide="true"][v_vertical_bar_start="false"]:-moz-locale-dir(rtl) > #ucf-additional-vertical-bar:not([collapsed="true"]) {
    left: calc(-1 * (100% - 5px));
    right: auto;
    animation-name: toolbar-hide !important;
}
#ucf-additional-vertical-container > #ucf-additional-vertical-box[vertautohide="true"][v_vertical_bar_visible] > #ucf-additional-vertical-bar:not([collapsed="true"]) {
    left: 0px;
    right: auto;
    opacity: 1;
    animation-name: toolbar-visible !important;
    transition-delay: 0s !important;
}
#ucf-additional-vertical-container > #ucf-additional-vertical-box[vertautohide="true"]:-moz-locale-dir(rtl)[v_vertical_bar_visible] > #ucf-additional-vertical-bar:not([collapsed="true"]),
#ucf-additional-vertical-container > #ucf-additional-vertical-box[vertautohide="true"][v_vertical_bar_start="false"][v_vertical_bar_visible] > #ucf-additional-vertical-bar:not([collapsed="true"]) {
    left: auto;
    right: 0px;
    animation-name: toolbar-visible-rtl !important;
}
#ucf-additional-vertical-container > #ucf-additional-vertical-box[vertautohide="true"][v_vertical_bar_start="false"]:-moz-locale-dir(rtl)[v_vertical_bar_visible] > #ucf-additional-vertical-bar:not([collapsed="true"]) {
    left: 0px;
    right: auto;
    animation-name: toolbar-visible !important;
}
@keyframes toolbar-hide {
    from {
        left: 0px;
    }
    to {
        left: calc(-1 * (100% - 5px));
    }
}
@keyframes toolbar-hide-rtl {
    from {
        right: 0px;
    }
    to {
        right: calc(-1 * (100% - 5px));
    }
}
@keyframes toolbar-visible {
    from {
        left: calc(-1 * (100% - 5px));
    }
    to {
        left: 0px;
    }
}
@keyframes toolbar-visible-rtl {
    from {
        right: calc(-1 * (100% - 5px));
    }
    to {
        right: 0px;
    }
}
:root[inDOMFullscreen] #ucf-additional-vertical-box > #ucf-additional-vertical-bar:not([collapsed="true"]),
:root[inFullscreen]:not([OSXLionFullscreen]) #ucf-additional-vertical-box > #ucf-additional-vertical-bar:not([collapsed="true"]):not([fullscreentoolbar="true"]),
#ucf-additional-bottom-bar[collapsed="true"][customizable="true"][customizing="true"] {
    visibility: collapse !important;
    padding: 0 !important;
    border: none !important;
    min-width: 0 !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar > #personal-bookmarks {
    width: 0 !important;
    flex-grow: 0 !important;
    margin: 0 !important;
}
#ucf-additional-vertical-box > #ucf-additional-vertical-bar > #search-container {
    width: 0 !important;
    max-height: 0 !important;
    overflow-y: visible !important;
    flex-grow: 0 !important;
    min-width: 80px !important;
    margin: 0 !important;
}
:root[chromehidden~="location"][chromehidden~="toolbar"] #ucf-additional-vertical-container {
    display: none !important;
}
@supports (fill: color-mix(in srgb, currentColor 20%, transparent)) {
    #ucf-restart-app {
        fill: color-mix(in srgb, currentColor 20%, #f38725) !important;
    }
}

Отредактировано unter_officer (09-05-2023 13:14:10)


«The Truth Is Out There»

Отсутствует

 

№82409-05-2023 13:16:43

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

voqabuhe пишет

Findbar вниз уехал

Рядом с (или вместо) -moz-box-ordinal-group: 0 !important;


order: -1 !important;

Отсутствует

 

№82509-05-2023 13:22:54

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 113.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Рядом с (или вместо) -moz-box-ordinal-group: 0 !important;

order: -1 !important;

Вот спасибо большое. Теперь всё на месте.

Добавлено 09-05-2023 13:29:38

unter_officer пишет

Мой vertical_top_bottom_bar.css:

Спасибо, с вашим действительно всё нормально. Таки значит я где-то ошибся. :dumb: Теперь два рабочих варианта.

Отредактировано voqabuhe (09-05-2023 13:29:38)

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]