# Закон UI: весь интерфейс — на RmlUi

Статус: **закон** (архитектурная константа, см. [PHILOSOPHY.md](PHILOSOPHY)
§2.6). Нарушение — основание не принимать изменение.

Короткая формулировка, на которую ссылаются остальные документы:

> **ALL UI → RmlUi.** Любой интерфейс движка и игры — документы `.rml` +
> `.rcss`. Второго UI-пути в движке нет.

---

## 1. Из чего это состоит

1. **Интерфейс рисует RmlUi.** Игровой HUD, меню, экраны, диалоги, инвентарь,
   настройки, обучение, экраны загрузки, панели инструментов разработчика —
   всё это `.rml` + `.rcss`.
2. **RmlUi владеет вёрсткой и раскладкой.** Если нужен особый визуальный
   контент (коллизии, BSP, навигация, графики), он рисуется **внутри**
   RmlUi-элемента, а не вместо RmlUi.
3. **Движок не заводит второй UI-стека.** Ни ImGui «пока не сделаем нормально»,
   ни собственный виджет-фреймворк, ни ручная раскладка как основа интерфейса.
4. **Правило одно для R2D и R3D** — см.
   [R2D_R3D_CONVENTIONS.md](R2D_R3D_CONVENTIONS) §4.

---

## 2. Что разрешено

* Документы RmlUi: `$.ui.doc('ui/menu.rml')` и низкоуровневые `engine.ui.*`
  ([HIGH_LEVEL_API.md](HIGH_LEVEL_API) §20, [internal/NATIVE.md](internal/NATIVE) §9).
* **Нативные custom-элементы внутри RmlUi** — для специализированного
  отрисованного содержимого: визуализация коллизий, BSP, навигационной сетки,
  зон видимости, графиков профайлера ([DEVTOOLS.md](DEVTOOLS) §5).
* Существующие узлы `<ui.*>` (`<ui.bar>`, `<ui.label>`, `<ui.button>`, …) — как
  **быстрый рисователь HUD** в координатах окна: полоса, подпись, иконка
  поверх сцены. Они продолжают работать, их не нужно переписывать, но это не
  «интерфейсный слой» и не основа для новых экранов.

---

## 3. Что запрещено

* добавлять ImGui-интерфейс — даже временно, даже «для отладки»;
* создавать второй developer GUI параллельно RmlUi;
* строить меню, экраны и диалоги на узлах `<ui.*>`, если это новый код;
* тащить в движок стороннюю библиотеку интерфейса;
* считать ручную раскладку (`at()`/`size()` по пикселям) заменой RmlUi.

---

## 4. Текущее состояние (2026-10-09)

| Путь | Где | Статус |
|---|---|---|
| RmlUi-документы | [gui.cpp](https://github.com/Nikide/russiano2d/blob/main/src/gui.cpp), [ui.js](https://github.com/Nikide/russiano2d/blob/main/src/highlevel/ui.js), [devtools.js](https://github.com/Nikide/russiano2d/blob/main/src/highlevel/devtools.js), `sdk/ui/`, `demos/ui/launcher.rml` | целевой путь; новый SDK и DevTools используют его |
| Legacy HUD/widgets | [ui.js](https://github.com/Nikide/russiano2d/blob/main/src/highlevel/ui.js), [widgets.js](https://github.com/Nikide/russiano2d/blob/main/src/highlevel/widgets.js), [screen.js](https://github.com/Nikide/russiano2d/blob/main/src/highlevel/screen.js) | совместимость; новые меню/экраны на них не строятся |
| F1 / `--overlay` / `$.debug.on()` | [devtools.js](https://github.com/Nikide/russiano2d/blob/main/src/highlevel/devtools.js) | RmlUi: статистика, профиль, гравитация, скрипты, текстуры и наблюдения |

ImGui удалён из зависимостей, сборки, обработки событий и runtime.
F5 запрашивает общий reload независимо от GUI. F2 открывает инспектор узлов.

Текст сцены использует native TTF/stb_truetype и существующий 2D sprite batch
([text.c](https://github.com/Nikide/russiano2d/blob/main/src/text.c)), а не ImGui. Launcher уже на RmlUi; прежнее
утверждение, что `launcher.rml` не используется, удалено.
Справочники legacy подсистем сохраняют API, но не предлагают их для новых меню.
Все новые SDK-панели находятся в `.rml` / `.rcss`; World Studio редактирует
открытые данные и не вводит другой UI или renderer.

---

## 5. Переходное правило

1. **Существующие игры не ломаем.** Узлы `<ui.*>` остаются рабочими; их API не
   удаляется и не переписывается «заодно».
2. **Новый интерфейс — только RmlUi.** Меню, экраны, диалоги, панели: новый
   `.rml` + `.rcss` + `$.ui.doc`. Это относится и к служебным экранам
   (пауза, настройки, загрузка).
3. **`<ui.*>` — HUD-рисователь.** Новые полосы, подписи и иконки поверх сцены
   на них — по-прежнему нормально.
4. **DevTools — на RmlUi.** Панели инспектора делаются RmlUi-документами;
   нативная отрисовка допускается только как содержимое внутри custom-элемента
   ([DEVTOOLS.md](DEVTOOLS)).
5. **ImGui удалён.** Отладочные панели используют тот же RmlUi, что SDK и игры.

---

## 6. Критерии приёмки (чек-лист ревью)

* [ ] Новый интерфейс — это `.rml` + `.rcss` (или `$.ui.doc`), а не разметка
      в JS на узлах.
* [ ] В изменении нет новых окон/виджетов ImGui.
* [ ] Нет второго механизма раскладки/шрифтов/ввода интерфейса.
* [ ] Нативная отрисовка (если есть) находится внутри RmlUi-элемента и не
      подменяет вёрстку.
* [ ] Документация не называет `<ui.*>` «интерфейсным слоем» и не предлагает
      строить меню на узлах.
* [ ] Если правило нарушено по объективной причине — это отдельное решение
      владельца проекта с записью здесь, а не молчаливое исключение.

---

## 7. Как проверить, что закон соблюдён

```bash
# ImGui не должен присутствовать в коде
rg "ImGui::|imgui.h" src/

# новые меню/экраны на узлах <ui.*>
grep -rn "ui\.panel\|ui\.button" src/highlevel/*.js demos/*.js

# RmlUi-документы и их обёртка
grep -rn "ui\.doc(\|ui_load" src/highlevel/*.js game demos
```

Ссылки: [internal/NATIVE.md](internal/NATIVE) §9 (низкоуровневый GUI),
[HIGH_LEVEL_API.md](HIGH_LEVEL_API) §20 (`$.ui`),
[PHILOSOPHY.md](PHILOSOPHY) §2.6, [DEVTOOLS.md](DEVTOOLS).
