{"version":3,"file":"loading.mjs","sources":["../../../../../src/components/ivue-loading/loading.ts"],"sourcesContent":["import { nextTick } from 'vue';\r\nimport { isString } from '@vue/shared';\r\n\r\nimport { getStyle, addClass, removeClass } from '../../utils/assist';\r\nimport {\r\n  createLoadingComponent,\r\n  LoadingInstance,\r\n} from './createLoadingComponent';\r\nimport { useZIndex } from '../../utils/helpers';\r\nimport isServer from '../../utils/isServer';\r\n\r\n// ts\r\nimport type { CSSProperties } from 'vue';\r\nimport type { LoadingOptions, LoadingOptionsResolved } from './types/loading';\r\n\r\n// 全屏展示实例\r\nlet fullscreenInstance: LoadingInstance | undefined = undefined;\r\n\r\n// 添加样式\r\nconst addStyle = async (\r\n  options: LoadingOptionsResolved,\r\n  parent: HTMLElement,\r\n  instance: LoadingInstance\r\n) => {\r\n  const { nextZIndex } = useZIndex();\r\n\r\n  // css\r\n  const maskStyle: CSSProperties = {};\r\n\r\n  // 开启全屏\r\n  if (options.fullscreen) {\r\n    // 定位\r\n    instance.originalPosition.value = getStyle(document.body, 'position');\r\n    // 隐藏\r\n    instance.originalOverflow.value = getStyle(document.body, 'overflow');\r\n    // zIndex\r\n    maskStyle.zIndex = nextZIndex();\r\n  }\r\n  // 渲染 body\r\n  else if (options.parent === document.body) {\r\n    instance.originalPosition.value = getStyle(document.body, 'position');\r\n\r\n    /**\r\n     * await dom render when visible is true in init,\r\n     * because some component's height maybe 0.\r\n     * e.g. table.\r\n     */\r\n    await nextTick();\r\n\r\n    // 偏移位置\r\n    for (const property of ['top', 'left']) {\r\n      const scroll = property === 'top' ? 'scrollTop' : 'scrollLeft';\r\n\r\n      const position =\r\n        // 元素相对于视窗 top/left\r\n        (options.target as HTMLElement).getBoundingClientRect()[property] +\r\n        // 滚动条位置 scrollTop/scrollLeft\r\n        document.body[scroll] +\r\n        // 滚动条位置 scrollTop/scrollLeft\r\n        document.documentElement[scroll] -\r\n        // body margin\r\n        Number.parseInt(getStyle(document.body, `margin-${property}`), 10);\r\n\r\n      // 偏移位置\r\n      maskStyle[property] = `${position}px`;\r\n    }\r\n\r\n    // 设置高度\r\n    for (const property of ['height', 'width']) {\r\n      // 元素高度/width\r\n      maskStyle[property] = `${\r\n        (options.target as HTMLElement).getBoundingClientRect()[property]\r\n      }px`;\r\n    }\r\n  }\r\n  // 设置定位\r\n  else {\r\n    instance.originalPosition.value = getStyle(parent, 'position');\r\n  }\r\n\r\n  // 设置样式\r\n  for (const [key, value] of Object.entries(maskStyle)) {\r\n    instance.$el.style[key] = value;\r\n  }\r\n};\r\n\r\n// 添加 class\r\nconst addClassList = (\r\n  options: LoadingOptionsResolved,\r\n  parent: HTMLElement,\r\n  instance: LoadingInstance\r\n) => {\r\n  // 没有定位\r\n  if (\r\n    instance.originalPosition.value !== 'absolute' &&\r\n    instance.originalPosition.value !== 'fixed'\r\n  ) {\r\n    addClass(parent, 'ivue-loading-parent--relative');\r\n  }\r\n  // 删除相对定位\r\n  else {\r\n    removeClass(parent, 'ivue-loading-parent--relative');\r\n  }\r\n\r\n  // 全屏 锁定屏幕的滚动 lock\r\n  if (options.fullscreen && options.lock) {\r\n    addClass(parent, 'ivue-loading-parent--hidden');\r\n  }\r\n  // 删除隐藏\r\n  else {\r\n    removeClass(parent, 'ivue-loading-parent--hidden');\r\n  }\r\n};\r\n\r\n// 获取选项\r\nconst resolveOptions = (options: LoadingOptions): LoadingOptionsResolved => {\r\n  let target: HTMLElement;\r\n\r\n  // 获取 document.body\r\n  if (isString(options.target)) {\r\n    target =\r\n      document.querySelector<HTMLElement>(options.target) ?? document.body;\r\n  }\r\n  // 获取 options.target || document.body\r\n  else {\r\n    target = options.target || document.body;\r\n  }\r\n\r\n  return {\r\n    parent: target === document.body || options.body ? document.body : target,\r\n    // 遮罩背景色\r\n    background: options.background || '',\r\n    // 显示在加载图标下方的加载文案\r\n    text: options.text || '',\r\n    // 全屏遮罩\r\n    fullscreen: target === document.body && (options.fullscreen ?? true),\r\n    // 锁定屏幕的滚动\r\n    lock: options.lock ?? false,\r\n    // Loading 的自定义类名\r\n    customClass: options.customClass || '',\r\n    // 显示/隐藏\r\n    visible: options.visible ?? true,\r\n    // 自定义加载图标类名\r\n    iconClass: options.iconClass,\r\n    // 自定义加载图标内容\r\n    iconText: options.iconText,\r\n    // 获取当前 target\r\n    target,\r\n    // 自定义旋转图标\r\n    loadingSpinner: options.loadingSpinner,\r\n  };\r\n};\r\n\r\n// loading\r\nconst Loading = function (options: LoadingOptions = {}): LoadingInstance {\r\n  if (isServer) {\r\n    return undefined;\r\n  }\r\n\r\n  // 获取选项\r\n  const resolved = resolveOptions(options);\r\n\r\n  // 有全屏\r\n  if (resolved.fullscreen && fullscreenInstance) {\r\n    return fullscreenInstance;\r\n  }\r\n\r\n  // 创建组件实例\r\n  const instance = createLoadingComponent({\r\n    ...resolved,\r\n    close: () => {\r\n      // 外部掉用的关闭\r\n      resolved.close?.();\r\n\r\n      // 销毁全屏实例\r\n      if (resolved.fullscreen) {\r\n        fullscreenInstance = undefined;\r\n      }\r\n    },\r\n  });\r\n\r\n  // 添加样式\r\n  addStyle(resolved, resolved.parent, instance);\r\n  // 添加 class\r\n  addClassList(resolved, resolved.parent, instance);\r\n\r\n  // 父级加载样式\r\n  resolved.parent.LoadingAddClassList = () =>\r\n    addClassList(resolved, resolved.parent, instance);\r\n\r\n  /**\r\n   * add loading-number to parent.\r\n   * because if a fullscreen loading is triggered when somewhere\r\n   * a v-loading.body was triggered before and it's parent is\r\n   * document.body which with a margin , the fullscreen loading's\r\n   * destroySelf function will remove 'ivue-loading-parent--relative',\r\n   * and then the position of v-loading.body will be error.\r\n   */\r\n  let loadingNumber: string = resolved.parent.getAttribute('loading-number');\r\n\r\n  if (!loadingNumber) {\r\n    loadingNumber = '1';\r\n  } else {\r\n    loadingNumber = `${Number.parseInt(loadingNumber) + 1}`;\r\n  }\r\n\r\n  resolved.parent.setAttribute('loading-number', loadingNumber);\r\n\r\n  // 添加子节点\r\n  resolved.parent.appendChild(instance.$el);\r\n\r\n  // 在实例渲染之后，然后修改可见以触发过渡\r\n  nextTick(() => (instance.visible.value = resolved.visible));\r\n\r\n  // 开启了全屏\r\n  if (resolved.fullscreen) {\r\n    fullscreenInstance = instance;\r\n  }\r\n\r\n  // 返回实例\r\n  return instance;\r\n};\r\n\r\nexport default Loading;\r\n"],"names":[],"mappings":"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"}