fix: dock position uses real (post-clamp) window size, not requested canon

This commit is contained in:
Hermes Agent committed 2026-09-10 13:40:34 +02:00
1 parent 6901c5e0cd
commit 6624805449
2 files changed
+41 -11

No files matched your search

+24 -8
View File
@@ -213,21 +213,37 @@ export default function () {
})
// Эмуляция докинга: растянуть окно на зону и прижать к её краю (9 позиций).
// Двухэтапно, чтобы позиция считалась от РЕАЛЬНОГО размера, который Figma
// фактически отрисовала (она клампит resize до своего лимита при видимом UI).
// 1) DOCK_WINDOW: resize(канон) — попытка растяжения + запоминаем режим. reposition НЕ делаем.
// 2) UI через 2 кадра шлёт DOCK_REFINE с реальным размером (window.innerWidth/Height
// после клампа Figma) -> applyDock(..., false) только reposition от реального размера.
// Без этого этапа окно позиционировалось бы от запрошенного канона (906) и прижималось
// к левому/верхнему краю вместо центра (баг relX=0 на top-center).
on('DOCK_WINDOW', function (payload: { position: DockPosition; width: number; height: number }) {
const { position, width, height } = payload
const { position } = payload
// Центр — это one-shot: применяем 50% по центру ОДИН раз, НЕ включаем поллинг
// (окно не "приклеено"), но включаем centerLocked — ручной ресайз держит центр.
if (position === 'center') {
dockedPosition = null
centerLocked = true
applyDock('center', width, height, true)
return
} else {
// Остальные позиции — удерживаем прижатым (поллинг пересчитывает при зуме/пане).
centerLocked = false
dockedPosition = position
lastBoundsKey = '' // форсируем пересчёт на ближайшем тике
}
// Остальные позиции — удерживаем прижатым (поллинг пересчитывает при зуме/пане).
centerLocked = false
dockedPosition = position
lastBoundsKey = '' // форсируем пересчёт на ближайшем тике
applyDock(position, width, height, true)
// Попытка растяжения до канона (Figma клампит до лимита при видимом UI).
const state = computeDock(position, payload.width, payload.height, true)
figma.ui.resize(state.width, state.height)
lastSize = { width: clampWindowSize(state).width, height: clampWindowSize(state).height }
// reposition откладываем на DOCK_REFINE (UI пришлёт реальный размер после клампа).
})
// Точная прижимка от РЕАЛЬНОГО размера окна (после клампа Figma).
on('DOCK_REFINE', function (payload: { position: DockPosition; width: number; height: number }) {
const { position, width, height } = payload
applyDock(position, width, height, false)
})
// Останавливаем поллинг при закрытии плагина, чтобы не висел в памяти.