class MyCounter extends HTMLElement { constructor() { super(); this.count = 0; const style = ` * { font-size: 200%; } span { width: 4rem; display: inline-block; text-align: center; } button { width: 64px; height: 64px; border: none; border-radius: 10px; background-color: seagreen; color: white; } `; const html = ` ${this.count} `; this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = ` ${html} `; this.buttonInc = this.shadowRoot.getElementById('inc'); this.buttonDec = this.shadowRoot.getElementById('dec'); this.spanValue = this.shadowRoot.querySelector('span'); this.inc = this.inc.bind(this); this.dec = this.dec.bind(this); } inc() { this.count++; this.update(); } dec() { this.count--; this.update(); } update() { this.spanValue.innerText = this.count; } connectedCallback() { this.buttonInc.addEventListener('click', this.inc); this.buttonDec.addEventListener('click', this.dec); } disconnectedCallback() { this.buttonInc.removeEventListener('click', this.inc); this.buttonDec.removeEventListener('click', this.dec); } } customElements.define('my-counter', MyCounter);