fix: measure real window size via iframe innerWidth, not requested lastSize (fix gap tautology)
This commit is contained in:
1 parent
b2ae4c44d6
commit
0d61580acb
2 files changed
+15
-5
No files matched your search
+9
-4
@@ -95,7 +95,11 @@ export default function () {
|
|||||||
|
|
||||||
// UI запрашивает текущие x/y (canvas-space) и размеры окна для отладочного вывода,
|
// UI запрашивает текущие x/y (canvas-space) и размеры окна для отладочного вывода,
|
||||||
// а также производные данные, вычислимые из figma.viewport.
|
// а также производные данные, вычислимые из 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 x = 0
|
||||||
let y = 0
|
let y = 0
|
||||||
try {
|
try {
|
||||||
@@ -109,8 +113,10 @@ export default function () {
|
|||||||
|
|
||||||
const zoom = figma.viewport.zoom || 1
|
const zoom = figma.viewport.zoom || 1
|
||||||
const b = figma.viewport.bounds
|
const b = figma.viewport.bounds
|
||||||
const w = lastSize.width
|
// Реальный размер окна: из iframe (payload) либо lastSize как fallback.
|
||||||
const h = lastSize.height
|
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,
|
// Размер окна в ЭКРАННЫХ пикселях (w/h) переводим в canvas-units через zoom,
|
||||||
// чтобы корректно вычитать из canvas-ширины bounds при любом зуме.
|
// чтобы корректно вычитать из canvas-ширины bounds при любом зуме.
|
||||||
const wCanvas = w / zoom
|
const wCanvas = w / zoom
|
||||||
@@ -126,7 +132,6 @@ export default function () {
|
|||||||
const cy = Math.round(y + hCanvas / 2)
|
const cy = Math.round(y + hCanvas / 2)
|
||||||
|
|
||||||
// Максимальный размер окна (экранные px) = весь видимый viewport (bounds * zoom).
|
// Максимальный размер окна (экранные px) = весь видимый viewport (bounds * zoom).
|
||||||
// Используется кнопкой "развернуть" в UI и как верхняя граница drag-ресайза.
|
|
||||||
const maxViewport = {
|
const maxViewport = {
|
||||||
width: Math.max(320, Math.round(b.width * zoom)),
|
width: Math.max(320, Math.round(b.width * zoom)),
|
||||||
height: Math.max(200, Math.round(b.height * zoom))
|
height: Math.max(200, Math.round(b.height * zoom))
|
||||||
|
|||||||
+6
-1
@@ -90,8 +90,13 @@ function Plugin () {
|
|||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
// Запрашиваем свежие данные об окне у main (после любого действия/старта).
|
// Запрашиваем свежие данные об окне у main (после любого действия/старта).
|
||||||
|
// Передаём РЕАЛЬНЫЙ размер iframe (window.innerWidth/innerHeight) — это то, что
|
||||||
|
// Figma реально отрисовала, а не запрошенный lastSize. Иначе gaps будут тавтологией.
|
||||||
function refreshInfo () {
|
function refreshInfo () {
|
||||||
emit('GET_WINDOW_INFO')
|
emit('GET_WINDOW_INFO', {
|
||||||
|
width: window.innerWidth,
|
||||||
|
height: window.innerHeight
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Копирует все debug-значения (RAW + расчёт) в буфер обмена как текст.
|
// Копирует все debug-значения (RAW + расчёт) в буфер обмена как текст.
|
||||||
|
|||||||
Reference in new issue
Block a user