@extclp/vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 5.15 kB
Source Map (JSON)
{"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;"}