{"version":3,"file":"index.mjs","sources":["../../../components/modal/index.ts"],"sourcesContent":["import { createApp, createVNode, getCurrentInstance, h, nextTick, ref, render, unref } from 'vue'\r\n\r\nimport Component from './modal.vue'\r\nimport { isClient, noop } from '@vexip-ui/utils'\r\n\r\nimport type { App, AppContext, ComponentPublicInstance, MaybeRef } from 'vue'\r\nimport type { ModalProps } from './props'\r\nimport type { ModalCommonSlot } from './symbol'\r\n\r\nexport type ModalOptions = Omit<ModalProps, 'active' | 'transfer' | 'loading' | 'autoRemove'> & {\r\n  /**\r\n   * Specify the app context, ensue the modal using same context\r\n   */\r\n  appContext: AppContext,\r\n  /**\r\n   * Specify whether the modal is loading\r\n   */\r\n  loading: MaybeRef<boolean>,\r\n  /**\r\n   * Another way to use default slot\r\n   */\r\n  renderer: ModalCommonSlot,\r\n  /**\r\n   * Another way to use header slot\r\n   */\r\n  headerRenderer: ModalCommonSlot,\r\n  /**\r\n   * Another way to use title slot\r\n   */\r\n  titleRenderer: ModalCommonSlot,\r\n  /**\r\n   * Another way to use close slot\r\n   */\r\n  closeRenderer: ModalCommonSlot,\r\n  /**\r\n   * Another way to use footer slot\r\n   */\r\n  footerRenderer: ModalCommonSlot,\r\n}\r\n\r\nexport function useModal(options: Partial<ModalOptions> = {}): () => Promise<void> {\r\n  if (!isClient) return noop\r\n\r\n  const {\r\n    appContext,\r\n    loading,\r\n    renderer,\r\n    headerRenderer,\r\n    titleRenderer,\r\n    closeRenderer,\r\n    footerRenderer,\r\n    onHide,\r\n    ...props\r\n  } = options\r\n\r\n  const active = ref(false)\r\n\r\n  let instance = getCurrentInstance()\r\n\r\n  let container: HTMLElement | undefined = document.createElement('div')\r\n  let app: App | undefined\r\n\r\n  if (appContext || instance) {\r\n    const vnode = createVNode(createModal, null, null)\r\n\r\n    vnode.appContext = appContext || instance!.appContext\r\n    render(vnode, container)\r\n  } else {\r\n    app = createApp(createModal)\r\n    app.mount(container)\r\n  }\r\n\r\n  document.body.appendChild(container)\r\n\r\n  // Ensure Modal show transition is effective\r\n  nextTick(() => {\r\n    active.value = true\r\n  })\r\n\r\n  function createModal() {\r\n    return h(\r\n      Component,\r\n      {\r\n        ...props,\r\n        active: active.value,\r\n        transfer: false,\r\n        autoRemove: false,\r\n        loading: unref(loading),\r\n        onHide: Array.isArray(onHide) ? [...onHide, destroy] : onHide ? [onHide, destroy] : destroy,\r\n      },\r\n      {\r\n        header: headerRenderer,\r\n        title: titleRenderer,\r\n        close: closeRenderer,\r\n        default: renderer,\r\n        footer: footerRenderer,\r\n      },\r\n    )\r\n  }\r\n\r\n  function destroy() {\r\n    if (instance) {\r\n      container && render(null, container)\r\n      instance = null\r\n    }\r\n\r\n    if (app) {\r\n      app.unmount()\r\n      app = undefined\r\n    }\r\n\r\n    if (container) {\r\n      document.body.removeChild(container)\r\n      container = undefined\r\n    }\r\n  }\r\n\r\n  return () =>\r\n    nextTick(() => {\r\n      active.value = false\r\n    })\r\n}\r\n\r\nComponent.open = useModal\r\n\r\nconst Modal = Component as typeof Component & { open: typeof useModal }\r\n\r\nexport { Modal }\r\nexport { modalProps } from './props'\r\n\r\nexport type ModalExposed = ComponentPublicInstance & InstanceType<typeof Component>\r\n\r\nexport type { ModalProps, ModalCProps } from './props'\r\nexport type { ModalSlotParams } from './symbol'\r\n"],"names":["useModal","options","isClient","noop","appContext","loading","renderer","headerRenderer","titleRenderer","closeRenderer","footerRenderer","onHide","props","active","ref","instance","getCurrentInstance","container","app","vnode","createVNode","createModal","render","createApp","nextTick","h","Component","unref","destroy","Modal"],"mappings":";;;;;AAwCgB,SAAAA,EAASC,IAAiC,IAAyB;AAC7E,MAAA,CAACC,EAAiB,QAAAC;AAEhB,QAAA;AAAA,IACJ,YAAAC;AAAA,IACA,SAAAC;AAAA,IACA,UAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,eAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,QAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,IACDX,GAEEY,IAASC,EAAI,EAAK;AAExB,MAAIC,IAAWC,EAAmB,GAE9BC,IAAqC,SAAS,cAAc,KAAK,GACjEC;AAEJ,MAAId,KAAcW,GAAU;AAC1B,UAAMI,IAAQC,EAAYC,GAAa,MAAM,IAAI;AAE3C,IAAAF,EAAA,aAAaf,KAAcW,EAAU,YAC3CO,EAAOH,GAAOF,CAAS;AAAA,EAAA;AAEvB,IAAAC,IAAMK,EAAUF,CAAW,GAC3BH,EAAI,MAAMD,CAAS;AAGZ,WAAA,KAAK,YAAYA,CAAS,GAGnCO,EAAS,MAAM;AACb,IAAAX,EAAO,QAAQ;AAAA,EAAA,CAChB;AAED,WAASQ,IAAc;AACd,WAAAI;AAAA,MACLC;AAAAA,MACA;AAAA,QACE,GAAGd;AAAA,QACH,QAAQC,EAAO;AAAA,QACf,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAASc,EAAMtB,CAAO;AAAA,QACtB,QAAQ,MAAM,QAAQM,CAAM,IAAI,CAAC,GAAGA,GAAQiB,CAAO,IAAIjB,IAAS,CAACA,GAAQiB,CAAO,IAAIA;AAAA,MACtF;AAAA,MACA;AAAA,QACE,QAAQrB;AAAA,QACR,OAAOC;AAAA,QACP,OAAOC;AAAA,QACP,SAASH;AAAA,QACT,QAAQI;AAAA,MAAA;AAAA,IAEZ;AAAA,EAAA;AAGF,WAASkB,IAAU;AACjB,IAAIb,MACWE,KAAAK,EAAO,MAAML,CAAS,GACxBF,IAAA,OAGTG,MACFA,EAAI,QAAQ,GACNA,IAAA,SAGJD,MACO,SAAA,KAAK,YAAYA,CAAS,GACvBA,IAAA;AAAA,EACd;AAGK,SAAA,MACLO,EAAS,MAAM;AACb,IAAAX,EAAO,QAAQ;AAAA,EAAA,CAChB;AACL;AAEAa,EAAU,OAAO1B;AAEjB,MAAM6B,IAAQH;"}