feat: corner click in dock sets free axis to 50% viewport (DOCK_HALF), drag still resizes
This commit is contained in:
1 parent
e916d1f2a6
commit
ee87211f76
2 files changed
+38
-3
No files matched your search
+27
@@ -270,6 +270,33 @@ export default function () {
|
||||
applyDock(position, width, height, false)
|
||||
})
|
||||
|
||||
// Выход из дока кликом по углу: свободная ось (та, что была растянута) становится
|
||||
// 50% viewport (как в центре), сжатая ось остаётся. Окно прижимается в угол (position).
|
||||
// Пример: док ▭ вниз (h=320 сжата, w=max) -> клик угла делает w = 50% viewport, h=320.
|
||||
on('DOCK_HALF', function (payload: { position: DockPosition; width: number; height: number }) {
|
||||
const { position } = payload
|
||||
const b = figma.viewport.bounds
|
||||
const zoom = figma.viewport.zoom || 1
|
||||
const maxW = Math.round(b.width * zoom)
|
||||
const maxH = Math.round(b.height * zoom) - PLUGIN_HEADER_PX
|
||||
// Какая ось была сжатой (dock-край)? top/bottom-center -> h сжата; center-left/right -> w сжата.
|
||||
const hWasFixed = dockedPosition === 'top-center' || dockedPosition === 'bottom-center'
|
||||
const wWasFixed = dockedPosition === 'center-left' || dockedPosition === 'center-right'
|
||||
let targetW = payload.width
|
||||
let targetH = payload.height
|
||||
if (hWasFixed) targetW = Math.round(maxW / 2) // меняем ширину -> 50%
|
||||
else if (wWasFixed) targetH = Math.round(maxH / 2) // меняем высоту -> 50%
|
||||
const size = clampWindowSize({ width: targetW, height: targetH })
|
||||
figma.ui.resize(size.width, size.height)
|
||||
// Выходим из дока: чистый клик = телепорт в угол без удержания.
|
||||
dockedPosition = null
|
||||
centerLocked = false
|
||||
lastBoundsKey = ''
|
||||
lastSize = { width: size.width, height: size.height }
|
||||
// Прижимаем в угол от реального размера (computeDock для угла не меняет размер).
|
||||
applyDock(position, size.width, size.height, false)
|
||||
})
|
||||
|
||||
// Останавливаем поллинг при закрытии плагина, чтобы не висел в памяти.
|
||||
figma.on('close', function () {
|
||||
clearInterval(dockInterval)
|
||||
|
||||
+11
-3
@@ -153,9 +153,17 @@ function Plugin () {
|
||||
if (started) {
|
||||
onPointerUpResize()
|
||||
} else {
|
||||
// Чистый клик — телепорт в позицию (угол или край). Для угла dockWindow очищает
|
||||
// dock-флаг, т.е. клик по углу в доке = выход в угол без ресайза (не "висит" в ресайзе).
|
||||
dockWindow(dockPos)
|
||||
// Чистый клик.
|
||||
if (isCorner && docked) {
|
||||
// Угол в доке: свободная ось -> 50% viewport, прижим в угол (выход из дока).
|
||||
// Тот же механизм изменения размера, что и у центра (DOCK_HALF в main.ts).
|
||||
emit('DOCK_HALF', { position: dockPos, width: window.innerWidth, height: window.innerHeight })
|
||||
dockedPosRef.current = null
|
||||
requestAnimationFrame(function () { requestAnimationFrame(refreshInfo) })
|
||||
} else {
|
||||
// Не-док угол / любой край: телепорт в позицию.
|
||||
dockWindow(dockPos)
|
||||
}
|
||||
}
|
||||
}
|
||||
window.addEventListener('pointermove', move)
|
||||
|
||||
Reference in new issue
Block a user