feat: corner click in dock sets free axis to 50% viewport (DOCK_HALF), drag still resizes

This commit is contained in:
Hermes Agent committed 2026-09-10 16:57:31 +02:00
1 parent e916d1f2a6
commit ee87211f76
2 files changed
+38 -3

No files matched your search

+27
View File
@@ -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
View File
@@ -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)