# Режим «после лечения»

Дата: 12.10.2026
Статус: принята автономно (владелец 12.10.2026: три параллельных потока, «Все автономно»; пункт «Лечение и режим „после лечения“» из раздела «После MVP» плана). Issue: #175.
Связано: спека визуала `2026-10-11-article-visuals.md` (схемы «норма / болезнь»), правила медицинского контента в `CLAUDE.md`. Часы сердца и 3D-модель «после лечения» — issue #179.

## Цель

Читатель видит не только болезнь, но и то, что меняет лечение. У схемы статьи появляется третье состояние «После лечения» рядом с «Норма» и «Болезнь»: например, закрытый дефект перегородки, имплантированный клапан, перевязанный проток. Подпись к этому состоянию объясняет, что и почему изменилось, со ссылкой на источник статьи.

Этот режим не рассказывает, как лечиться. В нём нет доз, схем, выбора препарата или метода для конкретного человека, только общее описание того, как выглядит сердце после типичного вмешательства, которое называют источники статьи.

## Кто что делает

- **Этот поток (приложение):** механика третьего состояния схем, строки интерфейса, проверки сборки и тестов, демонстрация в тестовом контенте, инструкция для авторов. Статьи и рисунки конкретных болезней этот поток не трогает.
- **Потоки статей и «Интерактив для статей»:** рисунок состояния «после лечения» в компоненте схемы болезни и подписи `<p slot="treated">` в статьях, со ссылками на источники статьи. Кто берёт какую схему, договариваются через координатора.

## Медицинские правила рисунка и подписи

- Рисунок «после лечения» не повторяет «Норму». Он показывает то, что сделано (заплата, окклюдер, протез клапана, перевязанный проток), и то, что по источникам остаётся (например, после радикальной коррекции тетрады Фалло).
- Изображается типовой результат: без марок устройств и без предпочтения одного метода, если источники описывают несколько (например, хирургическая замена клапана и транскатетерная).
- Подпись описывает результат вмешательства: что закрыто, заменено, восстановлено. Она не обещает излечения, не говорит, кому какое вмешательство показано, и не называет доз. Если источники описывают несколько методов, подпись говорит, что метод выбирает врач.
- В подписи есть хотя бы одна ссылка `<Cite>` на источник статьи с `tier: guideline`, который описывает именно это вмешательство. Подписи «Норма» и «Болезнь» этого не требуют: только состояние «после лечения» говорит о лечении, поэтому планка для него выше.

## Как устроено

### Состояние схемы `treated`

- В реестре состояний схем (`apps/web/src/components/diagrams/index.ts`) появляется состояние `treated` и набор `withTreatment = { states: ['normal', 'disease', 'treated'], initial: 'disease' }` рядом с `single` и `cycle`. Схема болезни включает «после лечения» только через этот набор, поэтому порядок переключателя всегда «Норма · Болезнь · После лечения», а начальное состояние — «Болезнь». Unit-тест проверяет, что любой набор с `treated` равен `withTreatment`.
- Подпись переключателя: «После лечения» / "After treatment" (`diagram.state.treated`), плюс тестовая локаль справа налево.
- Рисунок помечает элементы этого состояния `data-only="treated"`. Правила скрытия по `:has(:checked)` строятся из списка состояний, поэтому `data-only` работает для `treated` без новых правил. Классы `.normal-only` / `.disease-only` (их использует большинство схем болезней) скрываются отдельным правилом, которое сейчас срабатывает, только когда выбрано «Норма» или «Болезнь»: в состоянии `treated` были бы видны оба. PR механики обобщает это правило: `.normal-only` скрыт при любом выбранном состоянии, кроме `normal`, `.disease-only` — при любом, кроме `disease`. Рисунки схем при этом не меняются.
- Анимация в состоянии «после лечения» подчиняется тем же правилам движения (`prefers-reduced-motion`, переключатель анимации, кнопка паузы). Без JavaScript переключатель работает, как и для двух других состояний.
- Переключатель из трёх вариантов должен помещаться на экране 320 px на всех языках, включая тестовую локаль справа налево. Если подписи переносятся на вторую строку, у переключателя меньший радиус скругления, чтобы второй ряд не обрезался. Клавиатура: стрелки переключают три варианта и в направлении справа налево, рамка фокуса видна у каждого варианта.

### Проверки

- **Сборка (источник истины).** Сборка падает, если у схемы есть состояние `treated`, а у `<Diagram>` в статье нет подписи `<p slot="treated">`. Без подписи читатель видит рисунок без объяснения. Сейчас пустой слот допускается для любого состояния; для `treated` подпись обязательна.
- **Тест контента** (`apps/web/test/content.test.ts`) даёт ту же обратную связь быстрее и добавляет медицинскую проверку. Для каждого `<Diagram name="…">` в исходном MDX, у схемы которого есть `treated` (через `diagramStates` из реестра), он проверяет:
  - внутри этого `<Diagram>` есть блок `<p slot="treated">…</p>`, в том числе многострочный;
  - в блоке есть хотя бы один `<Cite n={…} />`, и хотя бы один из номеров указывает на источник статьи с `tier: guideline`.

  Номера `<Cite>` в пределах списка источников тест уже проверяет для всего файла.
- Остальное (что подпись описывает результат, а не показания или дозы) проверяется на ревью статьи, как и другой медицинский текст.

### Одна схема — подписи во всех статьях сразу

Слот для состояния, которого у схемы нет, уже валит сборку, а после этого этапа её будет валить и отсутствие подписи `treated`. Поэтому состояние добавляется к схеме атомарно: в одном PR меняются реестр, рисунок и подписи во всех статьях на всех языках, где стоит эта схема. Это намеренное правило: одна схема везде показывает одни и те же состояния, и ни в одной статье рисунок «после лечения» не остаётся без объяснения. Сейчас каждая схема болезни стоит ровно в двух статьях (ru и en), но схема может использоваться и шире (например, `heart-chambers` стоит в статьях по анатомии и о ЭхоКГ), поэтому статьи находятся поиском.

### Демонстрация в тестовом контенте

Тестовый контент не трогает схемы болезней. Для e2e есть отдельная тестовая схема `demo-treated` с тремя состояниями. Её компонент лежит в `apps/web/test/fixtures/`, а в реестр схем она добавляется только в тестовой сборке (`HA_TEST_CONTENT=1`, тот же переключатель, что и каталог контента). В обычную сборку и бандл она не попадает. Тестовая статья, которая сейчас показывает схему ДМПП, остаётся как есть, поэтому PR потока статей с «после лечения» для ДМПП не сломает тесты приложения; если сломает, этот PR обновляет фикстуру.

### Встраивание

`/embed/<type>/<slug>/` рендерит ту же статью теми же компонентами, поэтому переключатель «после лечения» работает и там. e2e проверяет это одной проверкой.

### Где ещё «после лечения»

В этом этапе только схемы. Часы сердца (пресеты ЭКГ и гемодинамики после лечения) и 3D-модель (протез клапана, окклюдер) — issue #179: каждому числу пресета нужен источник, а 3D-моделям — лицензия.

## Как подключить «после лечения» к схеме

Всё в одном PR:

1. В `customStates` реестра схем указать для схемы набор `withTreatment`.
2. В компоненте схемы нарисовать состояние: элементы с `data-only="treated"` и подписи `<text>` для них (пустые `<text>` тест запрещает). Общие элементы (контур сердца, сосуды) остаются без пометки. Рисунок следует медицинским правилам выше.
3. Обновить доступное имя схемы `diagram.<name>.title` в ru, en и тестовой локали: оно описывает все три состояния.
4. Найти все статьи со схемой (`grep -rl 'name="<схема>"' content`) и в каждой на каждом языке добавить в `<Diagram>` подпись `<p slot="treated">…<Cite n={…} /></p>` по источникам статьи.
5. `pnpm build` и `pnpm test` проверят подписи и ссылки; e2e статьи должен пройти.

## Первые кандидаты

Пороки и болезни, где результат вмешательства хорошо виден на схеме и описан в уже используемых рекомендациях: дефект межпредсердной перегородки (закрытие), дефект межжелудочковой перегородки (закрытие), открытый артериальный проток (закрытие), коарктация аорты (устранение сужения), аортальный стеноз (замена клапана), тетрада Фалло (радикальная коррекция с тем, что после неё остаётся). Список не обязательный: потоки статей выбирают по готовности источников.

## План PR (issue #175)

1. **Спека** (этот файл).
2. **Состояние.** `treated` и `withTreatment`, строки ru, en и тестовой локали, обобщённое правило для `.normal-only` / `.disease-only`, стиль переключателя из трёх вариантов, unit-тесты реестра (порядок и начальное состояние). Существующий тест, который рендерит каждую схему, передаёт подписи для всех её состояний.
3. **Проверки и демонстрация.** Обязательная подпись при сборке, тест контента (подпись и `<Cite>` на рекомендацию), тестовая схема `demo-treated` только в тестовой сборке, e2e: три состояния, без JavaScript, клавиатура, справа налево, ширина 320 px, встраивание, axe.
4. **Инструкция для авторов.** Раздел «Схема „после лечения“» в `CONTRIBUTING.md`. Общие брифы статей в папке проекта (`/mnt/project-files/process/`, вне репозитория) обновляются отдельно, после чего координатор передаёт инструкцию потокам статей.
