element-plus
Version:
A Component Library for Vue3.0
68 lines (61 loc) • 1.36 kB
text/typescript
import type { StrictModifiers } from '@popperjs/core'
interface ModifierProps {
offset?: number
arrow?: HTMLElement
arrowOffset?: number
gpuAcceleration?: boolean
}
export default function buildModifier(props: ModifierProps, externalModifiers: StrictModifiers[] = []) {
const {
arrow,
arrowOffset,
offset,
gpuAcceleration,
} = props
const modifiers: Array<StrictModifiers> = [
{
name: 'offset',
options: {
offset: [0, offset ?? 12],
},
},
{
name: 'preventOverflow',
options: {
padding: {
top: 2,
bottom: 2,
left: 5,
right: 5,
},
},
},
{
name: 'flip',
options: {
padding: 5,
},
},
{
name: 'computeStyles',
options: {
gpuAcceleration,
adaptive: gpuAcceleration,
},
},
// tippyModifier,
]
if (arrow) {
modifiers.push({
name: 'arrow',
options: {
element: arrow,
// the arrow size is an equailateral triangle with 10px side length, the 3rd side length ~ 14.1px
// adding a offset to the ceil of 4.1 should be 5 this resolves the problem of arrow overflowing out of popper.
padding: arrowOffset ?? 5,
},
})
}
modifiers.push(...(externalModifiers))
return modifiers
}