text: import {END} from '../shared/symbols.js';
  import {booleanAttribute, stringAttribute} from '../shared/attributes.js';
  
  import {Event} from '../interface/event.js';
  import {Element} from '../interface/element.js';
  import {Classes, customElements} from '../interface/custom-element-registry.js';
  
  const Level0 = new WeakMap;
  const level0 = {
    get(element, name) {
      return Level0.has(element) && Level0.get(element)[name] || null;
    },
    set(element, name, value) {
      if (!Level0.has(element))
        Level0.set(element, {});
      const handlers = Level0.get(element);
      const type = name.slice(2);
      if (handlers[name])
        element.removeEventListener(type, handlers[name], false);
      if ((handlers[name] = value))
        element.addEventListener(type, value, false);
    }
  };
  
  /**
   * @implements globalThis.HTMLElement
   */
  export class HTMLElement extends Element {
  
    static get observedAttributes() { return []; }
  
    constructor(ownerDocument = null, localName = '') {
      super(ownerDocument, localName);
      if (!ownerDocument) {
        const {constructor: Class, [END]: end} = this;
        if (!Classes.has(Class))
          throw new Error('unable to initialize this Custom Element');
        const {ownerDocument, localName, options} = Classes.get(Class);
        this.ownerDocument = end.ownerDocument = ownerDocument;
        this.localName = localName;
        customElements.set(this, {connected: false});
        if (options.is)
          this.setAttribute('is', options.is);
      }
    }
  
    /* c8 ignore start */
  
    /* TODO: what about these?
    offsetHeight
    offsetLeft
    offsetParent
    offsetTop
    offsetWidth
    */
  
    blur() { this.dispatchEvent(new Event('blur')); }
    click() { this.dispatchEvent(new Event('click')); }
  
    // Boolean getters
    get accessKeyLabel() {
      const {accessKey} = this;
      return accessKey && `Alt+Shift+${accessKey}`;
    }
    get isContentEditable() { return this.hasAttribute('contenteditable'); }
  
    // Boolean Accessors
    get contentEditable() { return booleanAttribute.get(this, 'contenteditable'); }
    set contentEditable(value) { booleanAttribute.set(this, 'contenteditable', value); }
    get draggable() { return booleanAttribute.get(this, 'draggable'); }
    set draggable(value) { booleanAttribute.set(this, 'draggable', value); }
    get hidden() { return booleanAttribute.get(this, 'hidden'); }
    set hidden(value) { booleanAttribute.set(this, 'hidden', value); }
    get spellcheck() { return booleanAttribute.get(this, 'spellcheck'); }
    set spellcheck(value) { booleanAttribute.set(this, 'spellcheck', value); }
  
    // String Accessors
    get accessKey() { return stringAttribute.get(this, 'accesskey'); }
    set accessKey(value) { stringAttribute.set(this, 'accesskey', value); }
    get dir() { return stringAttribute.get(this, 'dir'); }
    set dir(value) { stringAttribute.set(this, 'dir', value); }
    get lang() { return stringAttribute.get(this, 'lang'); }
    set lang(value) { stringAttribute.set(this, 'lang', value); }
    get title() { return stringAttribute.get(this, 'title'); }
    set title(value) { stringAttribute.set(this, 'title', value); }
  
    // DOM Level 0
    get onabort() { return level0.get(this, 'onabort'); }
    set onabort(value) { level0.set(this, 'onabort', value); }
  
    get onblur() { return level0.get(this, 'onblur'); }
    set onblur(value) { level0.set(this, 'onblur', value); }
  
    get oncancel() { return level0.get(this, 'oncancel'); }
    set oncancel(value) { level0.set(this, 'oncancel', value); }
  
    get oncanplay() { return level0.get(this, 'oncanplay'); }
    set oncanplay(value) { level0.set(this, 'oncanplay', value); }
  
    get oncanplaythrough() { return level0.get(this, 'oncanplaythrough'); }
    set oncanplaythrough(value) { level0.set(this, 'oncanplaythrough', value); }
  
    get onchange() { return level0.get(this, 'onchange'); }
    set onchange(value) { level0.set(this, 'onchange', value); }
  
    get onclick() { return level0.get(this, 'onclick'); }
    set onclick(value) { level0.set(this, 'onclick', value); }
  
    get onclose() { return level0.get(this, 'onclose'); }
    set onclose(value) { level0.set(this, 'onclose', value); }
  
    get oncontextmenu() { return level0.get(this, 'oncontextmenu'); }
    set oncontextmenu(value) { level0.set(this, 'oncontextmenu', value); }
  
    get oncuechange() { return level0.get(this, 'oncuechange'); }
    set oncuechange(value) { level0.set(this, 'oncuechange', value); }
  
    get ondblclick() { return level0.get(this, 'ondblclick'); }
    set ondblclick(value) { level0.set(this, 'ondblclick', value); }
  
    get ondrag() { return level0.get(this, 'ondrag'); }
    set ondrag(value) { level0.set(this, 'ondrag', value); }
  
    get ondragend() { return level0.get(this, 'ondragend'); }
    set ondragend(value) { level0.set(this, 'ondragend', value); }
  
    get ondragenter() { return level0.get(this, 'ondragenter'); }
    set ondragenter(value) { level0.set(this, 'ondragenter', value); }
  
    get ondragleave() { return level0.get(this, 'ondragleave'); }
    set ondragleave(value) { level0.set(this, 'ondragleave', value); }
  
    get ondragover() { return level0.get(this, 'ondragover'); }
    set ondragover(value) { level0.set(this, 'ondragover', value); }
  
    get ondragstart() { return level0.get(this, 'ondragstart'); }
    set ondragstart(value) { level0.set(this, 'ondragstart', value); }
  
    get ondrop() { return level0.get(this, 'ondrop'); }
    set ondrop(value) { level0.set(this, 'ondrop', value); }
  
    get ondurationchange() { return level0.get(this, 'ondurationchange'); }
    set ondurationchange(value) { level0.set(this, 'ondurationchange', value); }
  
    get onemptied() { return level0.get(this, 'onemptied'); }
    set onemptied(value) { level0.set(this, 'onemptied', value); }
  
    get onended() { return level0.get(this, 'onended'); }
    set onended(value) { level0.set(this, 'onended', value); }
  
    get onerror() { return level0.get(this, 'onerror'); }
    set onerror(value) { level0.set(this, 'onerror', value); }
  
    get onfocus() { return level0.get(this, 'onfocus'); }
    set onfocus(value) { level0.set(this, 'onfocus', value); }
  
    get oninput() { return level0.get(this, 'oninput'); }
    set oninput(value) { level0.set(this, 'oninput', value); }
  
    get oninvalid() { return level0.get(this, 'oninvalid'); }
    set oninvalid(value) { level0.set(this, 'oninvalid', value); }
  
    get onkeydown() { return level0.get(this, 'onkeydown'); }
    set onkeydown(value) { level0.set(this, 'onkeydown', value); }
  
    get onkeypress() { return level0.get(this, 'onkeypress'); }
    set onkeypress(value) { level0.set(this, 'onkeypress', value); }
  
    get onkeyup() { return level0.get(this, 'onkeyup'); }
    set onkeyup(value) { level0.set(this, 'onkeyup', value); }
  
    get onload() { return level0.get(this, 'onload'); }
    set onload(value) { level0.set(this, 'onload', value); }
  
    get onloadeddata() { return level0.get(this, 'onloadeddata'); }
    set onloadeddata(value) { level0.set(this, 'onloadeddata', value); }
  
    get onloadedmetadata() { return level0.get(this, 'onloadedmetadata'); }
    set onloadedmetadata(value) { level0.set(this, 'onloadedmetadata', value); }
  
    get onloadstart() { return level0.get(this, 'onloadstart'); }
    set onloadstart(value) { level0.set(this, 'onloadstart', value); }
  
    get onmousedown() { return level0.get(this, 'onmousedown'); }
    set onmousedown(value) { level0.set(this, 'onmousedown', value); }
  
    get onmouseenter() { return level0.get(this, 'onmouseenter'); }
    set onmouseenter(value) { level0.set(this, 'onmouseenter', value); }
  
    get onmouseleave() { return level0.get(this, 'onmouseleave'); }
    set onmouseleave(value) { level0.set(this, 'onmouseleave', value); }
  
    get onmousemove() { return level0.get(this, 'onmousemove'); }
    set onmousemove(value) { level0.set(this, 'onmousemove', value); }
  
    get onmouseout() { return level0.get(this, 'onmouseout'); }
    set onmouseout(value) { level0.set(this, 'onmouseout', value); }
  
    get onmouseover() { return level0.get(this, 'onmouseover'); }
    set onmouseover(value) { level0.set(this, 'onmouseover', value); }
  
    get onmouseup() { return level0.get(this, 'onmouseup'); }
    set onmouseup(value) { level0.set(this, 'onmouseup', value); }
  
    get onmousewheel() { return level0.get(this, 'onmousewheel'); }
    set onmousewheel(value) { level0.set(this, 'onmousewheel', value); }
  
    get onpause() { return level0.get(this, 'onpause'); }
    set onpause(value) { level0.set(this, 'onpause', value); }
  
    get onplay() { return level0.get(this, 'onplay'); }
    set onplay(value) { level0.set(this, 'onplay', value); }
  
    get onplaying() { return level0.get(this, 'onplaying'); }
    set onplaying(value) { level0.set(this, 'onplaying', value); }
  
    get onprogress() { return level0.get(this, 'onprogress'); }
    set onprogress(value) { level0.set(this, 'onprogress', value); }
  
    get onratechange() { return level0.get(this, 'onratechange'); }
    set onratechange(value) { level0.set(this, 'onratechange', value); }
  
    get onreset() { return level0.get(this, 'onreset'); }
    set onreset(value) { level0.set(this, 'onreset', value); }
  
    get onresize() { return level0.get(this, 'onresize'); }
    set onresize(value) { level0.set(this, 'onresize', value); }
  
    get onscroll() { return level0.get(this, 'onscroll'); }
    set onscroll(value) { level0.set(this, 'onscroll', value); }
  
    get onseeked() { return level0.get(this, 'onseeked'); }
    set onseeked(value) { level0.set(this, 'onseeked', value); }
  
    get onseeking() { return level0.get(this, 'onseeking'); }
    set onseeking(value) { level0.set(this, 'onseeking', value); }
  
    get onselect() { return level0.get(this, 'onselect'); }
    set onselect(value) { level0.set(this, 'onselect', value); }
  
    get onshow() { return level0.get(this, 'onshow'); }
    set onshow(value) { level0.set(this, 'onshow', value); }
  
    get onstalled() { return level0.get(this, 'onstalled'); }
    set onstalled(value) { level0.set(this, 'onstalled', value); }
  
    get onsubmit() { return level0.get(this, 'onsubmit'); }
    set onsubmit(value) { level0.set(this, 'onsubmit', value); }
  
    get onsuspend() { return level0.get(this, 'onsuspend'); }
    set onsuspend(value) { level0.set(this, 'onsuspend', value); }
  
    get ontimeupdate() { return level0.get(this, 'ontimeupdate'); }
    set ontimeupdate(value) { level0.set(this, 'ontimeupdate', value); }
  
    get ontoggle() { return level0.get(this, 'ontoggle'); }
    set ontoggle(value) { level0.set(this, 'ontoggle', value); }
  
    get onvolumechange() { return level0.get(this, 'onvolumechange'); }
    set onvolumechange(value) { level0.set(this, 'onvolumechange', value); }
  
    get onwaiting() { return level0.get(this, 'onwaiting'); }
    set onwaiting(value) { level0.set(this, 'onwaiting', value); }
  
    get onauxclick() { return level0.get(this, 'onauxclick'); }
    set onauxclick(value) { level0.set(this, 'onauxclick', value); }
  
    get ongotpointercapture() { return level0.get(this, 'ongotpointercapture'); }
    set ongotpointercapture(value) { level0.set(this, 'ongotpointercapture', value); }
  
    get onlostpointercapture() { return level0.get(this, 'onlostpointercapture'); }
    set onlostpointercapture(value) { level0.set(this, 'onlostpointercapture', value); }
  
    get onpointercancel() { return level0.get(this, 'onpointercancel'); }
    set onpointercancel(value) { level0.set(this, 'onpointercancel', value); }
  
    get onpointerdown() { return level0.get(this, 'onpointerdown'); }
    set onpointerdown(value) { level0.set(this, 'onpointerdown', value); }
  
    get onpointerenter() { return level0.get(this, 'onpointerenter'); }
    set onpointerenter(value) { level0.set(this, 'onpointerenter', value); }
  
    get onpointerleave() { return level0.get(this, 'onpointerleave'); }
    set onpointerleave(value) { level0.set(this, 'onpointerleave', value); }
  
    get onpointermove() { return level0.get(this, 'onpointermove'); }
    set onpointermove(value) { level0.set(this, 'onpointermove', value); }
  
    get onpointerout() { return level0.get(this, 'onpointerout'); }
    set onpointerout(value) { level0.set(this, 'onpointerout', value); }
  
    get onpointerover() { return level0.get(this, 'onpointerover'); }
    set onpointerover(value) { level0.set(this, 'onpointerover', value); }
  
    get onpointerup() { return level0.get(this, 'onpointerup'); }
    set onpointerup(value) { level0.set(this, 'onpointerup', value); }
    /* c8 ignore stop */
  
  }
  