From e916d1f2a620b4c7d36c016cd81d3d2726b8b49a Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Thu, 10 Sep 2026 16:46:28 +0200 Subject: [PATCH] fix: corner in dock only resizes on real drag, clean click = exit to corner --- src/ui.tsx | 55 ++++++++++++++++++++---------------------------------- 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/src/ui.tsx b/src/ui.tsx index 84046f2..a265bf2 100644 --- a/src/ui.tsx +++ b/src/ui.tsx @@ -130,47 +130,32 @@ function Plugin () { const startX = e.clientX const startY = e.clientY let started = false + const isCorner = isCornerPos(dockPos) + const docked = dockedPosRef.current !== null + // Угол в доке: drag = single-axis ресайз сжатой оси (выход из дока). Обычный/не-док — просто ресайз. + const fixed = (isCorner && docked) ? (window.innerHeight <= 324 ? 'y' : 'x') : 'none' function move (ev: PointerEvent) { - if (!started) { - const dx = ev.clientX - startX - const dy = ev.clientY - startY - if (Math.sqrt(dx * dx + dy * dy) < CLICK_THRESHOLD) return - started = true - startResize(ev, dir, 'none') - // Считаем ресайз от исходной точки (до порога), а не от текущей (>порога). - resizeRef.current.startX = startX - resizeRef.current.startY = startY - } + if (started) return + const dx = ev.clientX - startX + const dy = ev.clientY - startY + if (Math.sqrt(dx * dx + dy * dy) < CLICK_THRESHOLD) return + started = true + exitingDockRef.current = isCorner && docked + startResize(ev, dir, fixed) + // Считаем ресайз от исходной точки (до порога), а не от текущей (>порога). + resizeRef.current.startX = startX + resizeRef.current.startY = startY // Дальше drag ведёт глобальный onPointerMove (resizeRef.active уже true). } function up () { window.removeEventListener('pointermove', move) window.removeEventListener('pointerup', up) - if (started) onPointerUpResize() - else { - // Чистый клик — поведение зависит от позиции ручки и состояния дока. - if (isCornerPos(dockPos)) { - if (dockedPosRef.current !== null) { - // Окно в доке у края: клик по смежному углу = single-axis ресайз сжатой оси. - // Сжатая ось: верх/низ-док (h сжата) → фикс Y (меняем ширину); - // лево/право-док (w сжата) → фикс X (меняем высоту). - const fixedAxis = window.innerHeight <= 320 + 4 ? 'y' : 'x' - exitingDockRef.current = true - startResize(e, dir, fixedAxis) // active=true + emit RESIZE_START (старт от точки клика) - // Финализатор на СЛЕДУЮЩИЙ pointerup (live-ресайз ведёт глобальный onPointerMove). - const finish = function () { - window.removeEventListener('pointerup', finish) - onPointerUpResize() - } - window.addEventListener('pointerup', finish) - return - } - // Не в доке: телепорт в угол. - dockWindow(dockPos) - } else { - // Краевая ручка: телепорт в край. - dockWindow(dockPos) - } + if (started) { + onPointerUpResize() + } else { + // Чистый клик — телепорт в позицию (угол или край). Для угла dockWindow очищает + // dock-флаг, т.е. клик по углу в доке = выход в угол без ресайза (не "висит" в ресайзе). + dockWindow(dockPos) } } window.addEventListener('pointermove', move)