30 lines
850 B
TypeScript
30 lines
850 B
TypeScript
export interface FloatingRect {
|
|
left: number;
|
|
right: number;
|
|
top: number;
|
|
bottom: number;
|
|
}
|
|
|
|
export interface FloatingViewport {
|
|
width: number;
|
|
height: number;
|
|
}
|
|
|
|
export function floatingViewportShift(rect: FloatingRect, viewport: FloatingViewport, margin = 8): { x: number; y: number } {
|
|
let x = 0;
|
|
let y = 0;
|
|
|
|
if (rect.left < margin) x = margin - rect.left;
|
|
else if (rect.right > viewport.width - margin) x = viewport.width - margin - rect.right;
|
|
|
|
if (rect.top < margin) y = margin - rect.top;
|
|
else if (rect.bottom > viewport.height - margin) y = viewport.height - margin - rect.bottom;
|
|
|
|
return { x, y };
|
|
}
|
|
|
|
export function floatingArrowOffset(length: number, shift: number, padding = 8): number {
|
|
const maximum = Math.max(padding, length - padding);
|
|
return Math.min(Math.max(padding, length / 2 - shift), maximum);
|
|
}
|