MonoScript | Figma-плагин для рутинных задач
Как я автоматизировал повторяющиеся задачи в работе над дизайн-проектами
Попробовать
Протестируйте прототип выше, чтобы посмотреть, как работает интерфейс, или попробуйте полностью рабочую версию плагина в Figma.
Зачем
Есть класс задач, которые в Figma решаются либо руками, либо с помощью ИИ через MCP. Второй способ требует платной подписки, а первый забирает время и когнитивный ресурс, который гораздо ценнее потратить на проектирование. Ниже примеры таких задач.
Иконки
- Перекрасить 9000 иконок Phosphor.
- Превратить строчные иконки (stroke) в заливку (fill) и объединить фигуры — только после этого они нормально перекрашиваются и масштабируются внутри компонентов.
- Объединить нужные иконки в варианты и поменять их порядок, чтобы начертание Regular было первым.
Всё это реальные задачи для рук, но последняя — бесконечно долгая, а на первых двух Figma сильно тормозит.
Компоненты и переменные
- Привести все свойства компонентов и их атрибуты к одному формату, например camelCase или kebab-case.
- Собрать каркас для только что созданного компонента: все привычные свойства и атрибуты в один клик.
- Перенести переменные из одной коллекции в другую, сохранив связь с макетом — этой функции в Figma нет вообще, по крайней мере на момент, когда я пишу этот кейс.
Разбор чужого и старого
- Найти неиспользуемые текстовые стили и удалить.
- Расчистить импортированный HTML: привязать переменные и стили к одинаковым элементам, убрать десятичные дроби в значениях.
Уже есть плагин Scripter, но у него кривой UX и устаревший TypeScript. Поэтому создаём свой :)
Плагин как мост между LLM и Figma
Пайплайн получился такой:
- Просишь LLM написать скрипт (я делал в Gemini — он охотно переписывает скрипт целиком, когда просишь внести правки).
- Вставляешь в плагин, запускаешь.
- Если ошибка — жмёшь Debug for AI, вставляешь репорт обратно в LLM.
- Вставляешь исправленный код в плагин.
Редактор — Monaco, тот же, что в VS Code. Кто с ним знаком, начинает работать сразу.
Debug for AI
Одна кнопка собирает всё, что нужно модели, чтобы починить скрипт: имя, исходник, диагностику TypeScript, рантайм-ошибку со стеком и позицией, весь вывод консоли. Складывает в markdown и кладёт в буфер.
# label
**SCRIPT:**
```typescript
// Labels every selected layer with its own name.
const nodes = figma.currentPage.selection;
console.log("Selection:", nodes.length);
for (const node of nodes) {
const label = figma.createText();
label.characters = node.name;
label.x = node.x;
label.y = node.y - 24;
figma.currentPage.appendChild(label);
}
console.log(`Labelled ${nodes.length} nodes`);
```
**ERRORS FOUND:**
- Runtime (line 7:9): **Error** — in set_characters: Cannot write to node with unloaded font "Inter Regular"
```
Error: in set_characters: Cannot write to node with unloaded font "Inter Regular"
at Object.set [as characters] (<anonymous>)
at script:s-label.js:7:9
at eval (<anonymous>)
at runScript (<anonymous>)
```
**CONSOLE OUTPUT (last 30 entries):**
```
[log] Selection: 3
[error] Error: in set_characters: Cannot write to node with unloaded font "Inter Regular"
``` # label
**SCRIPT:**
```typescript
// Labels every selected layer with its own name.
const nodes = figma.currentPage.selection;
console.log("Selection:", nodes.length);
for (const node of nodes) {
const label = figma.createText();
label.characters = node.name;
label.x = node.x;
label.y = node.y - 24;
figma.currentPage.appendChild(label);
}
console.log(`Labelled ${nodes.length} nodes`);
```
**ERRORS FOUND:**
- Runtime (line 7:9): **Error** — in set_characters: Cannot write to node with unloaded font "Inter Regular"
```
Error: in set_characters: Cannot write to node with unloaded font "Inter Regular"
at Object.set [as characters] (<anonymous>)
at script:s-label.js:7:9
at eval (<anonymous>)
at runScript (<anonymous>)
```
**CONSOLE OUTPUT (last 30 entries):**
```
[log] Selection: 3
[error] Error: in set_characters: Cannot write to node with unloaded font "Inter Regular"
``` Ошибки, не блокирующие запуск
Семантическая валидация выключена намеренно. Figma регулярно добавляет новые методы в API, редактор их не знает и подсвечивает красным — при том что скрипт рабочий. Ложная ошибка здесь стоит дороже пропущенной, поэтому семантика молчит. Синтаксические ошибки остаются: это реальный блокер, скрипт с ними не выполнится.
Ремесло
Иконки
Использовал Tabler. При масштабировании из дефолтных 24 px в 16 px почти везде глифы попадают мимо пиксельной сетки и выглядят мыльно. Можно было взять готовый сет под 16 px, но я оставил Tabler из-за стилистики и перерисовал его сам — ради чёткости на FullHD-мониторах.
Морфинг папки
Открытая и закрытая папка — два нарисованных состояния с одинаковой последовательностью команд пути, поэтому анимируются сами точки, а не подменяется одна фигура другой.
Пустое состояние
Зафигачил иллюстрацию для состояния, когда все скрипты удалены.
Микровзаимодействия
Открытие и закрытие папок, появление и скрытие модалок, бордеры, которые появляются при скролле в сайдбаре и исчезают, когда прокручивать больше нечего.
Как проверял
Накладывал макет из Figma поверх скриншота из прода — так видно расхождения, которые глазом не поймаешь. Дальше пытался «сломать» плагин: перепробовать все возможные состояния и их комбинации в поисках багов.
Дальше планирую собрать систему проверки прода [здесь указать, что именно буду сверять], чтобы шанс упустить расхождение или баг был минимальным.
Что поменялось, когда плагин пошёл в Community
Инструмент для себя и инструмент для незнакомого человека — это разные продукты.
- Онбординг. Сначала это был Welcome-экран с иллюстрацией, но я от него отказался: фактической установки плагина в Figma нет, и отследить, первый ли это вход, невозможно. Вместо экрана — скрипт «Hello» в библиотеке по умолчанию: приветствие и объяснение, что это за плагин, прямо в комментариях к коду.
- Дефолтные скрипты отделены от своих. Их можно удалить, если не нужны, и вернуть кнопкой «Восстановить дефолтные скрипты».
- Приватность.
networkAccess: none. Плагин работает локально, ничего наружу не уходит. Для инструмента, который массово переименовывает свойства в чужой продовой библиотеке, это условие установки, а не приятный бонус.
Что дальше
Каталог скриптов от сообщества. Пользователи добавляют свои скрипты, скрипты ранжируются по популярности и рейтингу. Тогда не нужно писать с нуля то, что кто-то уже написал.
Дизайн-система редактора. Полная замена дизайн-системы редактора Monaco на дизайн-систему MonoScript: тултипы, контекстные меню и так далее.
Больше анимации для микровзаимодействий — чтобы просто прикольнее и приятнее его было пользовать.