@kgdata/forcegraph
Version:
forcegraph
62 lines (48 loc) • 1.39 kB
text/typescript
import type { MutableRefObject } from 'react';
export type BasicTarget<T = HTMLElement> =
| (() => T | null)
| T
| null
| MutableRefObject<T | null | undefined>;
export type TargetElement = HTMLElement | Element;
export type Target = BasicTarget<HTMLElement>;
export function getTargetElement(
target?: BasicTarget<TargetElement>,
defaultElement?: TargetElement,
): TargetElement | undefined | null {
if (!target) {
return defaultElement;
}
let targetElement: TargetElement | undefined | null;
if (typeof target === 'function') {
targetElement = target();
} else if ('current' in target) {
targetElement = target.current;
} else {
targetElement = target;
}
return targetElement;
}
export const computeHeight = (node: TargetElement) => {
const totalHeight = parseInt(getComputedStyle(node).height, 10);
const padding =
parseInt(getComputedStyle(node).paddingTop, 10) +
parseInt(getComputedStyle(node).paddingBottom, 10);
return totalHeight - padding;
};
export const getAutoHeight = (n: TargetElement) => {
if (!n) {
return 0;
}
let node = n;
let height = computeHeight(node);
while (!height) {
node = node.parentNode as TargetElement;
if (node) {
height = computeHeight(node);
} else {
break;
}
}
return height;
};