From 6c7be98a82153354bdc38b6e61c2ce3c079e5c6c Mon Sep 17 00:00:00 2001 From: Hermes Date: Wed, 9 Sep 2026 12:38:13 +0200 Subject: [PATCH] feat: relaunch button in right panel + drag-resize window - package.json: add relaunchButtons (runAI) for right-panel shortcut - main.ts: setRelaunchData + RESIZE_WINDOW handler (figma.ui.resize) - ui.tsx: useWindowResize native drag handle + expand/collapse toggle - .gitignore: exclude _reference/ (temp old-plugin copy) - IDEA.md: commit+push to Gitea is mandatory workflow --- .gitignore | 1 + IDEA.md | 6 +++++ manifest.json | 2 +- package.json | 9 ++++++- src/main.ts | 11 ++++++++- src/ui.tsx | 68 +++++++++++++++++++++++++++++++++++++++++++++++---- 6 files changed, 89 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 75e63f8..794adda 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ build/ *.log +_reference/ diff --git a/IDEA.md b/IDEA.md index 3a17370..e566925 100644 --- a/IDEA.md +++ b/IDEA.md @@ -41,6 +41,12 @@ 5. В Figma: Plugins → Development → Import plugin from manifest → выбрать `manifest.json` из папки Matebook 6. Запуск плагина для теста +## Правила ведения репозитория + +- **Коммит + пуш в Gitea — обязательная часть рабочего флоу.** Любое осмысленное изменение в коде/доках коммитится и пушится в `origin/main` сразу по завершении задачи (не копить локально). +- `_reference/` — временные копии чужих/старых плагинов для сверки; в git не попадают (в `.gitignore`). +- `build/` и `node_modules/` не коммитятся (собираются локально / на Matebook), см. синхронизацию через tar в KNOWLEDGE.md. + ## Правила ведения KNOWLEDGE.md - KNOWLEDGE.md — живая копилка gotcha/решений. Hermes (агент) **имеет право дописывать и править KNOWLEDGE.md самостоятельно, без вопросов к пользователю**, когда находит новую проблему и её решение по ходу работы над проектом. diff --git a/manifest.json b/manifest.json index df3cccf..7d2fc16 100644 --- a/manifest.json +++ b/manifest.json @@ -1 +1 @@ -{"api":"1.0.0","editorType":["figma"],"id":"ai-plugin-mvp","name":"AI assistant (MVP)","main":"build/main.js","ui":"build/ui.js"} +{"api":"1.0.0","editorType":["figma"],"id":"ai-plugin-mvp","name":"AI assistant (MVP)","main":"build/main.js","ui":"build/ui.js","relaunchButtons":[{"name":"Запустить AI assistant","command":"runAI"}]} diff --git a/package.json b/package.json index 6c526d4..fcdaccc 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,13 @@ "id": "ai-plugin-mvp", "name": "AI assistant (MVP)", "main": "src/main.ts", - "ui": "src/ui.tsx" + "ui": "src/ui.tsx", + "relaunchButtons": { + "runAI": { + "name": "Запустить AI assistant", + "main": "src/main.ts", + "ui": "src/ui.tsx" + } + } } } diff --git a/src/main.ts b/src/main.ts index d40c44d..d81ff0b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,5 +1,14 @@ -import { showUI } from '@create-figma-plugin/utilities' +import { emit, on, showUI } from '@create-figma-plugin/utilities' export default function () { + // Глобальный ярлык relaunch в правой панели Figma (команда runAI из manifest.json) + figma.root.setRelaunchData({ runAI: '' }) + + // Ресайз окна плагина (drag за угол в UI -> useWindowResize -> RESIZE_WINDOW) + on('RESIZE_WINDOW', function (windowSize: { width: number; height: number }) { + const { width, height } = windowSize + figma.ui.resize(width, height) + }) + showUI({ width: 320, height: 200, themeColors: true }) } diff --git a/src/ui.tsx b/src/ui.tsx index 69eb916..c9f0f2c 100644 --- a/src/ui.tsx +++ b/src/ui.tsx @@ -1,12 +1,70 @@ -import { render, Container, Text, Muted, VerticalSpace } from '@create-figma-plugin/ui' +import { + render, + Container, + Text, + Muted, + VerticalSpace, + IconButton, + IconExpand24, + IconCollapse24, + useWindowResize +} from '@create-figma-plugin/ui' +import { emit } from '@create-figma-plugin/utilities' import { h } from 'preact' +import { useState } from 'preact/hooks' + +const MIN_WINDOW_SIZE = { width: 320, height: 200 } +const MAX_WINDOW_SIZE = { width: 800, height: 800 } function Plugin () { + const [currentWindowSize, setCurrentWindowSize] = useState(MIN_WINDOW_SIZE) + + // Нативный drag-ресайз окна Figma (тянуть за правый нижний угол) + useWindowResize(function (windowSize: { width: number; height: number }) { + setCurrentWindowSize(windowSize) + emit('RESIZE_WINDOW', windowSize) + }) + + function toggleWindowSize () { + const isMaximized = + currentWindowSize.width >= MAX_WINDOW_SIZE.width && + currentWindowSize.height >= MAX_WINDOW_SIZE.height + const next = isMaximized ? MIN_WINDOW_SIZE : MAX_WINDOW_SIZE + setCurrentWindowSize(next) + emit('RESIZE_WINDOW', next) + } + + const isMaximized = + currentWindowSize.width >= MAX_WINDOW_SIZE.width && + currentWindowSize.height >= MAX_WINDOW_SIZE.height + return ( - - Hello, Figma ✦ - - AI assistant (MVP) — bootstrap + +
+ + {isMaximized ? : } + +
+
+ Hello, Figma ✦ + + AI assistant (MVP) — bootstrap + + + {currentWindowSize.width} × {currentWindowSize.height} + +
) }