diff --git a/src/main.ts b/src/main.ts index 8f485e8..0be9fa1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -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) diff --git a/src/ui.tsx b/src/ui.tsx index a265bf2..abe75d0 100644 --- a/src/ui.tsx +++ b/src/ui.tsx @@ -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)