feat: 8 invisible resize handles on whole perimeter (edges + corners)

This commit is contained in:
Hermes Agent committed 2026-09-09 19:19:26 +02:00
1 parent c0e2fe0358
commit 8a0bf4d8f3
2 files changed
+109 -36

No files matched your search

+28
View File
@@ -121,6 +121,34 @@ export default function () {
}
}
// Live-ресайз во время drag'а (кастомные ручки по периметру в UI).
// dir + dx/dy (смещение курсора в px). Для right/bottom — только resize.
// Для left/top — resize + сдвиг окна через reposition (иначе окно "уедет" вправо/вниз).
function getPos () {
try {
const p = (figma.ui as any).getPosition()
return { x: Math.round(p.canvasSpace.x), y: Math.round(p.canvasSpace.y) }
} catch (e) {
return { x: 0, y: 0 }
}
}
on('RESIZE_WINDOW_DRAG', function (payload: { width: number; height: number; dx: number; dy: number; dir: string }) {
const { width, height, dx, dy, dir } = payload
const size = clampWindowSize({ width, height })
figma.ui.resize(size.width, size.height)
lastSize = { width: size.width, height: size.height }
if (dir.includes('left') || dir.includes('top')) {
const zoom = figma.viewport.zoom || 1
const p = getPos()
let nx = p.x
let ny = p.y
if (dir.includes('left')) nx = p.x - dx / zoom
if (dir.includes('top')) ny = p.y - dy / zoom
figma.ui.reposition(nx, ny)
}
// Док-режим во время live-ресайза не трогаем (финальный RESIZE_WINDOW пересчитает).
})
// Ресайз окна плагина (drag за угол в UI -> useWindowResize -> RESIZE_WINDOW)
on('RESIZE_WINDOW', function (windowSize: { width: number; height: number }) {
const { width, height } = clampWindowSize(windowSize)