react-native-tooltip-2
Version:
Customizable, easy to use tooltip for React Native
210 lines • 9.62 kB
JavaScript
import { Placement } from "./Tooltip.type";
class Point {
x;
y;
constructor(x, y) {
this.x = x;
this.y = y;
}
}
class Size {
width;
height;
constructor(width, height) {
this.width = width;
this.height = height;
}
}
class Rect {
x;
y;
width;
height;
constructor(x, y, width, height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
}
const swapSizeDimensions = (size) => new Size(size.height, size.width);
const makeChildlessRect = (params) => {
const { displayInsets, windowDims, placement } = params;
switch (placement) {
case Placement.BOTTOM:
return new Rect(windowDims.width / 2, displayInsets.top, 1, 1);
case Placement.RIGHT:
return new Rect(displayInsets.left, windowDims.height / 2, 1, 1);
case Placement.LEFT:
return new Rect(windowDims.width - displayInsets.right, windowDims.height / 2, 1, 1);
case Placement.TOP: // fall through
default:
return new Rect(windowDims.width / 2, windowDims.height - displayInsets.bottom, 1, 1);
}
};
const computeCenterGeometry = (params) => {
const { childRect, contentSize, displayInsets, windowDims } = params;
const maxWidth = windowDims.width - (displayInsets.left + displayInsets.right);
const maxHeight = windowDims.height - (displayInsets.top + displayInsets.bottom);
const adjustedContentSize = new Size(contentSize.width >= maxWidth ? maxWidth : -1, contentSize.height >= maxHeight ? maxHeight : -1);
const tooltipOrigin = new Point(adjustedContentSize.width === -1
? (maxWidth - contentSize.width) / 2 + displayInsets.left
: displayInsets.left, adjustedContentSize.height === -1
? (maxHeight - contentSize.height) / 2 + displayInsets.top
: displayInsets.top);
const anchorPoint = new Point(childRect.x + childRect.width / 2.0, childRect.y);
return {
tooltipOrigin,
anchorPoint,
placement: "center",
adjustedContentSize,
};
};
const computeTopGeometry = (params) => {
const { childRect, contentSize, arrowSize, displayInsets, windowDims, childContentSpacing, } = params;
const maxWidth = windowDims.width - (displayInsets.left + displayInsets.right);
const adjustedContentSize = new Size(Math.min(maxWidth, contentSize.width), contentSize.height);
const tooltipOrigin = new Point(contentSize.width >= maxWidth
? displayInsets.left
: Math.max(displayInsets.left, childRect.x + (childRect.width - adjustedContentSize.width) / 2), Math.max(displayInsets.top - childContentSpacing, childRect.y - contentSize.height - arrowSize.height - childContentSpacing));
const anchorPoint = new Point(childRect.x + childRect.width / 2.0, childRect.y - childContentSpacing);
// Make sure arrow does not extend beyond displayInsets
if (anchorPoint.x + arrowSize.width >
windowDims.width - displayInsets.right) {
anchorPoint.x =
windowDims.width -
displayInsets.right -
Math.abs(arrowSize.width - arrowSize.height) -
8;
}
else if (anchorPoint.x - arrowSize.width < displayInsets.left) {
anchorPoint.x =
displayInsets.left + Math.abs(arrowSize.width - arrowSize.height) + 8;
}
const topPlacementBottomBound = anchorPoint.y - arrowSize.height;
if (tooltipOrigin.y + contentSize.height > topPlacementBottomBound) {
adjustedContentSize.height = topPlacementBottomBound - tooltipOrigin.y;
}
if (tooltipOrigin.x + contentSize.width > maxWidth) {
tooltipOrigin.x =
windowDims.width - displayInsets.right - adjustedContentSize.width;
}
return {
tooltipOrigin,
anchorPoint,
placement: "top",
adjustedContentSize,
};
};
const computeBottomGeometry = (params) => {
const { childRect, contentSize, arrowSize, displayInsets, windowDims, childContentSpacing, } = params;
const maxWidth = windowDims.width - (displayInsets.left + displayInsets.right);
const adjustedContentSize = new Size(Math.min(maxWidth, contentSize.width), contentSize.height);
const tooltipOrigin = new Point(contentSize.width >= maxWidth
? displayInsets.left
: Math.max(displayInsets.left, childRect.x + (childRect.width - adjustedContentSize.width) / 2), Math.min(windowDims.height - displayInsets.bottom + childContentSpacing, childRect.y + childRect.height + arrowSize.height + childContentSpacing));
const anchorPoint = new Point(childRect.x + childRect.width / 2.0, childRect.y + childRect.height + childContentSpacing);
// make sure arrow does not extend beyond displayInsets
if (anchorPoint.x + arrowSize.width >
windowDims.width - displayInsets.right) {
anchorPoint.x =
windowDims.width -
displayInsets.right -
Math.abs(arrowSize.width - arrowSize.height) -
8;
}
else if (anchorPoint.x - arrowSize.width < displayInsets.left) {
anchorPoint.x =
displayInsets.left + Math.abs(arrowSize.width - arrowSize.height) + 8;
}
if (tooltipOrigin.y + contentSize.height >
windowDims.height - displayInsets.bottom) {
adjustedContentSize.height =
windowDims.height - displayInsets.bottom - tooltipOrigin.y;
}
if (tooltipOrigin.x + contentSize.width > maxWidth) {
tooltipOrigin.x =
windowDims.width - displayInsets.right - adjustedContentSize.width;
}
return {
tooltipOrigin,
anchorPoint,
placement: "bottom",
adjustedContentSize,
};
};
const computeLeftGeometry = (params) => {
const { childRect, contentSize, arrowSize, displayInsets, windowDims, childContentSpacing, } = params;
const maxHeight = windowDims.height - (displayInsets.top + displayInsets.bottom);
const adjustedContentSize = new Size(contentSize.width, Math.min(maxHeight, contentSize.height));
const tooltipOrigin = new Point(Math.max(displayInsets.left - childContentSpacing, childRect.x - contentSize.width - arrowSize.width - childContentSpacing), contentSize.height >= maxHeight
? displayInsets.top
: Math.max(displayInsets.top, childRect.y + (childRect.height - adjustedContentSize.height) / 2));
const anchorPoint = new Point(childRect.x - childContentSpacing, childRect.y + childRect.height / 2.0);
// make sure arrow does not extend beyond displayInsets
if (anchorPoint.y + arrowSize.width >
windowDims.height - displayInsets.bottom) {
anchorPoint.y =
windowDims.height -
displayInsets.bottom -
Math.abs(arrowSize.height - arrowSize.width) -
8;
}
else if (anchorPoint.y - arrowSize.height < displayInsets.top) {
anchorPoint.y =
displayInsets.top + Math.abs(arrowSize.height - arrowSize.width) + 8;
}
const leftPlacementRightBound = anchorPoint.x - arrowSize.width;
if (tooltipOrigin.x + contentSize.width > leftPlacementRightBound) {
adjustedContentSize.width = leftPlacementRightBound - tooltipOrigin.x;
}
if (tooltipOrigin.y + contentSize.height > maxHeight) {
tooltipOrigin.y =
windowDims.height - displayInsets.bottom - adjustedContentSize.height;
}
return {
tooltipOrigin,
anchorPoint,
placement: "left",
adjustedContentSize,
};
};
const computeRightGeometry = (params) => {
const { childRect, contentSize, arrowSize, displayInsets, windowDims, childContentSpacing, } = params;
const maxHeight = windowDims.height - (displayInsets.top + displayInsets.bottom);
const adjustedContentSize = new Size(contentSize.width, Math.min(maxHeight, contentSize.height));
const tooltipOrigin = new Point(Math.min(windowDims.width - displayInsets.right + childContentSpacing, childRect.x + childRect.width + arrowSize.width + childContentSpacing), contentSize.height >= maxHeight
? displayInsets.top
: Math.max(displayInsets.top, childRect.y + (childRect.height - adjustedContentSize.height) / 2));
const anchorPoint = new Point(childRect.x + childRect.width + childContentSpacing, childRect.y + childRect.height / 2.0);
// make sure arrow does not extend beyond displayInsets
if (anchorPoint.y + arrowSize.width >
windowDims.height - displayInsets.bottom) {
anchorPoint.y =
windowDims.height -
displayInsets.bottom -
Math.abs(arrowSize.height - arrowSize.width) -
8;
}
else if (anchorPoint.y - arrowSize.height < displayInsets.top) {
anchorPoint.y =
displayInsets.top + Math.abs(arrowSize.height - arrowSize.width) + 8;
}
if (tooltipOrigin.x + contentSize.width >
windowDims.width - displayInsets.right) {
adjustedContentSize.width =
windowDims.width - displayInsets.right - tooltipOrigin.x;
}
if (tooltipOrigin.y + contentSize.height > maxHeight) {
tooltipOrigin.y =
windowDims.height - displayInsets.bottom - adjustedContentSize.height;
}
return {
tooltipOrigin,
anchorPoint,
placement: "right",
adjustedContentSize,
};
};
export { Point, Size, Rect, swapSizeDimensions, makeChildlessRect, computeCenterGeometry, computeTopGeometry, computeBottomGeometry, computeLeftGeometry, computeRightGeometry, };
//# sourceMappingURL=geometry.js.map