From 7adbc11247f295378104286c04e71acbf39b2090 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Thu, 10 Sep 2026 16:01:42 +0200 Subject: [PATCH] simplify: dock detection via flag (dockedPosRef), drop size-based isEdgeDocked --- src/ui.tsx | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/ui.tsx b/src/ui.tsx index 475061b..84046f2 100644 --- a/src/ui.tsx +++ b/src/ui.tsx @@ -56,8 +56,6 @@ function Plugin () { const dockedPosRef = useRef(null) // Флаг: ресайз выводит окно из дока (на отпускании не ре-докать, очистить dock-состояние). const exitingDockRef = useRef(false) - // Та же величина, что DOCK_EDGE_SIZE в main.ts — признак "сжатая ось дока". - const DOCK_EDGE = 320 const [windowInfo, setWindowInfo] = useState<{ x: number; y: number; width: number; height: number zoom: number @@ -117,20 +115,14 @@ function Plugin () { // - смещение курсора > CLICK_THRESHOLD px → ресайз (startResize + live drag через глобальный onPointerMove) // - иначе (чистый клик) → зависит от позиции: // * угол (top-left/right, bottom-left/right): - // - окно НЕ в доке у края → телепорт в угол (dockWindow) - // - окно В ДОКЕ у края (одна ось сжата до DOCK_EDGE) → старт single-axis live-ресайза - // сжатой оси (окно "выезжает" в угол, выход из дока), dir = угол, fixedAxis = сжатая ось + // - окно НЕ в доке у края (dockedPosRef == null) → телепорт в угол (dockWindow) + // - окно В ДОКЕ у края → старт single-axis live-ресайза сжатой оси + // (окно "выезжает" в угол, выход из дока), dir = угол, fixedAxis = сжатая ось // * край (top/bottom-center, center-left/right) → телепорт в край (dockWindow) // Центр НЕ входит в периметр — только кнопкой. const CLICK_THRESHOLD = 4 const isCornerPos = (p: DockPosition) => p === 'top-left' || p === 'top-right' || p === 'bottom-left' || p === 'bottom-right' - // Окно "в доке у края" = одна ось сжата до DOCK_EDGE, другая существенно больше. - function isEdgeDocked () { - const w = window.innerWidth - const h = window.innerHeight - return (w <= DOCK_EDGE + 4 && h > DOCK_EDGE + 4) || (h <= DOCK_EDGE + 4 && w > DOCK_EDGE + 4) - } function onHandleDown (e: PointerEvent, dir: string, dockPos: DockPosition) { e.preventDefault() @@ -158,11 +150,11 @@ function Plugin () { else { // Чистый клик — поведение зависит от позиции ручки и состояния дока. if (isCornerPos(dockPos)) { - if (isEdgeDocked()) { + if (dockedPosRef.current !== null) { // Окно в доке у края: клик по смежному углу = single-axis ресайз сжатой оси. // Сжатая ось: верх/низ-док (h сжата) → фикс Y (меняем ширину); // лево/право-док (w сжата) → фикс X (меняем высоту). - const fixedAxis = window.innerHeight <= DOCK_EDGE + 4 ? 'y' : 'x' + const fixedAxis = window.innerHeight <= 320 + 4 ? 'y' : 'x' exitingDockRef.current = true startResize(e, dir, fixedAxis) // active=true + emit RESIZE_START (старт от точки клика) // Финализатор на СЛЕДУЮЩИЙ pointerup (live-ресайз ведёт глобальный onPointerMove).