From bb0b01cabc6526f0885486b4b35c267e4318d4ce Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Thu, 10 Sep 2026 17:40:14 +0200 Subject: [PATCH] fix: center is pure one-shot (no centerLocked); resize no longer snaps to center --- src/main.ts | 17 ++--------------- src/ui.tsx | 2 +- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/main.ts b/src/main.ts index 0be9fa1..30aa9c2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -13,12 +13,6 @@ export default function () { // viewport (через поллинг, т.к. события viewportchange в API нет), иначе // canvas-space-точка "уплывает" на экране при смене зума/пана. let dockedPosition: DockPosition | null = null - - // Флаг "центр удерживает позицию при ресайзе". Центр НЕ док (не поллит за зумом/паном), - // но после one-shot центрирования ручной ресайз пересчитывает позицию и держит окно по - // центру (как раньше нравилось). Сбрасывается при нажатии любой другой dock-кнопки. - let centerLocked = false - // 9 позиций докинга: 4 угла + 4 края + центр. type DockPosition = | 'top-left' | 'top-center' | 'top-right' @@ -222,9 +216,6 @@ export default function () { } if (dockedPosition !== null) { applyDock(dockedPosition, width, height, false) - } else if (centerLocked) { - // Центр: позиция удерживается по центру при ресайзе (но не поллит за зумом/паном). - applyDock('center', width, height, false) } }) @@ -232,7 +223,6 @@ export default function () { // чтобы поллинг не переприжимал и RESIZE_WINDOW не ре-докал. on('UNDOCK', function () { dockedPosition = null - centerLocked = false lastBoundsKey = '' }) @@ -246,14 +236,12 @@ export default function () { // к левому/верхнему краю вместо центра (баг relX=0 на top-center). on('DOCK_WINDOW', function (payload: { position: DockPosition; width: number; height: number }) { const { position } = payload - // Центр — это one-shot: применяем 50% по центру ОДИН раз, НЕ включаем поллинг - // (окно не "приклеено"), но включаем centerLocked — ручной ресайз держит центр. + // Центр — это one-shot: применяем 50% по центру ОДИН раз, окно остаётся в покое + // (НЕ приклеено, НЕ держит центр при ручном ресайзе/перемещении). if (position === 'center') { dockedPosition = null - centerLocked = true } else { // Остальные позиции — удерживаем прижатым (поллинг пересчитывает при зуме/пане). - centerLocked = false dockedPosition = position lastBoundsKey = '' // форсируем пересчёт на ближайшем тике } @@ -290,7 +278,6 @@ export default function () { figma.ui.resize(size.width, size.height) // Выходим из дока: чистый клик = телепорт в угол без удержания. dockedPosition = null - centerLocked = false lastBoundsKey = '' lastSize = { width: size.width, height: size.height } // Прижимаем в угол от реального размера (computeDock для угла не меняет размер). diff --git a/src/ui.tsx b/src/ui.tsx index 5be9608..74a13b2 100644 --- a/src/ui.tsx +++ b/src/ui.tsx @@ -102,7 +102,7 @@ function Plugin () { emit('RESIZE_WINDOW', { width: w, height: h }) // If resize pulled the window out of dock — stop holding dock state (so polling // does not re-pin and RESIZE_WINDOW does not re-dock). A normal (non-dock) resize - // holds centerLocked/dock itself via applyDock in main. + // holds the dock state itself via applyDock in main. if (exitingDockRef.current) { exitingDockRef.current = false dockedPosRef.current = null