uiWatch(cssSelector, startStop = "toggle", send = true, showLog = true) {
    const targetNode = document.querySelector(cssSelector);
    if (!targetNode) {
      log("warn", "uibuilder.module.js:uiWatch", "CSS Selector '".concat(cssSelector, "' not found."))();
      return false;
    }
    if (startStop === "toggle" || startStop === void 0 || startStop === null) {
      if (__privateGet(this, _uiObservers)[cssSelector]) startStop = false;
      else startStop = true;
    }
    const that = this;
    if (startStop === true) {
      __privateGet(this, _uiObservers)[cssSelector] = new MutationObserver(function(mutationList) {
        const out = [];
        mutationList.forEach((mu) => {
          const oMu = {
            type: mu.type,
            oldValue: mu.oldValue !== null ? mu.oldValue : void 0
          };
          if (mu.addedNodes.length > 0) {
            oMu.addedNodes = [];
            mu.addedNodes.forEach((an, i) => {
              oMu.addedNodes.push(_ui.nodeGet(mu.addedNodes[i]));
            });
          }
          if (mu.removedNodes.length > 0) {
            oMu.removedNodes = [];
            mu.removedNodes.forEach((an, i) => {
              oMu.removedNodes.push(_ui.nodeGet(mu.removedNodes[i]));
            });
          }
          if (mu.type === "attributes") {
            oMu.attributeName = mu.attributeName;
            oMu.newValue = mu.target.attributes[mu.attributeName].value;
          }
          out.push(oMu);
        });
        that._dispatchCustomEvent("uibuilder:domChange", out);
        if (send === true) {
          that.send({
            _ui: {
              cssSelector,
              uiChanges: out
            },
            topic: that.topic || "DOM Changes for '".concat(cssSelector, "'")
          });
        }
        if (showLog === true) {
          log("info", "uibuilder.module.js:uiWatch", "DOM Changes for '".concat(cssSelector, "'"), { uiChanges: out }, { mutationList })();
        }
      });
      __privateGet(this, _uiObservers)[cssSelector].observe(targetNode, { attributes: true, childList: true, subtree: true, characterData: true });
      log("trace", "uibuilder.module.js:uiWatch", "Started Watching DOM changes for '".concat(cssSelector, "'"))();
    } else {
      __privateGet(this, _uiObservers)[cssSelector].disconnect();
      delete __privateGet(this, _uiObservers)[cssSelector];
      log("trace", "uibuilder.module.js:uiWatch", "Stopped Watching DOM changes for '".concat(cssSelector, "'"))();
    }
    return startStop;
  }
Use the Mutation Observer browser API to watch for changes to a single element on the page.
OMG! It is sooo hard to turn the data into something that successfully serialises so it can be sent back to Node-RED!
NB: Each cssSelector creates a unique watcher. Sending the same selector overwrites the previous one.
@param {string} cssSelector A CSS Selector that selects the element to watch for changes
@param {boolean|"toggle"} [startStop] true=start watching the DOM, false=stop. Default='toggle'
@param {boolean} [send] true=Send changes to Node-RED, false=Don't send. Default=true
@param {boolean} [showLog] true=Output changes to log, false=stop. Default=true. Log level is 2 (Info)
@returns {boolean} True if the watch is on, false otherwise