Plan Coordinates NG

A userscript to make show the coordinates of the picture-elements in HomeAssistant

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name         Plan Coordinates NG
// @namespace    npm/vite-plugin-monkey
// @version      0.0.1
// @author       Fabio Tea <[email protected]> (iam.f4b.io)
// @description  A userscript to make show the coordinates of the picture-elements in HomeAssistant
// @license      MIT
// @icon         https://cdn.imgchest.com/files/d7ogcv26wwy.png
// @match        http://homeassistant.local:8123/*
// @require      https://cdn.jsdelivr.net/npm/@violentmonkey/dom@2
// @require      https://cdn.jsdelivr.net/npm/@violentmonkey/[email protected]
// @require      https://cdn.jsdelivr.net/npm/[email protected]
// @grant        GM_addStyle
// ==/UserScript==

(function () {
  'use strict';

  /*! @gera2ld/jsx-dom v2.2.2 | ISC License */
  const VTYPE_ELEMENT = 1;
  const VTYPE_FUNCTION = 2;
  const SVG_NS = "http://www.w3.org/2000/svg";
  const XLINK_NS = "http://www.w3.org/1999/xlink";
  const NS_ATTRS = {
    show: XLINK_NS,
    actuate: XLINK_NS,
    href: XLINK_NS
  };
  const isLeaf = (c2) => typeof c2 === "string" || typeof c2 === "number";
  const isElement = (c2) => (c2 == null ? void 0 : c2.vtype) === VTYPE_ELEMENT;
  const isRenderFunction = (c2) => (c2 == null ? void 0 : c2.vtype) === VTYPE_FUNCTION;
  function h$1(type, props, ...children) {
    props = Object.assign({}, props, {
      children: children.length === 1 ? children[0] : children
    });
    return jsx(type, props);
  }
  function jsx(type, props) {
    let vtype;
    if (typeof type === "string")
      vtype = VTYPE_ELEMENT;
    else if (typeof type === "function")
      vtype = VTYPE_FUNCTION;
    else
      throw new Error("Invalid VNode type");
    return {
      vtype,
      type,
      props
    };
  }
  function Fragment(props) {
    return props.children;
  }
  const DEFAULT_ENV = {
    isSvg: false
  };
  function insertDom(parent, nodes) {
    if (!Array.isArray(nodes))
      nodes = [nodes];
    nodes = nodes.filter(Boolean);
    if (nodes.length)
      parent.append(...nodes);
  }
  function mountAttributes(domElement, props, env) {
    for (const key in props) {
      if (key === "key" || key === "children" || key === "ref")
        continue;
      if (key === "dangerouslySetInnerHTML") {
        domElement.innerHTML = props[key].__html;
      } else if (key === "innerHTML" || key === "textContent" || key === "innerText" || key === "value" && ["textarea", "select"].includes(domElement.tagName)) {
        const value = props[key];
        if (value != null)
          domElement[key] = value;
      } else if (key.startsWith("on")) {
        domElement[key.toLowerCase()] = props[key];
      } else {
        setDOMAttribute(domElement, key, props[key], env.isSvg);
      }
    }
  }
  const attrMap = {
    className: "class",
    labelFor: "for"
  };
  function setDOMAttribute(el, attr, value, isSVG) {
    attr = attrMap[attr] || attr;
    if (value === true) {
      el.setAttribute(attr, "");
    } else if (value === false) {
      el.removeAttribute(attr);
    } else {
      const namespace = isSVG ? NS_ATTRS[attr] : void 0;
      if (namespace !== void 0) {
        el.setAttributeNS(namespace, attr, value);
      } else {
        el.setAttribute(attr, value);
      }
    }
  }
  function flatten(arr) {
    return arr.reduce((prev, item) => prev.concat(item), []);
  }
  function mountChildren(children, env) {
    return Array.isArray(children) ? flatten(children.map((child) => mountChildren(child, env))) : mount(children, env);
  }
  function mount(vnode, env = DEFAULT_ENV) {
    if (vnode == null || typeof vnode === "boolean") {
      return null;
    }
    if (vnode instanceof Node) {
      return vnode;
    }
    if (isRenderFunction(vnode)) {
      const {
        type,
        props
      } = vnode;
      if (type === Fragment) {
        const node = document.createDocumentFragment();
        if (props.children) {
          const children = mountChildren(props.children, env);
          insertDom(node, children);
        }
        return node;
      }
      const childVNode = type(props);
      return mount(childVNode, env);
    }
    if (isLeaf(vnode)) {
      return document.createTextNode(`${vnode}`);
    }
    if (isElement(vnode)) {
      let node;
      const {
        type,
        props
      } = vnode;
      if (!env.isSvg && type === "svg") {
        env = Object.assign({}, env, {
          isSvg: true
        });
      }
      if (!env.isSvg) {
        node = document.createElement(type);
      } else {
        node = document.createElementNS(SVG_NS, type);
      }
      mountAttributes(node, props, env);
      if (props.children) {
        let childEnv = env;
        if (env.isSvg && type === "foreignObject") {
          childEnv = Object.assign({}, childEnv, {
            isSvg: false
          });
        }
        const children = mountChildren(props.children, childEnv);
        if (children != null)
          insertDom(node, children);
      }
      const {
        ref
      } = props;
      if (typeof ref === "function")
        ref(node);
      return node;
    }
    throw new Error("mount: Invalid Vnode!");
  }
  function mountDom(vnode) {
    return mount(vnode);
  }
  function hm(...args) {
    return mountDom(h$1(...args));
  }
  /*! @violentmonkey/[email protected] | ISC License */
  var _VM$1;
  Object.assign(typeof VM !== "undefined" && ((_VM$1 = VM) == null ? void 0 : _VM$1.versions) || {}, {
    dom: "2.1.7"
  });
  function observe(node, callback, options) {
    const observer = new MutationObserver((mutations, ob) => {
      const result = callback(mutations, ob);
      if (result)
        disconnect();
    });
    observer.observe(node, Object.assign({
      childList: true,
      subtree: true
    }, options));
    const disconnect = () => observer.disconnect();
    return disconnect;
  }
  /*! @violentmonkey/ui v0.7.9 | ISC License */
  var css_248z = ":host{all:initial;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,sans-serif;font-size:16px;line-height:1.5}";
  var themes = { "dark": "vmui-jkiNs1", "light": "vmui-aBcXBX" };
  var stylesheet$2 = ".vmui-jkiNs1{background:rgba(0,0,0,.8);border:1px solid #333;box-shadow:0 0 8px #333;color:#fff}.vmui-aBcXBX{background:#fff;border:1px solid #ddd;box-shadow:0 0 8px #ddd;color:#333}";
  function _extends() {
    _extends = Object.assign ? Object.assign.bind() : function(target) {
      for (var i2 = 1; i2 < arguments.length; i2++) {
        var source = arguments[i2];
        for (var key in source) {
          if (Object.prototype.hasOwnProperty.call(source, key)) {
            target[key] = source[key];
          }
        }
      }
      return target;
    };
    return _extends.apply(this, arguments);
  }
  class Movable {
    constructor(el, options) {
      this.onMouseDown = (e2) => {
        e2.preventDefault();
        e2.stopPropagation();
        const {
          x,
          y: y2
        } = this.el.getBoundingClientRect();
        const {
          clientX,
          clientY
        } = e2;
        this.dragging = {
          x: clientX - x,
          y: clientY - y2
        };
        document.addEventListener("mousemove", this.onMouseMove);
        document.addEventListener("mouseup", this.onMouseUp);
      };
      this.onMouseMove = (e2) => {
        if (!this.dragging)
          return;
        const {
          x,
          y: y2
        } = this.dragging;
        const {
          clientX,
          clientY
        } = e2;
        const position = {
          top: "auto",
          left: "auto",
          right: "auto",
          bottom: "auto"
        };
        const {
          clientWidth,
          clientHeight
        } = document.documentElement;
        const width = this.el.offsetWidth;
        const height = this.el.offsetHeight;
        const left = Math.min(clientWidth - width, Math.max(0, clientX - x));
        const top = Math.min(clientHeight - height, Math.max(0, clientY - y2));
        const {
          origin
        } = this.options;
        if (origin.x === "start" || origin.x === "auto" && left + left + width < clientWidth) {
          position.left = `${left}px`;
        } else {
          position.right = `${clientWidth - left - width}px`;
        }
        if (origin.y === "start" || origin.y === "auto" && top + top + height < clientHeight) {
          position.top = `${top}px`;
        } else {
          position.bottom = `${clientHeight - top - height}px`;
        }
        Object.assign(this.el.style, position);
      };
      this.onMouseUp = () => {
        var _this$options$onMoved, _this$options;
        this.dragging = null;
        document.removeEventListener("mousemove", this.onMouseMove);
        document.removeEventListener("mouseup", this.onMouseUp);
        (_this$options$onMoved = (_this$options = this.options).onMoved) == null || _this$options$onMoved.call(_this$options);
      };
      this.el = el;
      this.setOptions(options);
    }
    setOptions(options) {
      this.options = _extends({}, Movable.defaultOptions, options);
    }
    enable() {
      this.el.addEventListener("mousedown", this.onMouseDown);
    }
    disable() {
      this.dragging = void 0;
      this.el.removeEventListener("mousedown", this.onMouseDown);
      document.removeEventListener("mousemove", this.onMouseMove);
      document.removeEventListener("mouseup", this.onMouseUp);
    }
  }
  Movable.defaultOptions = {
    origin: {
      x: "auto",
      y: "auto"
    }
  };
  function getHostElement(shadow = true) {
    const id = getUniqueId("vmui-");
    const host = mountDom(h$1(id, {
      id
    }));
    let root;
    if (shadow) {
      root = host.attachShadow({
        mode: "open"
      });
    } else {
      root = mountDom(h$1(id, {}));
      host.append(root);
    }
    const styles2 = [];
    const addStyle = (css) => {
      if (!shadow && typeof GM_addStyle === "function") {
        styles2.push(GM_addStyle(css.replace(/:host\b/g, `#${id} `)));
      } else {
        root.append(mountDom(VM.h("style", null, css)));
      }
    };
    const dispose = () => {
      host.remove();
      styles2.forEach((style) => style.remove());
    };
    addStyle(css_248z);
    const result = {
      id,
      tag: "VM.getHostElement",
      shadow,
      host,
      root,
      addStyle,
      dispose,
      show() {
        appendToBody(this.tag, this.host);
      },
      hide() {
        this.host.remove();
      }
    };
    return result;
  }
  function appendToBody(tag, ...children) {
    if (!document.body) {
      console.warn(`[${tag}] document.body is not ready yet, operation skipped.`);
      return;
    }
    document.body.append(...children);
  }
  function getUniqueId(prefix = "") {
    return prefix + Math.random().toString(36).slice(2, 8);
  }
  function classNames(names) {
    return names.filter(Boolean).join(" ");
  }
  var styles$1 = { "toast": "vmui-MNVqs0" };
  var stylesheet$1 = ".vmui-MNVqs0{left:50%;padding:8px 16px;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:10000}";
  function showToast(content, options) {
    options = _extends({
      duration: 2e3,
      shadow: true,
      theme: "light",
      beforeEnter: defaultBeforeEnter,
      beforeClose: defaultBeforeClose
    }, options);
    const hostElem = getHostElement(options.shadow);
    const {
      dispose,
      addStyle
    } = hostElem;
    const body = mountDom(VM.h(hostElem.id, {
      className: classNames([styles$1.toast, themes[options.theme], options.className])
    }, content));
    hostElem.root.append(body);
    let {
      style
    } = options;
    if (typeof style === "function")
      style = style(hostElem.id);
    addStyle([stylesheet$1, stylesheet$2, style].filter(Boolean).join("\n"));
    let closed = false;
    const result = _extends({}, hostElem, {
      tag: "VM.showToast",
      body,
      close
    });
    result.show();
    (async () => {
      await (options.beforeEnter == null ? void 0 : options.beforeEnter(result));
      if (options.duration) {
        setTimeout(close, options.duration);
      }
    })();
    return result;
    async function close() {
      if (closed)
        return;
      closed = true;
      await (options.beforeClose == null ? void 0 : options.beforeClose(result));
      dispose();
    }
  }
  async function defaultBeforeEnter(result) {
    const {
      body
    } = result;
    body.style.transition = "opacity .2s";
    body.style.opacity = "0";
    await sleep(0);
    body.style.opacity = "1";
    await sleep(200);
  }
  async function defaultBeforeClose(result) {
    const {
      body
    } = result;
    body.style.transition = "opacity .2s";
    body.style.opacity = "0";
    await sleep(200);
  }
  async function sleep(time) {
    return new Promise((resolve) => setTimeout(resolve, time));
  }
  var styles = { "panel": "vmui-pliUr-", "body": "vmui-I3r6A8" };
  var stylesheet = ".vmui-pliUr-{color:#333;position:fixed;z-index:10000}.vmui-I3r6A8{display:block;padding:8px;position:relative;word-break:break-word}";
  function getPanel(options) {
    options = _extends({
      shadow: true,
      theme: "light"
    }, options);
    const hostElem = getHostElement(options.shadow);
    const body = mountDom(VM.h(hostElem.id, {
      className: classNames([styles.body, themes[options.theme]])
    }));
    const wrapper = mountDom(VM.h(hostElem.id, {
      className: classNames([styles.panel, options.className])
    }, body));
    let {
      style
    } = options;
    if (typeof style === "function")
      style = style(hostElem.id);
    hostElem.addStyle([stylesheet, stylesheet$2, style].filter(Boolean).join("\n"));
    hostElem.root.append(wrapper);
    const clear = () => {
      while (body.firstChild)
        body.firstChild.remove();
    };
    const append = (...args) => {
      body.append(...args.map(mountDom).filter(Boolean));
    };
    const setContent = (...args) => {
      clear();
      append(...args);
    };
    if (options.content)
      setContent(options.content);
    let movable;
    const setMovable = (toggle, options2) => {
      movable || (movable = new Movable(wrapper));
      if (options2)
        movable.setOptions(options2);
      if (toggle) {
        movable.enable();
      } else {
        movable.disable();
      }
    };
    return _extends({}, hostElem, {
      tag: "VM.getPanel",
      wrapper,
      body,
      clear,
      append,
      setContent,
      setMovable
    });
  }
  var _VM, _VM2;
  Object.assign(typeof VM !== "undefined" && ((_VM = VM) == null ? void 0 : _VM.versions) || {}, {
    ui: "0.7.9"
  });
  if (typeof VM === "undefined" || ((_VM2 = VM) == null || (_VM2 = _VM2.versions) == null || (_VM2 = _VM2.dom) == null ? void 0 : _VM2.split(".")[0]) !== "2") {
    throw new Error(`[VM-UI] @violentmonkey/dom@2 is required
Please include following code in your metadata:

// @require https://cdn.jsdelivr.net/npm/@violentmonkey/dom@2
// @require https://cdn.jsdelivr.net/npm/@violentmonkey/[email protected]
`);
  }
  var n = function() {
    return n = Object.assign || function(n2) {
      for (var t2, e2 = 1, r2 = arguments.length; e2 < r2; e2++)
        for (var o2 in t2 = arguments[e2])
          Object.prototype.hasOwnProperty.call(t2, o2) && (n2[o2] = t2[o2]);
      return n2;
    }, n.apply(this, arguments);
  };
  function t(n2, t2, e2, r2) {
    return new (e2 || (e2 = Promise))(function(o2, u2) {
      function i2(n3) {
        try {
          c2(r2.next(n3));
        } catch (n4) {
          u2(n4);
        }
      }
      function a2(n3) {
        try {
          c2(r2.throw(n3));
        } catch (n4) {
          u2(n4);
        }
      }
      function c2(n3) {
        var t3;
        n3.done ? o2(n3.value) : (t3 = n3.value, t3 instanceof e2 ? t3 : new e2(function(n4) {
          n4(t3);
        })).then(i2, a2);
      }
      c2((r2 = r2.apply(n2, t2 || [])).next());
    });
  }
  function e(n2, t2) {
    var e2, r2, o2, u2, i2 = { label: 0, sent: function() {
      if (1 & o2[0])
        throw o2[1];
      return o2[1];
    }, trys: [], ops: [] };
    return u2 = { next: a2(0), throw: a2(1), return: a2(2) }, "function" == typeof Symbol && (u2[Symbol.iterator] = function() {
      return this;
    }), u2;
    function a2(a3) {
      return function(c2) {
        return function(a4) {
          if (e2)
            throw new TypeError("Generator is already executing.");
          for (; u2 && (u2 = 0, a4[0] && (i2 = 0)), i2; )
            try {
              if (e2 = 1, r2 && (o2 = 2 & a4[0] ? r2.return : a4[0] ? r2.throw || ((o2 = r2.return) && o2.call(r2), 0) : r2.next) && !(o2 = o2.call(r2, a4[1])).done)
                return o2;
              switch (r2 = 0, o2 && (a4 = [2 & a4[0], o2.value]), a4[0]) {
                case 0:
                case 1:
                  o2 = a4;
                  break;
                case 4:
                  return i2.label++, { value: a4[1], done: false };
                case 5:
                  i2.label++, r2 = a4[1], a4 = [0];
                  continue;
                case 7:
                  a4 = i2.ops.pop(), i2.trys.pop();
                  continue;
                default:
                  if (!(o2 = i2.trys, (o2 = o2.length > 0 && o2[o2.length - 1]) || 6 !== a4[0] && 2 !== a4[0])) {
                    i2 = 0;
                    continue;
                  }
                  if (3 === a4[0] && (!o2 || a4[1] > o2[0] && a4[1] < o2[3])) {
                    i2.label = a4[1];
                    break;
                  }
                  if (6 === a4[0] && i2.label < o2[1]) {
                    i2.label = o2[1], o2 = a4;
                    break;
                  }
                  if (o2 && i2.label < o2[2]) {
                    i2.label = o2[2], i2.ops.push(a4);
                    break;
                  }
                  o2[2] && i2.ops.pop(), i2.trys.pop();
                  continue;
              }
              a4 = t2.call(n2, i2);
            } catch (n3) {
              a4 = [6, n3], r2 = 0;
            } finally {
              e2 = o2 = 0;
            }
          if (5 & a4[0])
            throw a4[1];
          return { value: a4[0] ? a4[1] : void 0, done: true };
        }([a3, c2]);
      };
    }
  }
  "function" == typeof SuppressedError && SuppressedError;
  var r = "$", o = ":host", u = "invalid selector", i = 10, a = 10, c = function(n2) {
    var t2, e2 = n2[0], r2 = n2[1];
    return (t2 = e2) && (t2 instanceof Document || t2 instanceof Element || t2 instanceof ShadowRoot) && "string" == typeof r2;
  };
  function l(n2, t2) {
    return function(n3) {
      return n3.split(",").map(function(n4) {
        return n4.trim();
      });
    }(n2).map(function(n3) {
      var e2 = function(n4) {
        return n4.split(r).map(function(n5) {
          return n5.trim();
        });
      }(n3);
      return t2(e2);
    });
  }
  var s = function(n2, t2, e2, r2) {
    return new Promise(function(o2) {
      var u2 = 0, i2 = function() {
        var a2 = n2();
        t2(a2) ? o2(a2) : ++u2 < e2 ? setTimeout(i2, r2) : o2(a2);
      };
      i2();
    });
  };
  function f(n2, t2) {
    var e2 = t2 ? " If you want to select a shadowRoot, use ".concat(t2, " instead.") : "";
    return "".concat(n2, " cannot be used with a selector ending in a shadowRoot (").concat(r, ").").concat(e2);
  }
  function d(n2) {
    return n2 instanceof Promise ? n2 : Promise.resolve(n2);
  }
  function h() {
    return "You can not select a shadowRoot (".concat(r, ") of the document.");
  }
  function v() {
    return "You can not select a shadowRoot (".concat(r, ") of a shadowRoot.");
  }
  function y(n2, t2) {
    for (var e2, r2, u2 = null, i2 = n2.length, a2 = 0; a2 < i2; a2++) {
      if (0 === a2)
        if (n2[a2].length)
          u2 = t2.querySelector(n2[a2]);
        else {
          if (t2 instanceof Document)
            throw new SyntaxError(h());
          if (t2 instanceof ShadowRoot)
            throw new SyntaxError(v());
          u2 = (null === (e2 = t2.shadowRoot) || void 0 === e2 ? void 0 : e2.querySelector(n2[++a2])) || null;
        }
      else
        u2 = (null === (r2 = u2.shadowRoot) || void 0 === r2 ? void 0 : r2.querySelector("".concat(o, " ").concat(n2[a2]))) || null;
      if (null === u2)
        return null;
    }
    return u2;
  }
  function m(n2, t2) {
    var e2, r2 = function(n3, t3, e3) {
      if (e3 || 2 === arguments.length)
        for (var r3, o2 = 0, u3 = t3.length; o2 < u3; o2++)
          !r3 && o2 in t3 || (r3 || (r3 = Array.prototype.slice.call(t3, 0, o2)), r3[o2] = t3[o2]);
      return n3.concat(r3 || Array.prototype.slice.call(t3));
    }([], n2, true), u2 = r2.pop();
    if (!r2.length)
      return t2.querySelectorAll(u2);
    var i2 = y(r2, t2);
    return (null === (e2 = null == i2 ? void 0 : i2.shadowRoot) || void 0 === e2 ? void 0 : e2.querySelectorAll("".concat(o, " ").concat(u2))) || null;
  }
  function p(n2, t2) {
    if (1 === n2.length && !n2[0].length) {
      if (t2 instanceof Document)
        throw new SyntaxError(h());
      if (t2 instanceof ShadowRoot)
        throw new SyntaxError(v());
      return t2.shadowRoot;
    }
    var e2 = y(n2, t2);
    return (null == e2 ? void 0 : e2.shadowRoot) || null;
  }
  function g(n2, t2, e2) {
    void 0 === e2 && (e2 = "querySelectorAll");
    for (var r2 = l(n2, function(n3) {
      if (!n3[n3.length - 1].length)
        throw new SyntaxError(f(e2));
      return n3;
    }), o2 = r2.length, i2 = 0; i2 < o2; i2++) {
      var a2 = m(r2[i2], t2);
      if (null == a2 ? void 0 : a2.length)
        return a2;
    }
    return document.querySelectorAll(u);
  }
  function S(n2, t2, e2, o2) {
    void 0 === e2 && (e2 = "shadowRootQuerySelector"), void 0 === o2 && (o2 = "querySelector");
    for (var u2 = l(n2, function(n3) {
      if (n3.pop().length)
        throw new SyntaxError(function(n4, t3) {
          return "".concat(n4, " must be used with a selector ending in a shadowRoot (").concat(r, "). If you don't want to select a shadowRoot, use ").concat(t3, " instead.");
        }(e2, o2));
      return n3;
    }), i2 = u2.length, a2 = 0; a2 < i2; a2++) {
      var c2 = p(u2[a2], t2);
      if (c2)
        return c2;
    }
    return null;
  }
  function P(n2, r2, o2, u2) {
    return t(this, void 0, void 0, function() {
      return e(this, function(t2) {
        return [2, s(function() {
          return g(n2, r2, "asyncQuerySelectorAll");
        }, function(n3) {
          return !!n3.length;
        }, o2, u2)];
      });
    });
  }
  function R(n2, r2, o2, u2) {
    return t(this, void 0, void 0, function() {
      return e(this, function(t2) {
        return [2, s(function() {
          return S(n2, r2, "asyncShadowRootQuerySelector", "asyncQuerySelector");
        }, function(n3) {
          return !!n3;
        }, o2, u2)];
      });
    });
  }
  var _ = function(n2, t2) {
    var e2 = n2.querySelectorAll(t2);
    if (e2.length)
      return e2;
    if (n2 instanceof Element && n2.shadowRoot) {
      var r2 = _(n2.shadowRoot, t2);
      if (r2.length)
        return r2;
    }
    for (var o2 = 0, i2 = Array.from(n2.querySelectorAll("*")); o2 < i2.length; o2++) {
      var a2 = i2[o2], c2 = _(a2, t2);
      if (c2.length)
        return c2;
    }
    return document.querySelectorAll(u);
  }, q = function(n2, t2, e2, r2) {
    return s(function() {
      return _(n2, t2);
    }, function(n3) {
      return !!n3.length;
    }, e2, r2);
  };
  function A() {
    for (var n2 = [], t2 = 0; t2 < arguments.length; t2++)
      n2[t2] = arguments[t2];
    var e2 = n2[0], r2 = n2[1];
    return "string" == typeof e2 ? _(document, e2)[0] || null : _(e2, r2)[0] || null;
  }
  function j() {
    for (var n2 = [], r2 = 0; r2 < arguments.length; r2++)
      n2[r2] = arguments[r2];
    return t(this, void 0, void 0, function() {
      var t2, r3, o2, u2, l2;
      return e(this, function(e2) {
        switch (e2.label) {
          case 0:
            return c(n2) ? (t2 = n2[0], r3 = n2[1], o2 = n2[2], [4, P(r3, t2, (null == o2 ? void 0 : o2.retries) || i, (null == o2 ? void 0 : o2.delay) || a)]) : [3, 2];
          case 1:
            return [2, e2.sent()];
          case 2:
            return u2 = n2[0], l2 = n2[1], [2, P(u2, document, (null == l2 ? void 0 : l2.retries) || i, (null == l2 ? void 0 : l2.delay) || a)];
        }
      });
    });
  }
  function D() {
    for (var n2 = [], r2 = 0; r2 < arguments.length; r2++)
      n2[r2] = arguments[r2];
    return t(this, void 0, void 0, function() {
      var t2, r3, o2, u2, l2;
      return e(this, function(e2) {
        switch (e2.label) {
          case 0:
            return c(n2) ? (t2 = n2[0], r3 = n2[1], o2 = n2[2], [4, R(r3, t2, (null == o2 ? void 0 : o2.retries) || i, (null == o2 ? void 0 : o2.delay) || a)]) : [3, 2];
          case 1:
            return [2, e2.sent()];
          case 2:
            return u2 = n2[0], l2 = n2[1], [2, R(u2, document, (null == l2 ? void 0 : l2.retries) || i, (null == l2 ? void 0 : l2.delay) || a)];
        }
      });
    });
  }
  (function() {
    function o2(t2, e2) {
      t2 instanceof Node || t2 instanceof Promise ? (this._element = t2, this._asyncParams = n({ retries: i, delay: a }, e2 || {})) : (this._element = document, this._asyncParams = n({ retries: i, delay: a }, t2 || {}));
    }
    return Object.defineProperty(o2.prototype, "element", { get: function() {
      return d(this._element).then(function(n2) {
        return n2 instanceof NodeList ? n2[0] || null : n2;
      });
    }, enumerable: false, configurable: true }), Object.defineProperty(o2.prototype, r, { get: function() {
      var n2 = this;
      return new o2(d(this._element).then(function(t2) {
        return t2 instanceof Document || t2 instanceof ShadowRoot || null === t2 || t2 instanceof NodeList && 0 === t2.length ? null : t2 instanceof NodeList ? D(t2[0], r, n2._asyncParams) : D(t2, r, n2._asyncParams);
      }), this._asyncParams);
    }, enumerable: false, configurable: true }), Object.defineProperty(o2.prototype, "all", { get: function() {
      return d(this._element).then(function(n2) {
        return n2 instanceof NodeList ? n2 : document.querySelectorAll(u);
      });
    }, enumerable: false, configurable: true }), Object.defineProperty(o2.prototype, "asyncParams", { get: function() {
      return this._asyncParams;
    }, enumerable: false, configurable: true }), o2.prototype.eq = function(n2) {
      return t(this, void 0, void 0, function() {
        return e(this, function(t2) {
          return [2, d(this._element).then(function(t3) {
            return t3 instanceof NodeList && t3[n2] || null;
          })];
        });
      });
    }, o2.prototype.query = function(n2) {
      var t2 = this;
      return new o2(d(this._element).then(function(e2) {
        return null === e2 || e2 instanceof NodeList && 0 === e2.length ? null : e2 instanceof NodeList ? j(e2[0], n2, t2._asyncParams) : j(e2, n2, t2._asyncParams);
      }), this._asyncParams);
    }, o2.prototype.deepQuery = function(n2) {
      var t2 = this;
      return new o2(d(this._element).then(function(e2) {
        return null === e2 || e2 instanceof NodeList && 0 === e2.length ? null : e2 instanceof NodeList ? Promise.race(Array.from(e2).map(function(e3) {
          return q(e3, n2, t2._asyncParams.retries, t2._asyncParams.delay);
        })) : q(e2, n2, t2._asyncParams.retries, t2._asyncParams.delay);
      }), this._asyncParams);
    }, o2;
  })();
  observe(document.body, () => {
    const loadingToast = showToast(h$1("div", {}, "Loading..."), {});
    const intervall = setInterval(() => {
      const imageElement = A("hui-image");
      if (imageElement) {
        clearInterval(intervall);
        loadingToast.close();
        const boxWidth = imageElement.getBoundingClientRect().width;
        const boxHeight = imageElement.getBoundingClientRect().height;
        imageElement.addEventListener("click", (el) => {
          const clientX = el.clientX - 256;
          const clientY = el.clientY - 56;
          if (clientX <= boxWidth && clientY <= boxHeight) {
            const percentX = Math.ceil(clientX / boxWidth * 100);
            const percentY = Math.ceil(clientY / boxHeight * 100);
            const coordinatesHtml = hm(
              "article",
              { class: "card" },
              [
                hm("header", {}, hm("h3", {}, "Coordinates")),
                hm("footer", {}, [
                  hm("fieldset", { class: "flex two" }, [
                    hm("label", { for: "boxWidth" }, "boxHeight"),
                    hm("input", { id: "boxWidth", type: "number", class: "show", value: boxWidth, readonly: true })
                  ]),
                  hm("fieldset", { class: "flex two" }, [
                    hm("label", { for: "boxHeight" }, "boxHeight"),
                    hm("input", { id: "boxHeight", type: "number", class: "show", value: boxHeight, readonly: true })
                  ]),
                  hm("fieldset", { class: "flex two" }, [
                    hm("label", { for: "clientX" }, "clientX"),
                    hm("input", { id: "clientX", type: "number", class: "show", value: clientX, readonly: true })
                  ]),
                  hm("fieldset", { class: "flex two" }, [
                    hm("label", { for: "clientY" }, "clientY"),
                    hm("input", { id: "clientY", type: "number", class: "show", value: clientY, readonly: true })
                  ]),
                  hm("fieldset", { class: "flex two" }, [
                    hm("label", { for: "percentX" }, "percentX"),
                    hm("input", { id: "percentX", type: "number", class: "show", value: percentX, readonly: true })
                  ]),
                  hm("fieldset", { class: "flex two" }, [
                    hm("label", { for: "percentY" }, "percentY"),
                    hm("input", { id: "percentY", type: "number", class: "show", value: percentY, readonly: true })
                  ])
                ])
              ]
            );
            const panel = getPanel({
              content: coordinatesHtml
            });
            panel.wrapper.style.top = "10px";
            panel.wrapper.style.right = "10px";
            panel.show();
          }
        });
      }
    }, 1e3);
    return true;
  });

})();