"use strict";
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
const shared_esmBundler = require("../../../../../@vue/shared/dist/shared.esm-bundler.js");
const style = require("../../../utils/dom/style.js");
const loading = require("./loading.js");
const vue = require("vue");
const index = require("../../../../node_modules/@vueuse/shared/index.js");
let fullscreenInstance = void 0;
const Loading = function(options = {}, context) {
  if (!index.isClient) return void 0;
  const resolved = resolveOptions(options);
  if (resolved.fullscreen && fullscreenInstance) return fullscreenInstance;
  const instance = loading.createLoadingComponent({
    ...resolved,
    closed: () => {
      var _a;
      (_a = resolved.closed) == null ? void 0 : _a.call(resolved);
      if (resolved.fullscreen) fullscreenInstance = void 0;
    }
  }, context ?? Loading._context);
  addStyle(resolved, resolved.parent, instance);
  addClassList(resolved, resolved.parent, instance);
  resolved.parent.vLoadingAddClassList = () => addClassList(resolved, resolved.parent, instance);
  let loadingNumber = resolved.parent.getAttribute("loading-number");
  if (!loadingNumber) loadingNumber = "1";
  else loadingNumber = `${Number.parseInt(loadingNumber) + 1}`;
  resolved.parent.setAttribute("loading-number", loadingNumber);
  resolved.parent.appendChild(instance.$el);
  vue.nextTick(() => instance.visible.value = resolved.visible);
  if (resolved.fullscreen) fullscreenInstance = instance;
  return instance;
};
const resolveOptions = (options) => {
  let target;
  if (shared_esmBundler.isString(options.target)) target = document.querySelector(options.target) ?? document.body;
  else target = options.target || document.body;
  return {
    parent: target === document.body || options.body ? document.body : target,
    background: options.background || "",
    svg: options.svg || "",
    svgViewBox: options.svgViewBox || "",
    spinner: options.spinner || false,
    text: options.text || "",
    fullscreen: target === document.body && (options.fullscreen ?? true),
    lock: options.lock ?? false,
    customClass: options.customClass || "",
    visible: options.visible ?? true,
    beforeClose: options.beforeClose,
    closed: options.closed,
    target
  };
};
const addStyle = async (options, parent, instance) => {
  const { nextZIndex } = instance.vm.zIndex || instance.vm._.exposed.zIndex;
  const maskStyle = {};
  if (options.fullscreen) {
    instance.originalPosition.value = style.getStyle(document.body, "position");
    instance.originalOverflow.value = style.getStyle(document.body, "overflow");
    maskStyle.zIndex = nextZIndex();
  } else if (options.parent === document.body) {
    instance.originalPosition.value = style.getStyle(document.body, "position");
    await vue.nextTick();
    for (const property of ["top", "left"]) {
      const scroll = property === "top" ? "scrollTop" : "scrollLeft";
      maskStyle[property] = `${options.target.getBoundingClientRect()[property] + document.body[scroll] + document.documentElement[scroll] - Number.parseInt(style.getStyle(document.body, `margin-${property}`), 10)}px`;
    }
    for (const property of ["height", "width"]) maskStyle[property] = `${options.target.getBoundingClientRect()[property]}px`;
  } else instance.originalPosition.value = style.getStyle(parent, "position");
  for (const [key, value] of Object.entries(maskStyle)) instance.$el.style[key] = value;
};
const addClassList = (options, parent, instance) => {
  const ns = instance.vm.ns || instance.vm._.exposed.ns;
  if (![
    "absolute",
    "fixed",
    "sticky"
  ].includes(instance.originalPosition.value)) style.addClass(parent, ns.bm("parent", "relative"));
  else style.removeClass(parent, ns.bm("parent", "relative"));
  if (options.fullscreen && options.lock) style.addClass(parent, ns.bm("parent", "hidden"));
  else style.removeClass(parent, ns.bm("parent", "hidden"));
};
Loading._context = null;
exports.default = Loading;
