| 1 | # ADR 0139: Hot-reload типографики `[fonts]` — только режим Ground |
| 2 | |
| 3 | **Статус:** Proposed · **Ground-only** (обсуждение до реализации) |
| 4 | **Дата:** 2026-05-21 |
| 5 | |
| 6 | ## Связанные ADR |
| 7 | |
| 8 | | ADR | Роль | |
| 9 | |-----|------| |
| 10 | | [0028](0028-user-settings-toml-localappdata-and-secrets.md) | `%LocalAppData%\CascadeIDE\settings.toml` | |
| 11 | | [0123](0123-intercom-full-skia-surface-evolution.md) | Skia Intercom + MFD typography | |
| 12 | | [0127](0127-intercom-spine-and-topic-tabs-chrome-navigation.md) | Chrome navigation — не смешивать с reload settings | |
| 13 | | [0010](0010-ui-modes-toml-configuration.md) | UiModes / слои продукта | |
| 14 | |
| 15 | ## Резюме |
| 16 | |
| 17 | - **Сделать:** при сохранении `settings.toml` (или явном «Применить») перечитывать `[fonts.intercom]` / `[fonts.editor]` и проталкивать в VM → Skia (`IntercomPanelFontsChanged`) + Avalonia MFD (`ChatPanelTypographyApplier`), с инвалидацией `IntercomFontDefaults`. |
| 18 | - **Не делать в Take Off:** фоновый watcher файла, debounce, частичный merge без перезапуска IDE, hot-reload всего `CascadeIdeSettings`, hot-reload `display.screens` / topology. |
| 19 | - **Почему Ground:** смена pt/family без перезапуска — **настройка и калибровка** (как темы/UiModes на земле), а не полётный контур, где гонки reload vs layout/presentation недопустимы. |
| 20 | |
| 21 | ## Контекст |
| 22 | |
| 23 | После embedded `Settings/defaults-settings.toml` ([0028](0028-user-settings-toml-localappdata-and-secrets.md)) типографика стабильна при старте, но правка `%LocalAppData%\CascadeIDE\settings.toml` требует **полного перезапуска IDE**. Оператору неудобно подбирать `prose_pt`, `panel_*`, editor `size_pt`. |
| 24 | |
| 25 | ## Решение (направление) |
| 26 | |
| 27 | 1. **Триггер:** `SettingsService.Save` успешно записал файл **и** секция `[fonts]` изменилась (или первый load после edit в UI настроек, если появится). |
| 28 | 2. **Путь данных:** `SettingsDefaultsLoader.DeserializeEffective(diskToml)` → сравнить `Fonts` → если diff → event `FontsSettingsChanged`. |
| 29 | 3. **Подписчики:** `MainWindowViewModel` / `ChatPanelViewModel.SetIntercomFontsSettings`, `IntercomFontDefaults.Reset()`, `InvalidateVisual` на `IntercomSkiaSurface`. |
| 30 | 4. **Редактор:** `DockDocumentView.ApplyEditorFontFromSettings` для открытых документов (опционально v1 — только активный editor). |
| 31 | 5. **Не в scope v1:** FileSystemWatcher; reload при внешнем редактировании toml в Notepad. |
| 32 | |
| 33 | ## Отклонено (Take Off) |
| 34 | |
| 35 | | Идея | Почему | |
| 36 | |------|--------| |
| 37 | | Watcher на `settings.toml` | Непредсказуемый reload mid-flight, конфликт с Save merge presentation | |
| 38 | | Hot-reload всего settings | Слишком широко; display/ai требуют отдельных ADR | |
| 39 | | Reload без invalidation кэша | Риск stale `IntercomFontDefaults` | |
| 40 | |
| 41 | ## Критерий готовности (когда Accepted) |
| 42 | |
| 43 | 1. Изменить `prose_pt` в user `settings.toml`, нажать Save (или переключить фокус с сохранением) — **без перезапуска** обновляются Skia-лента и MFD Chat. |
| 44 | 2. Forward `prose_pt_forward` и MFD `prose_pt` расходятся корректно после reload. |
| 45 | 3. Регрессия: embedded defaults при отсутствии user-файла не ломаются. |
| 46 | |
| 47 | ## История |
| 48 | |
| 49 | | Дата | Изменение | |
| 50 | |------|-----------| |
| 51 | | 2026-05-21 | Proposed: Ground-only; отложено до завершения 0127 A/B. | |
| 52 | |