const k = (e) => e != null && typeof e == "object" || !1, m = (e) => k(e) && typeof e.nodeType == "number" && [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].some(
  (t) => e.nodeType === t
) || !1, a = (e) => m(e) && e.nodeType === 1 || !1, w = (e) => typeof e == "function" || !1, p = "1.0.7", u = "PositionObserver Error";
class y {
  entries;
  static version = p;
  _tick;
  _root;
  _callback;
  /**
   * The constructor takes two arguments, a `callback`, which is called
   * whenever the position of an observed element changes and an `options` object.
   * The callback function should take an array of `PositionObserverEntry` objects
   * as its only argument, but it's not required.
   *
   * @param callback the callback that applies to all targets of this observer
   * @param options the options of this observer
   */
  constructor(t, i) {
    if (!w(t))
      throw new Error(`${u}: ${t} is not a function.`);
    this.entries = /* @__PURE__ */ new Map(), this._callback = t, this._root = a(i?.root) ? i.root : document?.documentElement, this._tick = 0;
  }
  /**
   * Start observing the position of the specified element.
   * If the element is not currently attached to the DOM,
   * it will NOT be added to the entries.
   *
   * @param target an `Element` target
   */
  observe = (t) => {
    if (!a(t))
      throw new Error(
        `${u}: ${t} is not an instance of Element.`
      );
    this._root.contains(t) && this._new(t).then(({ boundingClientRect: i }) => {
      if (i && !this.getEntry(t)) {
        const { clientWidth: s, clientHeight: n } = this._root;
        this.entries.set(t, {
          target: t,
          boundingClientRect: i,
          clientWidth: s,
          clientHeight: n
        });
      }
      this._tick || (this._tick = requestAnimationFrame(this._runCallback));
    });
  };
  /**
   * Stop observing the position of the specified element.
   *
   * @param target an `Element` target
   */
  unobserve = (t) => {
    this.entries.has(t) && this.entries.delete(t);
  };
  /**
   * Private method responsible for all the heavy duty,
   * the observer's runtime.
   */
  _runCallback = () => {
    if (!this.entries.size) return;
    const { clientWidth: t, clientHeight: i } = this._root, s = new Promise((n) => {
      const r = [];
      this.entries.forEach(
        ({
          target: o,
          boundingClientRect: c,
          clientWidth: _,
          clientHeight: b
        }) => {
          this._root.contains(o) && this._new(o).then(({ boundingClientRect: h, isIntersecting: d }) => {
            if (!d) return;
            const { left: g, top: f } = h;
            if (c.top !== f || c.left !== g || _ !== t || b !== i) {
              const l = {
                target: o,
                boundingClientRect: h,
                clientHeight: i,
                clientWidth: t
              };
              this.entries.set(o, l), r.push(l);
            }
          });
        }
      ), n(r);
    });
    this._tick = requestAnimationFrame(async () => {
      const n = await s;
      n.length && this._callback(n, this), this._runCallback();
    });
  };
  /**
   * Check intersection status and resolve it
   * right away.
   *
   * @param target an `Element` target
   */
  _new = (t) => new Promise((i) => {
    new IntersectionObserver(
      ([s], n) => {
        n.disconnect(), i(s);
      }
    ).observe(t);
  });
  /**
   * Find the entry for a given target.
   *
   * @param target an `HTMLElement` target
   */
  getEntry = (t) => this.entries.get(t);
  /**
   * Immediately stop observing all elements.
   */
  disconnect = () => {
    cancelAnimationFrame(this._tick), this.entries.clear(), this._tick = 0;
  };
}
export {
  y
};
//# sourceMappingURL=index-CnhA8i0D.mjs.map