# Формат файлов ## Структура .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.