mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-10-01 01:36:00 -04:00
58 lines
1.7 KiB
JavaScript
58 lines
1.7 KiB
JavaScript
import crel from "crelt";
|
|
|
|
/**
|
|
* Render grab handles at the corners of the given element.
|
|
* @param {Element} elem
|
|
* @return {Element[]}
|
|
*/
|
|
export function renderHandlesAtCorners(elem) {
|
|
const handles = [];
|
|
const baseClass = 'ProseMirror-grabhandle';
|
|
|
|
for (let i = 0; i < 4; i++) {
|
|
const y = (i < 2) ? 'top' : 'bottom';
|
|
const x = (i === 0 || i === 3) ? 'left' : 'right';
|
|
const handle = crel('div', {
|
|
class: `${baseClass} ${baseClass}-${x}-${y}`,
|
|
});
|
|
handle.dataset.y = y;
|
|
handle.dataset.x = x;
|
|
handles.push(handle);
|
|
elem.parentNode.appendChild(handle);
|
|
}
|
|
|
|
positionHandlesAtCorners(elem, handles);
|
|
return handles;
|
|
}
|
|
|
|
/**
|
|
* @param {Element[]} handles
|
|
*/
|
|
export function removeHandles(handles) {
|
|
for (const handle of handles) {
|
|
handle.remove();
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {Element} element
|
|
* @param {[Element, Element, Element, Element]}handles
|
|
*/
|
|
export function positionHandlesAtCorners(element, handles) {
|
|
const bounds = element.getBoundingClientRect();
|
|
const parentBounds = element.parentElement.getBoundingClientRect();
|
|
const positions = [
|
|
{x: bounds.left - parentBounds.left, y: bounds.top - parentBounds.top},
|
|
{x: bounds.right - parentBounds.left, y: bounds.top - parentBounds.top},
|
|
{x: bounds.right - parentBounds.left, y: bounds.bottom - parentBounds.top},
|
|
{x: bounds.left - parentBounds.left, y: bounds.bottom - parentBounds.top},
|
|
];
|
|
|
|
for (let i = 0; i < 4; i++) {
|
|
const {x, y} = positions[i];
|
|
const handle = handles[i];
|
|
handle.style.left = (x - 6) + 'px';
|
|
handle.style.top = (y - 6) + 'px';
|
|
}
|
|
} |