{"version":3,"file":"service.mjs","names":[],"sources":["../../../../../../packages/components/loading/src/service.ts"],"sourcesContent":["// @ts-nocheck\nimport { nextTick } from 'vue'\nimport {\n  addClass,\n  getStyle,\n  isClient,\n  isString,\n  removeClass,\n} from '@element-plus/utils'\nimport { createLoadingComponent } from './loading'\n\nimport type { UseNamespaceReturn, UseZIndexReturn } from '@element-plus/hooks'\nimport type { LoadingInstance } from './loading'\nimport type { LoadingOptionsResolved } from '..'\nimport type { LoadingOptions } from './types'\nimport type { AppContext, CSSProperties } from 'vue'\n\nlet fullscreenInstance: LoadingInstance | undefined = undefined\n\nconst Loading = function (\n  options: LoadingOptions = {},\n  context?: AppContext | null\n): LoadingInstance {\n  if (!isClient) return undefined as any\n\n  const resolved = resolveOptions(options)\n\n  if (resolved.fullscreen && fullscreenInstance) {\n    return fullscreenInstance\n  }\n\n  const instance = createLoadingComponent(\n    {\n      ...resolved,\n      closed: () => {\n        resolved.closed?.()\n        if (resolved.fullscreen) fullscreenInstance = undefined\n      },\n    },\n    context ?? Loading._context\n  )\n\n  addStyle(resolved, resolved.parent, instance)\n  addClassList(resolved, resolved.parent, instance)\n\n  resolved.parent.vLoadingAddClassList = () =>\n    addClassList(resolved, resolved.parent, instance)\n\n  /**\n   * add loading-number to parent.\n   * because if a fullscreen loading is triggered when somewhere\n   * a v-loading.body was triggered before and it's parent is\n   * document.body which with a margin , the fullscreen loading's\n   * destroySelf function will remove 'el-loading-parent--relative',\n   * and then the position of v-loading.body will be error.\n   */\n  let loadingNumber: string | null =\n    resolved.parent.getAttribute('loading-number')\n  if (!loadingNumber) {\n    loadingNumber = '1'\n  } else {\n    loadingNumber = `${Number.parseInt(loadingNumber) + 1}`\n  }\n  resolved.parent.setAttribute('loading-number', loadingNumber)\n\n  resolved.parent.appendChild(instance.$el!)\n\n  // after instance render, then modify visible to trigger transition\n  nextTick(() => (instance.visible.value = resolved.visible))\n\n  if (resolved.fullscreen) {\n    fullscreenInstance = instance\n  }\n  return instance\n}\n\nconst resolveOptions = (options: LoadingOptions): LoadingOptionsResolved => {\n  let target: HTMLElement\n  if (isString(options.target)) {\n    target =\n      document.querySelector<HTMLElement>(options.target) ?? document.body\n  } else {\n    target = options.target || document.body\n  }\n  return {\n    parent: target === document.body || options.body ? document.body : target,\n    background: options.background || '',\n    svg: options.svg || '',\n    svgViewBox: options.svgViewBox || '',\n    spinner: options.spinner || false,\n    text: options.text || '',\n    fullscreen: target === document.body && (options.fullscreen ?? true),\n    lock: options.lock ?? false,\n    customClass: options.customClass || '',\n    visible: options.visible ?? true,\n    beforeClose: options.beforeClose,\n    closed: options.closed,\n    target,\n  }\n}\n\nconst addStyle = async (\n  options: LoadingOptionsResolved,\n  parent: HTMLElement,\n  instance: LoadingInstance\n) => {\n  // Compatible with the instance data format of vue@3.2.12 and earlier versions #12351\n  const { nextZIndex } =\n    ((instance.vm as any).zIndex as UseZIndexReturn) ||\n    (instance.vm as any)._.exposed.zIndex\n\n  const maskStyle: CSSProperties = {}\n  if (options.fullscreen) {\n    instance.originalPosition.value = getStyle(document.body, 'position')\n    instance.originalOverflow.value = getStyle(document.body, 'overflow')\n    maskStyle.zIndex = nextZIndex()\n  } else if (options.parent === document.body) {\n    instance.originalPosition.value = getStyle(document.body, 'position')\n    /**\n     * await dom render when visible is true in init,\n     * because some component's height maybe 0.\n     * e.g. el-table.\n     */\n    await nextTick()\n    for (const property of ['top', 'left']) {\n      const scroll = property === 'top' ? 'scrollTop' : 'scrollLeft'\n      maskStyle[property] = `${\n        (options.target as HTMLElement).getBoundingClientRect()[property] +\n        document.body[scroll] +\n        document.documentElement[scroll] -\n        Number.parseInt(getStyle(document.body, `margin-${property}`), 10)\n      }px`\n    }\n    for (const property of ['height', 'width']) {\n      maskStyle[property] = `${\n        (options.target as HTMLElement).getBoundingClientRect()[property]\n      }px`\n    }\n  } else {\n    instance.originalPosition.value = getStyle(parent, 'position')\n  }\n  for (const [key, value] of Object.entries(maskStyle)) {\n    instance.$el!.style[key] = value\n  }\n}\n\nconst addClassList = (\n  options: LoadingOptions,\n  parent: HTMLElement,\n  instance: LoadingInstance\n) => {\n  // Compatible with the instance data format of vue@3.2.12 and earlier versions #12351\n  const ns =\n    ((instance.vm as any).ns as UseNamespaceReturn) ||\n    (instance.vm as any)._.exposed.ns\n\n  if (\n    !['absolute', 'fixed', 'sticky'].includes(instance.originalPosition.value)\n  ) {\n    addClass(parent, ns.bm('parent', 'relative'))\n  } else {\n    removeClass(parent, ns.bm('parent', 'relative'))\n  }\n  if (options.fullscreen && options.lock) {\n    addClass(parent, ns.bm('parent', 'hidden'))\n  } else {\n    removeClass(parent, ns.bm('parent', 'hidden'))\n  }\n}\n\nLoading._context = null as AppContext | null\nexport default Loading\n"],"mappings":"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"}