# Lattice.Core [![Framework](img.shields.io)](#) [![Author](img.shields.io)](git.frigat.duckdns.org) [![Platform](img.shields.io)](#) **Lattice.Core** — это платформонезависимое ядро (Layout Engine) для построения сложных интерфейсов с системой докинга в стиле Visual Studio 2026. Библиотека является частью экосистемы **Lattice** и отвечает исключительно за математику макета, управление деревом узлов и контекстное состояние, не имея зависимостей от конкретных UI-фреймворков. ## 🚀 Особенности - **Агностическая архитектура**: Полная совместимость с .NET 8+, WinUI 3 и Uno Platform. - **Древовидная компоновка**: Управление интерфейсом через узлы (`Split` и `Content`). - **Context-Aware System**: Встроенный сервис отслеживания контекста для динамического переключения панелей инструментов. - **Smart Docking**: Алгоритмы автоматического разделения зон и схлопывания пустых контейнеров. - **JSON Persistence**: Полиморфная сериализация макетов для сохранения и загрузки состояний пользователя. ## 📁 Структура проекта * `Abstractions/` — Интерфейсы для расширения системы. * `Models/` — Базовые сущности дерева (узлы, направления, ориентация). * `Services/` - Сервисы управления интерфейсом * `ContextService` - Сервис управления контекстом приложения. * `LayoutService` - Сервис управления макетом. * `NotificationService` - Сервис уведомлений. * `Persistence/` — Логика сохранения макета в JSON. ## 🛠 Использование ### Создание базового макета ```csharp var layoutService = new LayoutService(); // Создаем контентные узлы var explorer = new ContentNode(new MyToolComponent("Solution Explorer", "Explorer")); var editor = new ContentNode(new MyDocumentComponent("Main.cs", "CodeEditor")); // Устанавливаем редактор как корень layoutService.SetRoot(editor); // Прикрепляем проводник слева от редактора layoutService.Dock(explorer, editor, DockDirection.Left); //Переключение контекста var contextService = new ContextService(); // Вызывается при активации вкладки в UI contextService.SetContext("CodeEditor"); // Проверка видимости команд в текущем контексте bool isDebugVisible = contextService.IsCommandVisible("btnDebug", "CodeEditor"); ```