UNPKG

@itwin/itwinui-react

Version:

A react component library for iTwinUI

263 lines (262 loc) 8.55 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); Object.defineProperty(exports, 'Resizer', { enumerable: true, get: function () { return Resizer; }, }); const _interop_require_wildcard = require('@swc/helpers/_/_interop_require_wildcard'); const _react = /*#__PURE__*/ _interop_require_wildcard._(require('react')); const _index = require('../functions/index.js'); const Resizer = (props) => _react.createElement( 'div', { style: { position: 'absolute', inset: -6, display: 'grid', pointerEvents: 'none', }, }, _react.createElement(ResizerStyles, null), _react.createElement(Resizers, props), ); const Resizers = (props) => { let { elementRef, containerRef, onResizeStart, onResizeEnd } = props; let isResizing = _react.useRef(false); let onResizePointerDown = (event) => { if (!elementRef.current || 0 !== event.button) return; let initialPointerX = event.clientX; let initialPointerY = event.clientY; let [initialTranslateX, initialTranslateY] = (0, _index.getTranslateValuesFromElement)(elementRef.current); let { width: initialWidth, height: initialHeight } = elementRef.current.getBoundingClientRect(); let width = `${initialWidth}px`; let height = `${initialHeight}px`; let translateX = initialTranslateX; let translateY = initialTranslateY; let minWidth = parseFloat(getComputedStyle(elementRef.current).minWidth); if (Number.isNaN(minWidth)) minWidth = 380; let minHeight = parseFloat(getComputedStyle(elementRef.current).minHeight); let resizer = event.currentTarget.dataset.iuiResizer; let ownerDocument = elementRef.current.ownerDocument || document; let originalUserSelect = ownerDocument.body.style.userSelect; ownerDocument.body.style.userSelect = 'none'; let onResizePointerMove = (event) => { if (!elementRef.current) return; if (!isResizing.current) { isResizing.current = true; onResizeStart?.(); } let containerRect = containerRef?.current?.getBoundingClientRect(); let clientX = (0, _index.getBoundedValue)( event.clientX, containerRect?.left ?? 0, containerRect?.right ?? ownerDocument.documentElement.clientWidth ?? 0, ); let clientY = (0, _index.getBoundedValue)( event.clientY, containerRect?.top ?? 0, containerRect?.bottom ?? ownerDocument.documentElement.clientHeight ?? 0, ); let diffX = initialPointerX - clientX; let diffY = initialPointerY - clientY; switch (resizer) { case 'top-left': { let newHeight = initialHeight + diffY; if (newHeight >= minHeight) { height = elementRef.current.style.height = `${newHeight}px`; translateY = initialTranslateY - diffY; } let newWidth = initialWidth + diffX; if (newWidth >= minWidth) { width = elementRef.current.style.width = `${newWidth}px`; translateX = initialTranslateX - diffX; } elementRef.current.style.transform = `translate(${translateX}px, ${translateY}px)`; break; } case 'top': { let newHeight = initialHeight + diffY; if (newHeight < minHeight) break; height = elementRef.current.style.height = `${newHeight}px`; translateY = initialTranslateY - diffY; elementRef.current.style.transform = `translate(${translateX}px, ${translateY}px)`; break; } case 'top-right': { let newHeight = initialHeight + diffY; if (newHeight >= minHeight) { height = elementRef.current.style.height = `${newHeight}px`; translateY = initialTranslateY - diffY; } width = elementRef.current.style.width = `${initialWidth - diffX}px`; elementRef.current.style.transform = `translate(${translateX}px, ${translateY}px)`; break; } case 'right': width = elementRef.current.style.width = `${initialWidth - diffX}px`; height = elementRef.current.style.height = `${initialHeight}px`; elementRef.current.style.transform = `translate(${translateX}px, ${translateY}px)`; break; case 'bottom-right': width = elementRef.current.style.width = `${initialWidth - diffX}px`; height = elementRef.current.style.height = `${ initialHeight - diffY }px`; elementRef.current.style.transform = `translate(${translateX}px, ${translateY}px)`; break; case 'bottom': height = elementRef.current.style.height = `${ initialHeight - diffY }px`; elementRef.current.style.transform = `translate(${translateX}px, ${translateY}px)`; break; case 'bottom-left': { let newWidth = initialWidth + diffX; if (newWidth >= minWidth) { width = elementRef.current.style.width = `${newWidth}px`; translateX = initialTranslateX - diffX; } height = elementRef.current.style.height = `${ initialHeight - diffY }px`; elementRef.current.style.transform = `translate(${translateX}px, ${translateY}px)`; break; } case 'left': { let newWidth = initialWidth + diffX; if (newWidth < minWidth) break; width = elementRef.current.style.width = `${newWidth}px`; height = elementRef.current.style.height = `${initialHeight}px`; translateX = initialTranslateX - diffX; elementRef.current.style.transform = `translate(${translateX}px, ${translateY}px)`; break; } default: break; } }; ownerDocument.addEventListener('pointermove', onResizePointerMove); ownerDocument.addEventListener( 'pointerup', () => { ownerDocument.removeEventListener('pointermove', onResizePointerMove); if (elementRef.current) { ownerDocument.body.style.userSelect = originalUserSelect; isResizing.current = false; onResizeEnd?.({ width, height, transform: `translate(${translateX}px, ${translateY}px)`, }); } }, { once: true, }, ); }; return _react.createElement( _react.Fragment, null, _react.createElement('div', { 'data-iui-resizer': 'top-left', onPointerDown: onResizePointerDown, style: { cursor: 'nw-resize', }, }), _react.createElement('div', { 'data-iui-resizer': 'top', onPointerDown: onResizePointerDown, style: { cursor: 'n-resize', }, }), _react.createElement('div', { 'data-iui-resizer': 'top-right', onPointerDown: onResizePointerDown, style: { cursor: 'ne-resize', }, }), _react.createElement('div', { 'data-iui-resizer': 'right', onPointerDown: onResizePointerDown, style: { cursor: 'e-resize', }, }), _react.createElement('div', { 'data-iui-resizer': 'bottom-right', onPointerDown: onResizePointerDown, style: { cursor: 'se-resize', }, }), _react.createElement('div', { 'data-iui-resizer': 'bottom', onPointerDown: onResizePointerDown, style: { cursor: 's-resize', }, }), _react.createElement('div', { 'data-iui-resizer': 'bottom-left', onPointerDown: onResizePointerDown, style: { cursor: 'sw-resize', }, }), _react.createElement('div', { 'data-iui-resizer': 'left', onPointerDown: onResizePointerDown, style: { cursor: 'w-resize', }, }), ); }; const ResizerStyles = _react.memo(() => _react.createElement('style', null, resizerStyles), ); const resizerStyles = ` [data-iui-resizer] { pointer-events: auto; grid-area: 1 / 1 / -1 / -1; width: 12px; height: 12px; z-index: 1; } [data-iui-resizer='top'], [data-iui-resizer='bottom'] { height: 8px; width: auto; z-index: 0; } [data-iui-resizer='left'], [data-iui-resizer='right'] { height: auto; width: 8px; z-index: 0; } [data-iui-resizer^='top'] { align-self: start; } [data-iui-resizer^='bottom'] { align-self: end; } [data-iui-resizer$='left'] { justify-self: start; } [data-iui-resizer$='right'] { justify-self: end; }`;