element-plus
Version:
A Component Library for Vue 3
94 lines (88 loc) • 2.17 kB
text/typescript
import { withDirectives, Transition, vShow, withCtx, h } from 'vue'
import { NOOP } from '@vue/shared'
import { stop } from '@element-plus/utils/dom'
import type { VNode, Ref, CSSProperties } from 'vue'
import type { Effect } from '../use-popper/defaults'
interface IRenderPopperProps {
effect: Effect
name: string
stopPopperMouseEvent: boolean
popperClass: string
popperStyle?: Partial<CSSProperties>
popperId: string
popperRef?: Ref<HTMLElement>
pure?: boolean
visibility: boolean
onMouseenter: () => void
onMouseleave: () => void
onAfterEnter?: () => void
onAfterLeave?: () => void
onBeforeEnter?: () => void
onBeforeLeave?: () => void
}
export default function renderPopper(
props: IRenderPopperProps,
children: VNode[]
) {
const {
effect,
name,
stopPopperMouseEvent,
popperClass,
popperStyle,
popperRef,
pure,
popperId,
visibility,
onMouseenter,
onMouseleave,
onAfterEnter,
onAfterLeave,
onBeforeEnter,
onBeforeLeave,
} = props
const kls = [popperClass, 'el-popper', `is-${effect}`, pure ? 'is-pure' : '']
/**
* Equivalent to
* <transition :name="name">
* <div v-show="visibility" :aria-hidden="!visibility" :class="kls" ref="popperRef" role="tooltip" @mouseenter="" @mouseleave="" @click="">
* <slot />
* </div>
* </transition>
*/
const mouseUpAndDown = stopPopperMouseEvent ? stop : NOOP
return h(
Transition,
{
name,
onAfterEnter,
onAfterLeave,
onBeforeEnter,
onBeforeLeave,
},
{
default: withCtx(() => [
withDirectives(
h(
'div',
{
'aria-hidden': String(!visibility),
class: kls,
style: popperStyle ?? {},
id: popperId,
ref: popperRef ?? 'popperRef',
role: 'tooltip',
onMouseenter,
onMouseleave,
onClick: stop,
onMousedown: mouseUpAndDown,
onMouseup: mouseUpAndDown,
},
children
),
[[vShow, visibility]]
),
]),
}
)
}