/* 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 htp://mozilla.org/MPL/2.0/. */ import { html, ifDefined } from "../vendor/lit.all.mjs"; import { MozLitElement } from "../lit-utils.mjs"; // eslint-disable-next-line import/no-unassigned-import import "chrome://global/content/elements/moz-label.mjs"; /** * A simple toggle element that can be used to switch between two states. * * @tagname moz-toggle * @property {boolean} pressed - Whether or not the element is pressed. * @property {boolean} disabled - Whether or not the element is disabled. * @property {string} label - The label text. * @property {string} description - The description text. * @property {string} ariaLabel * The aria-label text for cases where there is no visible label. * @slot support-link - Used to append a moz-support-link to the description. * @fires toggle * Custom event indicating that the toggle's pressed state has changed. */ export default class MozToggle extends MozLitElement { static shadowRootOptions = { ...MozLitElement.shadowRootOptions, delegatesFocus: true, }; static properties = { pressed: { type: Boolean, reflect: true }, disabled: { type: Boolean, reflect: true }, label: { type: String }, description: { type: String }, ariaLabel: { type: String, attribute: "aria-label" }, accessKey: { type: String, attribute: "accesskey" }, }; static get queries() { return { buttonEl: "#moz-toggle-button", labelEl: "#moz-toggle-label", descriptionEl: "#moz-toggle-description", }; } constructor() { super(); this.pressed = false; this.disabled = false; } handleClick() { this.pressed = !this.pressed; this.dispatchOnUpdateComplete( new CustomEvent("toggle", { bubbles: true, composed: true, }) ); } // Delegate clicks on the host to the input element click() { this.buttonEl.click(); } descriptionTemplate() { if (this.description) { return html`

${this.description} ${this.supportLinkTemplate()}

`; } return ""; } supportLinkTemplate() { return html` `; } buttonTemplate() { const { pressed, disabled, description, ariaLabel, handleClick } = this; return html` `; } render() { return html` ${this.label ? html` ` : this.buttonTemplate()} ${this.descriptionTemplate()} `; } } customElements.define("moz-toggle", MozToggle);