# Шаг 11. Единый shell карточки внешнего контура ## Зачем нужен этот шаг Сейчас карточка деталей во `Внешних контурах` решает прикладную задачу, но UX-паттерн у нее другой, чем во `Внутреннем контуре`. Из-за этого: - у пользователя ломается ожидаемая логика открытия карточки - верхний action-bar живет по другим правилам - повторяется UI-логика, которая уже есть у стандартного peek-shell - дальнейшее развитие `Внешних контуров` начинает расходиться с остальным продуктом Следующий шаг должен выровнять не данные, а каркас взаимодействия. ## Целевой результат По клику на карточку во `Внешних контурах` пользователь получает тот же класс панели, что и во `Внутреннем контуре`: - закрытие просмотра - полноэкранный режим - переключение макета - подписка или отписка - копирование ссылки - меню дополнительных действий При этом тело карточки остается отдельным и специфичным для `Внешних контуров`. ## Что обязательно сохраняем Карточка внешнего контура не должна деградировать до обычной карточки `Issue`. Нужно сохранить: - source-side режим без обязательного membership в target project - блок `Маршрутизация` - зеркалирование комментариев, вложений и activity - внешний lifecycle `Принять / Отклонить / Ответ во внешний контур` - правила доступа, отличающиеся от обычного внутреннего рабочего элемента Иначе мы потеряем главный смысл модуля. ## Что меняем Меняем только shell и верхний UX-паттерн: - каркас панели - поведение открытия и закрытия - поведение полноэкранного режима - верхний блок действий - раскладку заголовка и служебных controls То есть цель шага — унификация оболочки, а не унификация доменной модели. ## Что не входит В этот шаг не входят: - новые колонки `Исходящие / Входящие` - drag-and-drop - пользовательские кастомные представления - перенос всех операций внешнего контура на стандартные issue services - удаление запроса как обязательное действие из header action set ## Архитектурный принцип Нельзя копировать целиком реализацию `peek overview` внутреннего контура и натягивать ее поверх внешней сущности. Правильный путь: - переиспользовать shell-контракт - переиспользовать header action pattern - оставить внешний data-flow отдельным - оставить body карточки отдельным То есть нужен не clone существующей карточки, а повторное использование общего слоя представления. ## Рекомендуемое разбиение реализации ### 1. Общий слой shell Нужен общий контракт боковой карточки, который умеет: - sidebar-режим - full-screen режим - общий overlay и поведение закрытия - общий header slot - общий body slot ### 2. Отдельный adapter для `Внешних контуров` Нужен внешний adapter, который подает в shell: - title - служебные действия - доступные действия меню - состояние source-only или target-access - body контент внешнего контура ### 3. Отдельный action set Нельзя слепо использовать меню обычной задачи. Нужно отдельное правило доступных действий для внешнего контура: - закрыть - fullscreen - layout toggle - subscribe/unsubscribe - copy link - `...` При этом `...` для внешнего контура должен быть ограничен собственным набором действий и не обязан повторять delete-flow внутреннего рабочего элемента. ## Риски, которые надо избежать ### 1. Смешение доменных сущностей Если внешний запрос начать вести как обычный `Issue`, то быстро сломаются: - source-side права - логика bridge - роутинг действий `Принять / Отклонить` - зеркальная история ### 2. Дублирование shell-кода Если сделать второй независимый peek-shell только для `Внешних контуров`, то дальше появятся: - рассинхрон верхних action-bar - повторная поддержка полноэкранного режима - повторная поддержка keyboard и close behavior ### 3. Преждевременная универсальная платформа Не нужно ради одного шага строить абстрактный UI-framework на все возможные будущие сущности. Нужен только тот общий контракт, который уже доказан двумя режимами: - `Внутренний контур` - `Внешние контуры` ## Критерий приемки - карточка `Внешних контуров` открывается по тому же UX-паттерну, что и во `Внутреннем контуре` - верхняя панель действий выглядит и ведет себя единообразно - body карточки остается внешнеконтурным - source-only сценарий не ломается - без прямого доступа в target project пользователь все равно видит рабочую карточку ## Зависимость следующего шага Этот шаг желательно сделать до полной двусторонней доски. Причина простая: - доска `Исходящие / Входящие` увеличит число точек входа в карточку - если shell не унифицирован заранее, новый board-layer закрепит текущую раздвоенную архитектуру Следующий связанный шаг описан в: - [12_STEP_external-contours-bidirectional-board.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/docs_prod/1_STEP_cross-project-task-routing/12_STEP_external-contours-bidirectional-board.md)