# Слои Level 1 > Пояснение нормативной модели слоёв Level 1. ## Базовая структура ```text src/ ├── app/ ├── compositions/ ├── domains/ ├── infra/ ├── ui/ └── shared/ ``` `src/` здесь является примером SLM root. Фактическую границу определяет устройство приложения. Отсутствующая в проекте роль не требует пустой папки. Слой является доступной архитектурной ролью, а не обязательным элементом каркаса. ## Роли слоёв ### App `app` связывает приложение с фреймворком: запускает его, объявляет маршруты, преобразует входные данные и подключает публичные API модулей разрешённых слоёв или ресурсы `shared`. Файлы `app` являются точками входа фреймворка, а не модулями SLM. Точка входа может напрямую использовать `compositions`, `domains`, `infra`, `ui` или `shared`, если зависимость разрешена матрицей слоёв. Такое использование не переносит ответственность импортируемого модуля в `app`. ### Compositions `compositions` содержит продуктовый интерфейс: страницы, макеты, экраны, виджеты, точки входа и другие композиционные модули. Внутреннюю группировку слоя определяет проект. ### Domains `domains` содержит предметные области приложения: их модели, правила, сценарии и продуктовое состояние. Каждая самостоятельная предметная область представлена [доменным модулем](./domains.md). Доменная логика не принадлежит устройству одной страницы или маршрута. Конкретный visual outcome и сборка нескольких доменов остаются в `compositions`. ### Infra `infra` содержит технические сервисы приложения: аналитику, локализацию, тему, телеметрию и другие возможности среды выполнения без самостоятельной доменной модели. ### UI `ui` содержит универсальные модули интерфейса, которые не зависят от конкретной страницы или продуктовой композиции. ### Shared `shared` содержит независимый детерминированный фундамент без знания о продукте, изменяемого состояния и ввода-вывода. В `shared` допускаются обычные модули и специальные немодульные ресурсы: небольшие чистые утилиты, общие типы, стили, конфигурация и статические файлы. Ресурс не имеет самостоятельной ответственности, публичного API или жизненного цикла и может импортироваться напрямую по пути, установленному стайлгайдом. Если ресурсу нужны самостоятельная ответственность, собственные архитектурные зависимости, несколько файлов реализации, изменяемое состояние, ввод-вывод или область жизни, он оформляется как модуль. Каталог ресурсов не реэкспортирует модули и не используется для обхода их публичных API. ## Матрица зависимостей ```text app | compositions | domains / \ infra ui \ / shared ``` Код слоя может импортировать модули своего слоя и слоёв, разрешённых строкой матрицы. Разрешённая зависимость может пропускать промежуточные роли. | Слой | Может импортировать | |---|---| | `app` | `app`, `compositions`, `domains`, `infra`, `ui`, `shared` | | `compositions` | `compositions`, `domains`, `infra`, `ui`, `shared` | | `domains` | `domains`, `infra`, `ui`, `shared` | | `infra` | `infra`, `shared` | | `ui` | `ui`, `shared` | | `shared` | `shared` | `infra` и `ui` не импортируют друг друга. Универсальный UI получает локализованный текст, тему, callbacks аналитики и другие возможности через входной контракт либо связывается с ними в `domains` или `compositions`. Если UI-модулю необходимо напрямую знать конкретный технический сервис приложения, такой код не является универсальным UI. Импорты внутри слоя, публичный API и циклы описаны отдельно в [Зависимостях](./dependencies.md). ## Связанные правила - [`SLM-L1-LAYER-R001`](../rules/level-1.md#slm-l1-layer-r001) - [`SLM-L1-LAYER-A002`](../rules/level-1.md#slm-l1-layer-a002) - [`SLM-L1-LAYER-R003`](../rules/level-1.md#slm-l1-layer-r003) - [`SLM-L1-MODULE-R011`](../rules/level-1.md#slm-l1-module-r011) ## Граница Level 1 Разрешённый импорт не переносит владение. Например, доменный модуль может использовать `infra` и `ui`, но технический сервис и универсальный интерфейс сохраняют собственных владельцев. Если код определяет продуктовую модель, правило или сценарий, он принадлежит `domains`, а не `shared` или `infra`. Строгая внутренняя форма домена появляется только на [Level 2](../level-2/).