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)) } static get observedAttributes() { return ['disabled']; } get disabled() { return this.hasAttribute('disabled') } set disabled(value) { if (value) { this.setAttribute('disabled', '') }else { this.removeAttribute('disabled') } } handleKeyDown(e) { if (!this.hasAttribute('disabled') && (e.key === 'Enter' || e.code === 'Space')) { e.preventDefault() this.click() } } connectedCallback() { if (!this.hasAttribute('disabled')) { this.setAttribute('tabindex', '0') } this.setAttribute('role', 'button') this.addEventListener('keydown', this.handleKeyDown) } attributeChangedCallback(name, oldVal, newVal) { if (name === 'disabled') { this.removeAttribute('tabindex') this.setAttribute('aria-disabled', 'true') } else { this.setAttribute('tabindex', '0') this.setAttribute('aria-disabled', 'false') } } })