From 0d61580acbe1b2912f272fe93293d4d6a6236b14 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Wed, 9 Sep 2026 16:23:12 +0200 Subject: [PATCH] fix: measure real window size via iframe innerWidth, not requested lastSize (fix gap tautology) --- src/main.ts | 13 +++++++++---- src/ui.tsx | 7 ++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main.ts b/src/main.ts index 1de7e9d..54a284e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -95,7 +95,11 @@ export default function () { // UI запрашивает текущие x/y (canvas-space) и размеры окна для отладочного вывода, // а также производные данные, вычислимые из figma.viewport. - on('GET_WINDOW_INFO', function () { + // ВАЖНО: размер окна берём из РЕАЛЬНОГО iframe (payload.width/height = window.innerWidth/innerHeight), + // а не из lastSize (это лишь ЗАПРОШЕННЫЙ размер). Figma может клампнуть resize до своего + // внутреннего максимума, и тогда lastSize ≠ реальному окну. Если считать gaps по lastSize, + // получаем тавтологию (w==bounds.width → gap==0 всегда), а не измерение. + on('GET_WINDOW_INFO', function (payload?: { width?: number; height?: number }) { let x = 0 let y = 0 try { @@ -109,8 +113,10 @@ export default function () { const zoom = figma.viewport.zoom || 1 const b = figma.viewport.bounds - const w = lastSize.width - const h = lastSize.height + // Реальный размер окна: из iframe (payload) либо lastSize как fallback. + const w = Math.max(1, Math.round(payload != null && payload.width != null ? payload.width : lastSize.width)) + const h = Math.max(1, Math.round(payload != null && payload.height != null ? payload.height : lastSize.height)) + lastSize = { width: w, height: h } // Размер окна в ЭКРАННЫХ пикселях (w/h) переводим в canvas-units через zoom, // чтобы корректно вычитать из canvas-ширины bounds при любом зуме. const wCanvas = w / zoom @@ -126,7 +132,6 @@ export default function () { const cy = Math.round(y + hCanvas / 2) // Максимальный размер окна (экранные px) = весь видимый viewport (bounds * zoom). - // Используется кнопкой "развернуть" в UI и как верхняя граница drag-ресайза. const maxViewport = { width: Math.max(320, Math.round(b.width * zoom)), height: Math.max(200, Math.round(b.height * zoom)) diff --git a/src/ui.tsx b/src/ui.tsx index ccc630e..2aecbc1 100644 --- a/src/ui.tsx +++ b/src/ui.tsx @@ -90,8 +90,13 @@ function Plugin () { }, []) // Запрашиваем свежие данные об окне у main (после любого действия/старта). + // Передаём РЕАЛЬНЫЙ размер iframe (window.innerWidth/innerHeight) — это то, что + // Figma реально отрисовала, а не запрошенный lastSize. Иначе gaps будут тавтологией. function refreshInfo () { - emit('GET_WINDOW_INFO') + emit('GET_WINDOW_INFO', { + width: window.innerWidth, + height: window.innerHeight + }) } // Копирует все debug-значения (RAW + расчёт) в буфер обмена как текст.