{"version":3,"file":"index.mjs","names":[],"sources":["../../../../../packages/hooks/use-lockscreen/index.ts"],"sourcesContent":["import { computed, isRef, onScopeDispose, watch } from 'vue'\nimport {\n  addClass,\n  getScrollBarWidth,\n  getStyle,\n  hasClass,\n  removeClass,\n  throwError,\n} from '@element-plus/utils'\nimport { useNamespace } from '../use-namespace'\n\nimport type { Ref } from 'vue'\nimport type { UseNamespaceReturn } from '../use-namespace'\n\nexport type UseLockScreenOptions = {\n  ns?: UseNamespaceReturn\n  // shouldLock?: MaybeRef<boolean>\n}\n\n/**\n * Hook that monitoring the ref value to lock or unlock the screen.\n * When the trigger became true, it assumes modal is now opened and vice versa.\n * @param trigger {Ref<boolean>}\n */\nexport const useLockscreen = (\n  trigger: Ref<boolean>,\n  options: UseLockScreenOptions = {}\n) => {\n  if (!isRef(trigger)) {\n    throwError(\n      '[useLockscreen]',\n      'You need to pass a ref param to this function'\n    )\n  }\n\n  const ns = options.ns || useNamespace('popup')\n\n  const hiddenCls = computed(() => ns.bm('parent', 'hidden'))\n\n  let scrollBarWidth = 0\n  let withoutHiddenClass = false\n  let bodyWidth = '0'\n  let cleaned = false\n\n  const cleanup = () => {\n    if (cleaned) return\n\n    cleaned = true\n    setTimeout(() => {\n      // When the test case is running, the context environment simulated by jsdom may have been destroyed,\n      // and the document does not exist at this time.\n      if (typeof document === 'undefined') return\n      if (withoutHiddenClass && document) {\n        document.body.style.width = bodyWidth\n        removeClass(document.body, hiddenCls.value)\n      }\n    }, 200)\n  }\n  watch(trigger, (val) => {\n    if (!val) {\n      cleanup()\n      return\n    }\n\n    cleaned = false\n    withoutHiddenClass = !hasClass(document.body, hiddenCls.value)\n    if (withoutHiddenClass) {\n      bodyWidth = document.body.style.width\n      addClass(document.body, hiddenCls.value)\n    }\n    scrollBarWidth = getScrollBarWidth(ns.namespace.value)\n    const bodyHasOverflow =\n      document.documentElement.clientHeight < document.body.scrollHeight\n    const bodyOverflowY = getStyle(document.body, 'overflowY')\n    if (\n      scrollBarWidth > 0 &&\n      (bodyHasOverflow || bodyOverflowY === 'scroll') &&\n      withoutHiddenClass\n    ) {\n      document.body.style.width = `calc(100% - ${scrollBarWidth}px)`\n    }\n  })\n  onScopeDispose(() => cleanup())\n}\n"],"mappings":";;;;;;;;;;;;AAwBA,MAAa,iBACX,SACA,UAAgC,EAAE,KAC/B;AACH,KAAI,CAAC,MAAM,QAAQ,CACjB,YACE,mBACA,gDACD;CAGH,MAAM,KAAK,QAAQ,MAAM,aAAa,QAAQ;CAE9C,MAAM,YAAY,eAAe,GAAG,GAAG,UAAU,SAAS,CAAC;CAE3D,IAAI,iBAAiB;CACrB,IAAI,qBAAqB;CACzB,IAAI,YAAY;CAChB,IAAI,UAAU;CAEd,MAAM,gBAAgB;AACpB,MAAI,QAAS;AAEb,YAAU;AACV,mBAAiB;AAGf,OAAI,OAAO,aAAa,YAAa;AACrC,OAAI,sBAAsB,UAAU;AAClC,aAAS,KAAK,MAAM,QAAQ;AAC5B,gBAAY,SAAS,MAAM,UAAU,MAAM;;KAE5C,IAAI;;AAET,OAAM,UAAU,QAAQ;AACtB,MAAI,CAAC,KAAK;AACR,YAAS;AACT;;AAGF,YAAU;AACV,uBAAqB,CAAC,SAAS,SAAS,MAAM,UAAU,MAAM;AAC9D,MAAI,oBAAoB;AACtB,eAAY,SAAS,KAAK,MAAM;AAChC,YAAS,SAAS,MAAM,UAAU,MAAM;;AAE1C,mBAAiB,kBAAkB,GAAG,UAAU,MAAM;EACtD,MAAM,kBACJ,SAAS,gBAAgB,eAAe,SAAS,KAAK;EACxD,MAAM,gBAAgB,SAAS,SAAS,MAAM,YAAY;AAC1D,MACE,iBAAiB,MAChB,mBAAmB,kBAAkB,aACtC,mBAEA,UAAS,KAAK,MAAM,QAAQ,eAAe,eAAe;GAE5D;AACF,sBAAqB,SAAS,CAAC"}