(async () => { const uiResizer = document.getElementById('resizer'); const uiLeftColumn = uiResizer.previousElementSibling; const uiRightColumn = uiResizer.nextElementSibling; const uiParent = uiResizer.parentElement; let isResizing = false; let abortSignal = null; function onMouseMove(e) { // we resize the columns by applying felx: to the columns // compute the percentage the mouse is in the parent const percentage = (e.clientX - uiParent.offsetLeft) / uiParent.clientWidth; // clamp the percentage between 0.1 and 0.9 const clampedPercentage = Math.max(0.1, Math.min(0.9, percentage)); // set the flex property of the columns uiLeftColumn.style.flex = `${clampedPercentage}`; uiRightColumn.style.flex = `${1 - clampedPercentage}`; } function onMouseUp(e) { // restore user selection document.body.style.userSelect = ''; // remove the mousemove and mouseup events if (abortSignal) { abortSignal.abort(); abortSignal = null; } } uiResizer.addEventListener('mousedown', e => { e.preventDefault(); isResizing = true; // prevent text selection document.body.style.userSelect = 'none'; // register the mousemove and mouseup events abortSignal = new AbortController(); document.addEventListener('mousemove', onMouseMove, { signal: abortSignal.signal }); document.addEventListener('mouseup', onMouseUp, { signal: abortSignal.signal }); }); })();