65 lines
1.3 KiB
TypeScript
65 lines
1.3 KiB
TypeScript
|
export function determinePosition(
|
||
|
canvasRect: DOMRect,
|
||
|
relativeX: number,
|
||
|
relativeY: number
|
||
|
): {
|
||
|
top: number | "auto";
|
||
|
left: number | "auto";
|
||
|
right: number | "auto";
|
||
|
bottom: number | "auto";
|
||
|
} {
|
||
|
// Calculate the midpoints of the canvas
|
||
|
const centerX = canvasRect.width / 2;
|
||
|
const centerY = canvasRect.height / 2;
|
||
|
|
||
|
// Initialize position with default values
|
||
|
let position: {
|
||
|
top: number | "auto";
|
||
|
left: number | "auto";
|
||
|
right: number | "auto";
|
||
|
bottom: number | "auto";
|
||
|
};
|
||
|
|
||
|
if (relativeY < centerY) {
|
||
|
// Top half
|
||
|
if (relativeX < centerX) {
|
||
|
// Left side
|
||
|
position = {
|
||
|
top: relativeY,
|
||
|
left: relativeX,
|
||
|
right: "auto",
|
||
|
bottom: "auto",
|
||
|
};
|
||
|
} else {
|
||
|
// Right side
|
||
|
position = {
|
||
|
top: relativeY,
|
||
|
right: canvasRect.width - relativeX,
|
||
|
left: "auto",
|
||
|
bottom: "auto",
|
||
|
};
|
||
|
}
|
||
|
} else {
|
||
|
// Bottom half
|
||
|
if (relativeX < centerX) {
|
||
|
// Left side
|
||
|
position = {
|
||
|
bottom: canvasRect.height - relativeY,
|
||
|
left: relativeX,
|
||
|
right: "auto",
|
||
|
top: "auto",
|
||
|
};
|
||
|
} else {
|
||
|
// Right side
|
||
|
position = {
|
||
|
bottom: canvasRect.height - relativeY,
|
||
|
right: canvasRect.width - relativeX,
|
||
|
left: "auto",
|
||
|
top: "auto",
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return position;
|
||
|
}
|