import { setFrameSize, state } from '../store'; type Mode = 'r' | 'b' | 'rb'; // Drag handles on the right / bottom / corner of the frame to resize it (top-left anchored), // which re-fires the page's media queries inside the iframe. Positioned in viewport space. export default function ResizeHandles() { const startDrag = (e: PointerEvent, mode: Mode): void => { e.preventDefault(); e.stopPropagation(); const startX = e.clientX; const startY = e.clientY; const startW = state.frameWidth; const startH = state.frameHeight; const move = (ev: PointerEvent): void => { const dw = (ev.clientX - startX) / state.zoom; const dh = (ev.clientY - startY) / state.zoom; setFrameSize(mode === 'b' ? startW : startW + dw, mode === 'r' ? startH : startH + dh); }; const up = (): void => { window.removeEventListener('pointermove', move, true); window.removeEventListener('pointerup', up, true); }; window.addEventListener('pointermove', move, true); window.addEventListener('pointerup', up, true); }; const right = state.panX + state.frameWidth * state.zoom; const bottom = state.panY + state.frameHeight * state.zoom; const midX = state.panX + (state.frameWidth * state.zoom) / 2; const midY = state.panY + (state.frameHeight * state.zoom) / 2; return (
startDrag(e, 'r')} />
startDrag(e, 'b')} />
startDrag(e, 'rb')} />
); }