@hello-pangea/dnd
Version:
Beautiful and accessible drag and drop for lists with React
40 lines (35 loc) • 1.05 kB
text/typescript
import { calculateBox, withScroll } from 'css-box-model';
import type { BoxModel, Position } from 'css-box-model';
import type {
DraggableDescriptor,
DraggableDimension,
Placeholder,
} from '../../types';
import { origin } from '../../state/position';
export default function getDimension(
descriptor: DraggableDescriptor,
el: HTMLElement,
windowScroll: Position = origin,
): DraggableDimension {
const computedStyles: CSSStyleDeclaration = window.getComputedStyle(el);
const borderBox: ClientRect = el.getBoundingClientRect();
const client: BoxModel = calculateBox(borderBox, computedStyles);
const page: BoxModel = withScroll(client, windowScroll);
const placeholder: Placeholder = {
client,
tagName: el.tagName.toLowerCase(),
display: computedStyles.display,
};
const displaceBy: Position = {
x: client.marginBox.width,
y: client.marginBox.height,
};
const dimension: DraggableDimension = {
descriptor,
placeholder,
displaceBy,
client,
page,
};
return dimension;
}