const smButton = document.createElement('template') smButton.innerHTML = ` `; customElements.define('sm-button', class extends HTMLElement { constructor() { super() this.attachShadow({ mode: 'open' }).append(smButton.content.cloneNode(true)) } get disabled() { return this.isDisabled } set disabled(value) { if (value && !this.isDisabled) { this.isDisabled = true this.setAttribute('disabled', '') this.button.removeAttribute('tabindex') } else if (!value && this.isDisabled) { this.isDisabled = false this.removeAttribute('disabled') } } dispatch() { if (this.isDisabled) { this.dispatchEvent(new CustomEvent('disabled', { bubbles: true, composed: true })) } else { this.dispatchEvent(new CustomEvent('clicked', { bubbles: true, composed: true })) } } connectedCallback() { this.isDisabled = false this.button = this.shadowRoot.querySelector('.button') if (this.hasAttribute('disabled') && !this.isDisabled) this.isDisabled = true this.addEventListener('click', (e) => { this.dispatch() }) } })