← Back to all guides

Transparency Layer

the Transparency Layer shows an overlay in the html DOM which displays data of the JS objects and variables working behind the scenes

Code

export class TransparencyLayer {
  constructor() {
    this.transparencyLayerElement =
      document.getElementById("transparency-layer");
    this.debugLayerElement = document.getElementById("debug-layer");
    this.active = false;
    this.debugObjects = [];

    this.setActive(false);
  }

  toggle() {
    console.log("toggle debug layer");
    const value = !this.active;
    this.setActive(value);
  }

  setActive(value) {
    this.transparencyLayerElement.style.display = value ? "flex" : "none";
    this.active = value;
  }

  addObject(object, name) {
    let debugElements = {};
    const debugObjectElement = this.createDebugObjectElement(name);
    Object.entries(object).forEach(([key, value]) => {
      const debugElement = this.createDebugElement(key, value);
      debugElements[key] = debugElement;
      debugObjectElement.appendChild(debugElement);
    });
    const debugObject = { object: object, debugElements: debugElements };
    console.log(debugObject);
    this.debugObjects.push(debugObject);
    this.debugLayerElement.appendChild(debugObjectElement); // add to HTML
  }

  updateDebug() {
    if (this.active) {
      this.debugObjects.forEach((debugObject) => {
        Object.entries(debugObject.object).forEach(([key, value]) => {
          const debugElement = debugObject.debugElements[key];
          if (debugElement) this.updateDebugElement(debugElement, value);
        });
      });
    }
  }

  updateDebugElement(debugElement, value) {
    debugElement.children[0].innerText = value;
  }

  createDebugObjectElement(name) {
    const debugObjectElement = document.createElement("div");
    debugObjectElement.classList.add("debug-object");
    const debugObjectHeadline = document.createElement("h3");
    debugObjectHeadline.innerText = name;
    debugObjectElement.appendChild(debugObjectHeadline);
    return debugObjectElement;
  }

  createDebugElement(name, value) {
    const debugElement = document.createElement("div");
    debugElement.classList.add("debug-prop");
    debugElement.innerText = name + ": ";
    const propertyVal = document.createElement("span");
    propertyVal.classList.add("debug-val");
    propertyVal.innerText = value;
    debugElement.appendChild(propertyVal);
    return debugElement;
  }
}