feat: 8 invisible resize handles on whole perimeter (edges + corners)
This commit is contained in:
1 parent
c0e2fe0358
commit
8a0bf4d8f3
2 files changed
+109
-36
No files matched your search
+28
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user