{"version":3,"file":"dialog.vue.mjs","sources":["../../../../../../packages/components/dialog/src/dialog.vue"],"sourcesContent":["<script lang=\"ts\">\n  import { computed, defineComponent, onBeforeUnmount, reactive, ref, watch } from 'vue'\n  import type { StyleValue } from 'vue'\n  import { getComponentNamespace, getNamespace } from '../../../utils/global-config'\n  import { addUnit } from '../../../shared/utils'\n  import { isFunction, isPromise } from '../../../utils/is'\n  import usePopupManager from '../../../hooks/use-popup-manager'\n  import { useOverflow } from '../../../hooks/use-overflow'\n  import { KEYBOARD_KEY } from '../../../utils/keyboard'\n  import { getElement, off, on } from '../../../utils/dom'\n  import { dialogProps } from './props'\n\n  const styleProps = ['width', 'minWidth', 'height', 'minHeight'] as const\n  type StyleProps = (typeof styleProps)[number]\n\n  export default defineComponent({\n    name: getComponentNamespace('Dialog'),\n    inheritAttrs: false,\n    props: dialogProps,\n    emits: ['closed', 'close', 'open', 'opened', 'update:modelValue'],\n    setup(props, { emit }) {\n      const ns = getNamespace('dialog')\n      const messageBoxNs = getNamespace('message-box')\n      const cls = computed(() => [\n        ns,\n        props.messageBox && 'is-message-box',\n        props.popupClass && props.popupClass\n      ])\n\n      const teleportContainer = computed(() => getElement(props.renderTo))\n      const dialogRef = ref<HTMLElement>()\n      const teleportDisabled = computed(() => props.disabled || !teleportContainer.value)\n\n      const dialogStyle = computed(() => {\n        const style: StyleValue = {\n          zIndex: zIndex.value\n        }\n        return style\n      })\n\n      const containerStyle = computed(() => {\n        const style: StyleValue = {}\n        if (props.fullscreen) {\n          return style\n        }\n        if (!props.center && props.top) {\n          style.top = addUnit(props.top)\n        }\n        styleProps.forEach((key: StyleProps) => {\n          if (props[key]) {\n            style[key] = addUnit(props[key])\n          }\n        })\n        return style\n      })\n\n      const animation = ref(false)\n      const modelVisible = computed(() => props.modelValue)\n      const mergeVisible = computed(() => modelVisible.value || animation.value)\n\n      const { zIndex, isLastDialog } = usePopupManager('dialog', {\n        visible: modelVisible\n      })\n\n      const { setOverflowHidden, resetOverflow } = useOverflow(teleportContainer, dialogRef)\n\n      const emitToClose = (action: 'cancel' | 'ok', e?: Event) => {\n        emit('update:modelValue', false)\n        emit('close', props.messageBox ? action : undefined, props.messageBox ? e : undefined)\n      }\n\n      // 动画执行完后触发关闭\n      const afterLeave = () => {\n        animation.value = false\n        resetOverflow()\n        emit('closed')\n      }\n\n      // 动画加载后触发打开\n      const afterEnter = () => {\n        // 隐藏滚动条\n        emit('opened')\n      }\n\n      const loadingObj = reactive({\n        ok: false,\n        cancel: false\n      })\n\n      // 关闭拦截\n      const interceptClose = (action: 'cancel' | 'ok', e?: Event) => {\n        let result = true\n        loadingObj[action] = true\n        if (isFunction(props.onBeforeCancel)) {\n          result = props.onBeforeCancel(action) ?? false\n        }\n        if (isPromise(result)) {\n          result.then((res) => {\n            loadingObj[action] = false\n            res && emitToClose(action, e)\n          })\n          return\n        }\n        loadingObj[action] = false\n        result && emitToClose(action, e)\n      }\n\n      // 点击遮罩层\n      const handleMaskClick = () => {\n        if (!props.maskToClose) return\n        if (!props.mask) return\n        interceptClose('cancel')\n      }\n\n      // footer按钮内部控制\n      const handleCancel = (e: Event) => {\n        interceptClose('cancel', e)\n      }\n      const handleOk = (e: Event) => {\n        interceptClose('ok', e)\n      }\n\n      let globalKeyDownListener = false\n\n      const handleGlobalKeyDown = (ev: KeyboardEvent) => {\n        if (props.escToClose && ev.key === KEYBOARD_KEY.ESC && isLastDialog()) {\n          interceptClose('cancel')\n        }\n      }\n\n      const addGlobalKeyDownListener = () => {\n        if (props.escToClose && !globalKeyDownListener) {\n          globalKeyDownListener = true\n          on(document.documentElement, 'keydown', handleGlobalKeyDown)\n        }\n      }\n\n      const removeGlobalKeyDownListener = () => {\n        globalKeyDownListener = false\n        off(document.documentElement, 'keydown', handleGlobalKeyDown)\n      }\n\n      // 页面意外关闭\n      onBeforeUnmount(() => {\n        resetOverflow()\n        removeGlobalKeyDownListener()\n      })\n\n      watch(\n        () => modelVisible.value,\n        (val) => {\n          if (val) {\n            emit('open')\n            setOverflowHidden()\n            animation.value = true\n            addGlobalKeyDownListener()\n          } else {\n            removeGlobalKeyDownListener()\n          }\n        },\n        { immediate: true }\n      )\n\n      return {\n        cls,\n        ns,\n        messageBoxNs,\n        containerStyle,\n        dialogStyle,\n        dialogRef,\n        teleportContainer,\n        teleportDisabled,\n        modelVisible,\n        mergeVisible,\n        interceptClose,\n        afterLeave,\n        afterEnter,\n        handleMaskClick,\n        handleCancel,\n        handleOk,\n        loadingObj\n      }\n    }\n  })\n</script>\n\n<template>\n  <teleport :to=\"teleportContainer\" :disabled=\"teleportDisabled\">\n    <div\n      v-show=\"mergeVisible\"\n      v-if=\"!destroyOnClosed || mergeVisible\"\n      ref=\"dialogRef\"\n      :class=\"cls\"\n      :style=\"dialogStyle\"\n    >\n      <transition name=\"bn-fade-in-standard\" appear>\n        <div v-if=\"mask\" v-show=\"modelVisible\" :class=\"[`${ns}__mask`]\"></div>\n      </transition>\n      <div :class=\"[`${ns}__wrapper`, { 'is-center': center }]\" @click.self=\"handleMaskClick\">\n        <transition name=\"bn-zoom-in\" appear @after-enter=\"afterEnter\" @after-leave=\"afterLeave\">\n          <div\n            v-show=\"modelVisible\"\n            :class=\"[`${ns}__container`, { 'is-fullscreen': fullscreen }]\"\n            :style=\"containerStyle\"\n          >\n            <div\n              :class=\"[\n                `${messageBox ? messageBoxNs : ns}__header`,\n                showHeaderBottomLine && `is-bottom-line`\n              ]\"\n            >\n              <slot name=\"title\">\n                <div :class=\"[`${ns}__header-title`]\">\n                  {{ title }}\n                </div>\n              </slot>\n            </div>\n            <div :class=\"[`${messageBox ? messageBoxNs : ns}__body`]\">\n              <slot></slot>\n            </div>\n            <div :class=\"[`${messageBox ? messageBoxNs : ns}__footer`]\">\n              <slot\n                name=\"footer\"\n                :cancel=\"handleCancel\"\n                :ok=\"handleOk\"\n                :loading-obj=\"loadingObj\"\n              ></slot>\n            </div>\n\n            <span\n              v-if=\"showClose\"\n              :class=\"[`${ns}__close-icon`]\"\n              @click=\"interceptClose('cancel')\"\n            ></span>\n          </div>\n        </transition>\n      </div>\n    </div>\n  </teleport>\n</template>\n"],"names":["teleportContainer","_openBlock","_createBlock","_Teleport","destroyOnClosed","_createElementBlock","_normalizeClass","_normalizeStyle","_createVNode","_Transition","ns","modelVisible","_withModifiers","_withCtx","_withDirectives","_createElementVNode","containerStyle","messageBoxNs","showHeaderBottomLine","_renderSlot","title","handleOk","loadingObj","showClose","mergeVisible"],"mappings":"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"}