# Формат файлов
## Структура .fig файла
```
┌─────────────────────────────────┐
│ Магический заголовок: "fig-kiwi" (8Б) │
│ Версия (4Б uint32 LE) │
│ Длина схемы (4Б uint32 LE) │
│ Сжатая Kiwi-схема │
│ Длина сообщения (4Б uint32 LE) │
│ Сжатое Kiwi-сообщение │ ← NodeChange[] (весь документ)
│ Бинарные данные │ ← Изображения, векторные сети, шрифты
└─────────────────────────────────┘
```
## Конвейер импорта
```
.fig файл → Парсинг заголовка → Декомпрессия Zstd → Декодирование Kiwi-схемы
→ Декодирование сообщения → NodeChange[] → Построение SceneGraph
→ Разрешение ссылок на блобы → Отрисовка на холсте
```
## Конвейер экспорта
```
SceneGraph → NodeChange[] → Kiwi-кодирование → Сжатие (Zstd/deflate)
→ Сборка ZIP (заголовок + схема + сообщение + thumbnail.png)
→ Запись .fig файла
```
Экспорт выполняется через ⌘S (Сохранить) и ⇧⌘S (Сохранить как) с нативными диалоговыми окнами ОС в десктопном приложении. Экспортированный файл включает `thumbnail.png`, необходимый Figma для предпросмотра. Сжатие использует Zstd через Tauri Rust-команду на десктопе, с fallback на deflate в браузере. ZIP-архив собирается на Rust в десктопном варианте для корректных заголовков Zstd-фреймов (с указанием размера содержимого).
## Бинарный кодек Kiwi
Кодек обрабатывает 194-определённую Kiwi-схему Figma с NodeChange в качестве центрального типа (~390 полей). Основные компоненты:
- **kiwi-schema** — вендорённый из evanw/kiwi, с патчем для ESM и разреженных ID полей
- **codec.ts** — кодирование/декодирование сообщений с использованием Kiwi-схемы
- **protocol.ts** — парсинг проводного формата и определение типа сообщения
- **schema.ts** — 194 определения message/enum/struct
### Разреженные ID полей
Схема Figma использует непоследовательные ID полей (например, 1, 2, 5, 10 с пропусками). Вендорённый парсер kiwi-schema пропатчен для корректной обработки этого случая.
### Сжатие
Файлы .fig используют Zstd-сжатие для полезных данных схемы и сообщения. Декомпрессия выполняется библиотекой `fzstd`. При экспорте Zstd-сжатие делегируется Tauri Rust-команде в десктопном приложении (лучшая производительность, корректные заголовки фреймов). В браузере в качестве fallback используется deflate через `fflate`. Кодирование буфера обмена также использует `fflate`.
## Поддерживаемые форматы
| Формат | Импорт | Экспорт |
|--------|--------|---------|
| .fig (Figma) | ✅ | ✅ |
| .svg | Планируется | Планируется |
| .png | Планируется | Планируется |
| .pdf | — | Планируется |
Подробнее о сроках поддержки форматов см. [Дорожная карта](/ru/development/roadmap).
## Формат буфера обмена
Копирование/вставка использует то же бинарное Kiwi-кодирование:
1. **Копирование** — кодирование выбранных NodeChange[] в бинарный Kiwi, сжатие, запись в буфер обмена с MIME-типом `application/x-figma-design`
2. **Вставка** — чтение буфера обмена, декомпрессия, декодирование бинарного Kiwi, создание узлов в графе сцены
3. **Синхронность** — кодирование происходит в обработчике события копирования (не через асинхронный Clipboard API) для совместимости с браузерами
Это обеспечивает двусторонний обмен через буфер обмена между OpenPencil и Figma.