fix: corner in dock only resizes on real drag, clean click = exit to corner

This commit is contained in:
Hermes Agent committed 2026-09-10 16:46:28 +02:00
1 parent 7adbc11247
commit e916d1f2a6
1 file changed
+20 -35
+20 -35
View File
@@ -130,47 +130,32 @@ function Plugin () {
const startX = e.clientX const startX = e.clientX
const startY = e.clientY const startY = e.clientY
let started = false 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) { function move (ev: PointerEvent) {
if (!started) { if (started) return
const dx = ev.clientX - startX const dx = ev.clientX - startX
const dy = ev.clientY - startY const dy = ev.clientY - startY
if (Math.sqrt(dx * dx + dy * dy) < CLICK_THRESHOLD) return if (Math.sqrt(dx * dx + dy * dy) < CLICK_THRESHOLD) return
started = true started = true
startResize(ev, dir, 'none') exitingDockRef.current = isCorner && docked
// Считаем ресайз от исходной точки (до порога), а не от текущей (>порога). startResize(ev, dir, fixed)
resizeRef.current.startX = startX // Считаем ресайз от исходной точки (до порога), а не от текущей (>порога).
resizeRef.current.startY = startY resizeRef.current.startX = startX
} resizeRef.current.startY = startY
// Дальше drag ведёт глобальный onPointerMove (resizeRef.active уже true). // Дальше drag ведёт глобальный onPointerMove (resizeRef.active уже true).
} }
function up () { function up () {
window.removeEventListener('pointermove', move) window.removeEventListener('pointermove', move)
window.removeEventListener('pointerup', up) window.removeEventListener('pointerup', up)
if (started) onPointerUpResize() if (started) {
else { onPointerUpResize()
// Чистый клик — поведение зависит от позиции ручки и состояния дока. } else {
if (isCornerPos(dockPos)) { // Чистый клик — телепорт в позицию (угол или край). Для угла dockWindow очищает
if (dockedPosRef.current !== null) { // dock-флаг, т.е. клик по углу в доке = выход в угол без ресайза (не "висит" в ресайзе).
// Окно в доке у края: клик по смежному углу = single-axis ресайз сжатой оси. dockWindow(dockPos)
// Сжатая ось: верх/низ-док (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)
}
} }
} }
window.addEventListener('pointermove', move) window.addEventListener('pointermove', move)