From 4228357a3511ac98638b0fcdcd48afde489cdfe5 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Wed, 9 Sep 2026 15:50:34 +0200 Subject: [PATCH] fix: convert window px size to canvas-units (w/zoom) for dock + gap/center math --- src/main.ts | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/main.ts b/src/main.ts index 7baa7d4..36bb9f8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -15,17 +15,22 @@ export default function () { let dockedPosition: 'left' | 'right' | 'center' | null = null // Прижать окно к краю видимой области canvas (bounds) в canvas-space. - // reposition() интерпретирует x/y как canvas-space, поэтому окно визуально - // остаётся у края ЭКРАНА только пока мы пересчитываем его при изменении viewport. + // ВАЖНО: reposition()/getPosition() и bounds — в canvas-space (единицы документа), + // а figma.ui.resize(width,height) — в ЭКРАННЫХ пикселях. Размер окна в canvas-units = + // width / zoom. Без этого деления при zoom≠100% окно прижимается с ошибкой + // (px-размер вычитается из canvas-ширины → уезжает пропорционально 1/zoom). function applyDock (position: 'left' | 'right' | 'center', width: number, height: number) { const b = figma.viewport.bounds + const zoom = figma.viewport.zoom || 1 + const wCanvas = width / zoom + const hCanvas = height / zoom let x = b.x let y = b.y if (position === 'right') { - x = b.x + b.width - width + x = b.x + b.width - wCanvas } else if (position === 'center') { - x = b.x + (b.width - width) / 2 - y = b.y + (b.height - height) / 2 + x = b.x + (b.width - wCanvas) / 2 + y = b.y + (b.height - hCanvas) / 2 } figma.ui.reposition(x, y) } @@ -86,19 +91,23 @@ export default function () { // getPosition может быть недоступен в некоторых версиях — оставляем 0 } - const zoom = figma.viewport.zoom + const zoom = figma.viewport.zoom || 1 const b = figma.viewport.bounds const w = lastSize.width const h = lastSize.height + // Размер окна в ЭКРАННЫХ пикселях (w/h) переводим в canvas-units через zoom, + // чтобы корректно вычитать из canvas-ширины bounds при любом зуме. + const wCanvas = w / zoom + const hCanvas = h / zoom // Геометрия окна плагина относительно видимой области canvas (bounds). // gapL/gapR/gapT/gapB — отступы окна от левого/правого/верхнего/нижнего края canvas. const gapL = Math.round(x - b.x) const gapT = Math.round(y - b.y) - const gapR = Math.round(b.x + b.width - (x + w)) - const gapB = Math.round(b.y + b.height - (y + h)) - const cx = Math.round(x + w / 2) - const cy = Math.round(y + h / 2) + const gapR = Math.round(b.x + b.width - (x + wCanvas)) + const gapB = Math.round(b.y + b.height - (y + hCanvas)) + const cx = Math.round(x + wCanvas / 2) + const cy = Math.round(y + hCanvas / 2) emit('WINDOW_INFO', { x,