/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; // This is loaded into chrome windows with the subscript loader. Wrap in // a block to prevent accidentally leaking globals onto `window`. { class MozTabbrowserTabGroupMenu extends MozXULElement { static COLORS = [ "blue", "purple", "cyan", "orange", "yellow", "pink", "green", "gray", "red", ]; static markup = ` `; #activeGroup; #cancelButton; #createButton; #nameField; #panel; #swatches; #swatchesContainer; constructor() { super(); } connectedCallback() { if (this._initialized) { return; } this.textContent = ""; this.appendChild(this.constructor.fragment); this.initializeAttributeInheritance(); this._initialized = true; this.#cancelButton = this.querySelector( "#tab-group-editor-button-cancel" ); this.#createButton = this.querySelector( "#tab-group-editor-button-create" ); this.#panel = this.querySelector("panel"); this.#nameField = this.querySelector("#tab-group-name"); this.#swatchesContainer = this.querySelector( ".tab-group-editor-swatches" ); this.#populateSwatches(); this.#cancelButton.addEventListener("click", () => { this.#handleCancel(); }); this.#createButton.addEventListener("click", () => { this.#handleCreate(); }); this.#nameField.addEventListener("input", () => { if (this.activeGroup) { this.activeGroup.label = this.#nameField.value; } }); this.addEventListener("change", this); } #populateSwatches() { this.#clearSwatches(); for (let colorCode of MozTabbrowserTabGroupMenu.COLORS) { let input = document.createElement("input"); input.id = `tab-group-editor-swatch-${colorCode}`; input.type = "radio"; input.name = "tab-group-color"; input.value = colorCode; input.title = colorCode; let label = document.createElement("label"); label.classList.add("tab-group-editor-swatch"); label.htmlFor = input.id; label.style.setProperty( "--tabgroup-swatch-color", `var(--tab-group-color-${colorCode})` ); label.style.setProperty( "--tabgroup-swatch-color-invert", `var(--tab-group-color-${colorCode}-invert)` ); this.#swatchesContainer.append(input, label); this.#swatches.push(input); } } #clearSwatches() { this.#swatchesContainer.innerHTML = ""; this.#swatches = []; } get activeGroup() { return this.#activeGroup; } set activeGroup(group = null) { this.#activeGroup = group; this.#nameField.value = group ? group.label : ""; this.#swatches.forEach(node => { if (group && node.value == group.color) { node.checked = true; } else { node.checked = false; } }); } get panel() { return this.children[0]; } openCreateModal(group) { this.activeGroup = group; this.#panel.openPopup(group.firstChild, { position: "bottomleft topleft", }); } /** * change handler for color input */ on_change(aEvent) { if (aEvent.target.name != "tab-group-color") { return; } if (this.activeGroup) { this.activeGroup.color = aEvent.target.value; } } #handleCancel() { this.activeGroup.ungroupTabs(); this.#panel.hidePopup(); } #handleCreate() { this.#panel.hidePopup(); this.activeGroup = null; } } customElements.define("tabgroup-menu", MozTabbrowserTabGroupMenu); }