@hello-pangea/dnd
Version:
Beautiful and accessible drag and drop for lists with React
50 lines (42 loc) • 1.34 kB
text/typescript
import { getRect } from 'css-box-model';
import type { Rect, Position } from 'css-box-model';
import type { Viewport } from '../../types';
import { origin } from '../../state/position';
import getWindowScroll from './get-window-scroll';
import getMaxWindowScroll from './get-max-window-scroll';
import getDocumentElement from '../get-document-element';
export default (): Viewport => {
const scroll: Position = getWindowScroll();
const maxScroll: Position = getMaxWindowScroll();
const top: number = scroll.y;
const left: number = scroll.x;
// window.innerHeight: includes scrollbars (not what we want)
// document.clientHeight gives us the correct value when using the html5 doctype
const doc: HTMLElement = getDocumentElement();
// Using these values as they do not consider scrollbars
// padding box, without scrollbar
const width: number = doc.clientWidth;
const height: number = doc.clientHeight;
// Computed
const right: number = left + width;
const bottom: number = top + height;
const frame: Rect = getRect({
top,
left,
right,
bottom,
});
const viewport: Viewport = {
frame,
scroll: {
initial: scroll,
current: scroll,
max: maxScroll,
diff: {
value: origin,
displacement: origin,
},
},
};
return viewport;
};