feat(site-finder): «Пересчитать §7 с этой программой» из блока альтернатив (#2181 хвост) #2256

Merged
bot-backend merged 1 commit from feat/s7-apply-alternative into main 2026-07-03 06:12:02 +00:00

1 commit

Author SHA1 Message Date
1684363b5a feat(site-finder): «Пересчитать §7 с этой программой» из блока альтернатив (#2181)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 15s
CI / changes (pull_request) Successful in 15s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m43s
CI / openapi-codegen-check (pull_request) Successful in 3m21s
Хвост плана #2181: одним кликом применить вариант из блока «Как участок
сходится» к §7 «Концепция».

- SectionAlternatives: на каждой карточке варианта secondary-CTA (--accent-2,
  orange), передаёт класс/этажность/тип застройки варианта в §7 и плавно
  скроллит к #section-7. Дизейбл, пока §7 считает.
- Section7Concept: useEffect на pendingProgram — раскрывает §7, подбирает тип
  секции + пятно из каталога по КЛАССУ варианта (pickTypeForClass, как
  pickDefaultType но для заданного класса), выставляет этажность/класс/тип,
  densify=false, запускает handleGenerate; после старта зовёт onProgramApplied
  (родитель обнуляет pending → повторный клик снова срабатывает). autoRan/
  autoRetried refs не трогаются — ручной пересчёт всегда разрешён. Тонкий канал
  onPendingChange(concept.isPending) вверх для дизейбла CTA.
- AnalysisPageContent: state pendingProgram + conceptPending, проброс между
  двумя секциями.
- Новый узкий тип PendingConceptProgram в types/site-finder.

tsc --noEmit чисто, next lint без предупреждений.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 11:03:45 +05:00