fix: center is pure one-shot (no centerLocked); resize no longer snaps to center

This commit is contained in:
Hermes Agent committed 2026-09-10 17:40:14 +02:00
1 parent 153ff2ae27
commit bb0b01cabc
2 files changed
+3 -16

No files matched your search

+2 -15
View File
@@ -13,12 +13,6 @@ export default function () {
// viewport (через поллинг, т.к. события viewportchange в API нет), иначе // viewport (через поллинг, т.к. события viewportchange в API нет), иначе
// canvas-space-точка "уплывает" на экране при смене зума/пана. // canvas-space-точка "уплывает" на экране при смене зума/пана.
let dockedPosition: DockPosition | null = null let dockedPosition: DockPosition | null = null
// Флаг "центр удерживает позицию при ресайзе". Центр НЕ док (не поллит за зумом/паном),
// но после one-shot центрирования ручной ресайз пересчитывает позицию и держит окно по
// центру (как раньше нравилось). Сбрасывается при нажатии любой другой dock-кнопки.
let centerLocked = false
// 9 позиций докинга: 4 угла + 4 края + центр. // 9 позиций докинга: 4 угла + 4 края + центр.
type DockPosition = type DockPosition =
| 'top-left' | 'top-center' | 'top-right' | 'top-left' | 'top-center' | 'top-right'
@@ -222,9 +216,6 @@ export default function () {
} }
if (dockedPosition !== null) { if (dockedPosition !== null) {
applyDock(dockedPosition, width, height, false) applyDock(dockedPosition, width, height, false)
} else if (centerLocked) {
// Центр: позиция удерживается по центру при ресайзе (но не поллит за зумом/паном).
applyDock('center', width, height, false)
} }
}) })
@@ -232,7 +223,6 @@ export default function () {
// чтобы поллинг не переприжимал и RESIZE_WINDOW не ре-докал. // чтобы поллинг не переприжимал и RESIZE_WINDOW не ре-докал.
on('UNDOCK', function () { on('UNDOCK', function () {
dockedPosition = null dockedPosition = null
centerLocked = false
lastBoundsKey = '' lastBoundsKey = ''
}) })
@@ -246,14 +236,12 @@ export default function () {
// к левому/верхнему краю вместо центра (баг relX=0 на top-center). // к левому/верхнему краю вместо центра (баг relX=0 на top-center).
on('DOCK_WINDOW', function (payload: { position: DockPosition; width: number; height: number }) { on('DOCK_WINDOW', function (payload: { position: DockPosition; width: number; height: number }) {
const { position } = payload const { position } = payload
// Центр — это one-shot: применяем 50% по центру ОДИН раз, НЕ включаем поллинг // Центр — это one-shot: применяем 50% по центру ОДИН раз, окно остаётся в покое
// (окно не "приклеено"), но включаем centerLocked — ручной ресайз держит центр. // (НЕ приклеено, НЕ держит центр при ручном ресайзе/перемещении).
if (position === 'center') { if (position === 'center') {
dockedPosition = null dockedPosition = null
centerLocked = true
} else { } else {
// Остальные позиции — удерживаем прижатым (поллинг пересчитывает при зуме/пане). // Остальные позиции — удерживаем прижатым (поллинг пересчитывает при зуме/пане).
centerLocked = false
dockedPosition = position dockedPosition = position
lastBoundsKey = '' // форсируем пересчёт на ближайшем тике lastBoundsKey = '' // форсируем пересчёт на ближайшем тике
} }
@@ -290,7 +278,6 @@ export default function () {
figma.ui.resize(size.width, size.height) figma.ui.resize(size.width, size.height)
// Выходим из дока: чистый клик = телепорт в угол без удержания. // Выходим из дока: чистый клик = телепорт в угол без удержания.
dockedPosition = null dockedPosition = null
centerLocked = false
lastBoundsKey = '' lastBoundsKey = ''
lastSize = { width: size.width, height: size.height } lastSize = { width: size.width, height: size.height }
// Прижимаем в угол от реального размера (computeDock для угла не меняет размер). // Прижимаем в угол от реального размера (computeDock для угла не меняет размер).
+1 -1
View File
@@ -102,7 +102,7 @@ function Plugin () {
emit('RESIZE_WINDOW', { width: w, height: h }) emit('RESIZE_WINDOW', { width: w, height: h })
// If resize pulled the window out of dock — stop holding dock state (so polling // 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 // 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) { if (exitingDockRef.current) {
exitingDockRef.current = false exitingDockRef.current = false
dockedPosRef.current = null dockedPosRef.current = null