in src/anchored-position.ts [339:416]
function calculatePosition(
elementDimensions: Size,
anchorPosition: BoxPosition,
side: AnchorSide,
align: AnchorAlignment,
anchorOffset: number,
alignmentOffset: number
) {
const anchorRight = anchorPosition.left + anchorPosition.width
const anchorBottom = anchorPosition.top + anchorPosition.height
let top = -1
let left = -1
if (side === 'outside-top') {
top = anchorPosition.top - anchorOffset - elementDimensions.height
} else if (side === 'outside-bottom') {
top = anchorBottom + anchorOffset
} else if (side === 'outside-left') {
left = anchorPosition.left - anchorOffset - elementDimensions.width
} else if (side === 'outside-right') {
left = anchorRight + anchorOffset
}
if (side === 'outside-top' || side === 'outside-bottom') {
if (align === 'start') {
left = anchorPosition.left + alignmentOffset
} else if (align === 'center') {
left = anchorPosition.left - (elementDimensions.width - anchorPosition.width) / 2 + alignmentOffset
} else {
// end
left = anchorRight - elementDimensions.width - alignmentOffset
}
}
if (side === 'outside-left' || side === 'outside-right') {
if (align === 'start') {
top = anchorPosition.top + alignmentOffset
} else if (align === 'center') {
top = anchorPosition.top - (elementDimensions.height - anchorPosition.height) / 2 + alignmentOffset
} else {
// end
top = anchorBottom - elementDimensions.height - alignmentOffset
}
}
if (side === 'inside-top') {
top = anchorPosition.top + anchorOffset
} else if (side === 'inside-bottom') {
top = anchorBottom - anchorOffset - elementDimensions.height
} else if (side === 'inside-left') {
left = anchorPosition.left + anchorOffset
} else if (side === 'inside-right') {
left = anchorRight - anchorOffset - elementDimensions.width
} else if (side === 'inside-center') {
left = (anchorRight + anchorPosition.left) / 2 - elementDimensions.width / 2 + anchorOffset
}
if (side === 'inside-top' || side === 'inside-bottom') {
if (align === 'start') {
left = anchorPosition.left + alignmentOffset
} else if (align === 'center') {
left = anchorPosition.left - (elementDimensions.width - anchorPosition.width) / 2 + alignmentOffset
} else {
// end
left = anchorRight - elementDimensions.width - alignmentOffset
}
} else if (side === 'inside-left' || side === 'inside-right' || side === 'inside-center') {
if (align === 'start') {
top = anchorPosition.top + alignmentOffset
} else if (align === 'center') {
top = anchorPosition.top - (elementDimensions.height - anchorPosition.height) / 2 + alignmentOffset
} else {
// end
top = anchorBottom - elementDimensions.height - alignmentOffset
}
}
return {top, left}
}