UNPKG

element-plus

Version:

A Component Library for Vue 3

265 lines (260 loc) 7.42 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vue = require('vue'); var shared = require('@vue/shared'); var core = require('@popperjs/core'); require('../../directives/index.js'); var util = require('../../utils/util.js'); var vnode = require('../../utils/vnode.js'); var dom = require('../../utils/dom.js'); var popupManager = require('../../utils/popup-manager.js'); var error = require('../../utils/error.js'); var index = require('../use-teleport/index.js'); var index$2 = require('../use-timeout/index.js'); var index$1 = require('../use-model-toggle/index.js'); var index$3 = require('../use-transition-fallthrough/index.js'); var usePopperOptions = require('./use-popper-options.js'); var useTargetEvents = require('./use-target-events.js'); var index$4 = require('../../directives/click-outside/index.js'); const DARK_EFFECT = "dark"; const LIGHT_EFFECT = "light"; const usePopperControlProps = { appendToBody: { type: Boolean, default: true }, arrowOffset: { type: Number }, popperOptions: usePopperOptions.defaultPopperOptions, popperClass: { type: String, default: "" } }; const usePopperProps = { ...usePopperControlProps, autoClose: { type: Number, default: 0 }, content: { type: String, default: "" }, class: String, style: Object, hideAfter: { type: Number, default: 200 }, disabled: { type: Boolean, default: false }, effect: { type: String, default: DARK_EFFECT }, enterable: { type: Boolean, default: true }, manualMode: { type: Boolean, default: false }, showAfter: { type: Number, default: 0 }, pure: { type: Boolean, default: false }, showArrow: { type: Boolean, default: true }, transition: { type: String, default: "el-fade-in-linear" }, trigger: { type: [String, Array], default: useTargetEvents.DEFAULT_TRIGGER }, visible: { type: Boolean, default: void 0 }, stopPopperMouseEvent: { type: Boolean, default: true } }; const usePopperHook = () => { var _a; const vm = vue.getCurrentInstance(); const props = (_a = vm.proxy) == null ? void 0 : _a.$props; const { slots } = vm; const arrowRef = vue.ref(null); const triggerRef = vue.ref(null); const popperRef = vue.ref(null); const popperStyle = vue.ref({ zIndex: popupManager["default"].nextZIndex() }); const visible = vue.ref(false); const isManual = vue.computed(() => props.manualMode || props.trigger === "manual"); const popperId = `el-popper-${util.generateId()}`; let popperInstance = null; const { renderTeleport, showTeleport, hideTeleport } = index["default"](popupRenderer, vue.toRef(props, "appendToBody")); const { show, hide } = index$1.useModelToggle({ indicator: visible, onShow, onHide }); const { registerTimeout, cancelTimeout } = index$2["default"](); function onShow() { popperStyle.value.zIndex = popupManager["default"].nextZIndex(); vue.nextTick(initializePopper); } function onHide() { hideTeleport(); vue.nextTick(detachPopper); } function delayShow() { if (isManual.value || props.disabled) return; showTeleport(); registerTimeout(show, props.showAfter); } function delayHide() { if (isManual.value) return; registerTimeout(hide, props.hideAfter); } function onToggle() { if (visible.value) { delayShow(); } else { delayHide(); } } function detachPopper() { var _a2; (_a2 = popperInstance == null ? void 0 : popperInstance.destroy) == null ? void 0 : _a2.call(popperInstance); popperInstance = null; } function onPopperMouseEnter() { if (props.enterable && props.trigger !== "click") { cancelTimeout(); } } function onPopperMouseLeave() { const { trigger } = props; const shouldPrevent = shared.isString(trigger) && (trigger === "click" || trigger === "focus") || trigger.length === 1 && (trigger[0] === "click" || trigger[0] === "focus"); if (shouldPrevent) return; delayHide(); } function initializePopper() { if (!visible.value || popperInstance !== null) { return; } const unwrappedTrigger = triggerRef.value; const $el = util.isHTMLElement(unwrappedTrigger) ? unwrappedTrigger : unwrappedTrigger.$el; popperInstance = core.createPopper($el, popperRef.value, buildPopperOptions()); popperInstance.update(); } function buildPopperOptions() { const modifiers = [...usePopperOptions.defaultModifiers, ...props.popperOptions.modifiers]; if (props.showArrow) { modifiers.push({ name: "arrow", options: { padding: props.arrowOffset || 5, element: arrowRef.value } }); } return { ...props.popperOptions, modifiers }; } const { onAfterEnter, onAfterLeave, onBeforeEnter, onBeforeLeave } = index$3.useTransitionFallthrough(); const events = useTargetEvents.useTargetEvents(delayShow, delayHide, onToggle); const arrowRefAttacher = util.refAttacher(arrowRef); const popperRefAttacher = util.refAttacher(popperRef); const triggerRefAttacher = util.refAttacher(triggerRef); function popupRenderer() { const mouseUpAndDown = props.stopPopperMouseEvent ? dom.stop : shared.NOOP; return vue.h(vue.Transition, { name: props.transition, onAfterEnter, onAfterLeave, onBeforeEnter, onBeforeLeave }, { default: () => () => visible.value ? vue.h("div", { "aria-hidden": false, class: [ props.popperClass, "el-popper", `is-${props.effect}`, props.pure ? "is-pure" : "" ], style: popperStyle.value, id: popperId, ref: popperRefAttacher, role: "tooltip", onMouseenter: onPopperMouseEnter, onMouseleave: onPopperMouseLeave, onClick: dom.stop, onMousedown: mouseUpAndDown, onMouseup: mouseUpAndDown }, [ vue.renderSlot(slots, "default", {}, () => [ vue.toDisplayString(props.content) ]), arrowRenderer() ]) : null }); } function arrowRenderer() { return props.showArrow ? vue.h("div", { ref: arrowRefAttacher, class: "el-popper__arrow", "data-popper-arrow": "" }, null) : null; } function triggerRenderer(triggerProps) { var _a2; const trigger = (_a2 = slots.trigger) == null ? void 0 : _a2.call(slots); const firstElement = vnode.getFirstValidNode(trigger, 1); if (!firstElement) error.throwError("renderTrigger", "trigger expects single rooted node"); return vue.cloneVNode(firstElement, triggerProps, true); } function render() { const trigger = triggerRenderer({ "aria-describedby": popperId, class: props.class, style: props.style, ref: triggerRefAttacher, ...events }); return vue.h(vue.Fragment, null, [ isManual.value ? trigger : vue.withDirectives(trigger, [[index$4["default"], delayHide]]), renderTeleport() ]); } return { render }; }; exports.DARK_EFFECT = DARK_EFFECT; exports.LIGHT_EFFECT = LIGHT_EFFECT; exports.usePopperControlProps = usePopperControlProps; exports.usePopperHook = usePopperHook; exports.usePopperProps = usePopperProps; //# sourceMappingURL=index.js.map