Архитектура SDK
@open-pencil/vue — Vue-слой поверх @open-pencil/core.
Пакет не владеет самой моделью редактора. Он адаптирует движок к Vue через:
- Vue-инъекцию
- реактивные компосаблы
- headless-структурные примитивы
- подключение холста и обработку ввода
Структура папок
Пакет организован по доменам.
Семейства компонентов
Canvas/ColorPicker/FillPicker/FontPicker/GradientEditor/LayerTree/PageList/PropertyList/ScrubInput/Toolbar/
Содержат структурные/headless-примитивы и локальные вспомогательные функции.
Controls
controls/ содержит компосаблы для панелей свойств и элементов управления редактора:
usePositionuseLayoutuseAppearanceuseTypographyuseExportuseFillControlsuseStrokeControlsuseEffectsControlsuseNodePropsusePropScrub
Variables
VariablesEditor/ содержит компосаблы и подключение состояния для домена переменных.
Selection
selection/ содержит производное состояние редактора и возможности, основанные на выделении.
Context
context/ содержит хелперы для инъекции редактора:
EDITOR_KEYprovideEditoruseEditor
Internal
internal/ содержит сквозные утилиты, не предназначенные как основные headless-примитивы.
Философия публичного API
Предпочитайте компосаблы
Если задача — это преимущественно управляющая логика, вывод состояния или действия редактора, оформите её как компосабл.
Headless-примитивы — только для значимой структуры
Используйте корневые компоненты, когда они координируют структуру, дочерние элементы, слоты или контекст.
Примеры:
PageListRootPropertyListRootToolbarRoot
Избегайте широких слотов с дампом контекста
Предпочитайте целенаправленные пропы слотов или прямое использование компосаблов — вместо гигантских нагрузок v-slot="ctx".
Ответственность: приложение vs SDK
SDK отвечает за
- интеграцию с редактором
- переиспользуемую headless-логику
- переиспользуемую структуру UI без предположений о стилях
- интеграцию рендеринга холста
Приложение отвечает за
- стили
- оболочки макетов
- маршрутизацию
- файловые потоки продукта
- тосты, меню и UX, специфичный для приложения
Практическое правило
Если кусок логики можно переиспользовать в другом приложении на базе OpenPencil без привнесения стилей — скорее всего, ему место в @open-pencil/vue.