<html>
  <head></head>
  <body></body>
  <script>
    class MyWelcome extends HTMLElement {
      constructor() {
        super();
        this.attachShadow({ mode: "open" });
        this.shadowRoot.innerHTML = `
                <h1>Welcome <span id="username">Developer</span></h1>
                <div><input id="usernameField"></div><br/>
                <div><button id="changeUsername">Change username</button></div>
        `;

        this.userName = this.shadowRoot.querySelector('#username');
        this.input = this.shadowRoot.querySelector('#usernameField');
        this.submitButton = this.shadowRoot.querySelector('#changeUsername');

        this.init();
      }

      init() {
          this.submitButton.addEventListener('click', () => {
            this.userName.innerText = this.input.value;
            this.emitExternalEvent('username-changed', this.input.value);
          });
      }

      emitExternalEvent(eventName, payload) {
          const customEvent = new CustomEvent(eventName, {detail: payload});
          this.dispatchEvent(customEvent);
      }
    }

    customElements.define('my-welcome', MyWelcome);
    const myWelcomeComponent = document.createElement('my-welcome');
    document.body.appendChild(myWelcomeComponent);
    myWelcomeComponent.addEventListener('username-changed', (event) => {
        console.log(event.detail);
    });
  </script>
</html>