fix: measure real window size via iframe innerWidth, not requested lastSize (fix gap tautology)

This commit is contained in:
Hermes Agent committed 2026-09-09 16:23:12 +02:00
1 parent b2ae4c44d6
commit 0d61580acb
2 files changed
+15 -5

No files matched your search

+9 -4
View File
@@ -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))
+6 -1
View File
@@ -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 + расчёт) в буфер обмена как текст.