АРХ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: фундамент редизайна и фиксация UI-техдолга

This commit is contained in:
DCCONSTRUCTIONS
2026-04-22 14:30:51 +03:00
parent ecb31a78f9
commit 3f6219fc50
21 changed files with 385 additions and 61 deletions
@@ -0,0 +1,233 @@
# Dropdown Standardization Debt
Дата фиксации: `2026-04-22`
Статус: `active`
Связанные документы:
- [HDESIGN-CODE.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/HDESIGN-CODE.md)
- [HDROPDOWN-CANON.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/HDROPDOWN-CANON.md)
- [HUI-CANON-AUDIT.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/HUI-CANON-AUDIT.md)
## Зачем фиксируется этот техдолг
В проекте уже выполнена большая часть канонизации dropdown-окон, но этап еще не завершен.
Это означает:
- общий контракт для dropdown уже определен
- значимая часть экранов уже переведена на shared-компоненты
- legacy-механики еще не вычищены полностью
- визуальный слой новых dropdown и связанных элементов еще не доведен на всех экранах до одного и того же дизайн-эталона
Этот документ нужен, чтобы:
- не потерять текущий контекст миграции
- не откатиться обратно к локальным menu-wrapper решениям
- иметь единый технический ориентир перед следующим большим этапом редизайна
- отделить архитектурную канонизацию dropdown-stack от визуальной доводки экранов
## Что уже считается сделанным
На текущем этапе уже зафиксированы и частично внедрены следующие принципы:
### 1. Типизация dropdown по смыслу
В системе признаются только три вида выпадающих окон:
- `Selection dropdown`
- `Action dropdown`
- `Context menu`
Правило:
- если пользователь выбирает значение, используется `SelectionDropdown`
- если пользователь вызывает список действий, используется `ActionDropdown`
- `ContextMenu` допустим только как secondary/right-click механизм
### 2. Общий канон поведения
Dropdown больше не считается локальной версткой рядом с кнопкой.
Dropdown должен быть:
- отдельным floating-layer
- привязанным к реальному trigger-элементу
- открываемым через общий popper/portal стек
- одинаковым по контракту открытия, закрытия и позиционирования
### 3. Уже мигрированные слои
На общий канон уже переведены крупные блоки:
- project/module breadcrumbs
- quick-actions карточек и detail action-menu
- desktop header action-menu
- desktop sorting dropdown
- mobile selection/menu слой для части экранов
- searchable select-пикеры
- form/settings select-пикеры
### 4. Уже определен визуальный канон
Для dropdown зафиксирован matte black glass подход:
- темный glass surface
- blur
- мягкая граница
- единый popup-shell
- единый ритм option-row
- запрет на случайные outline, clip и локальные подложки
## В чем состоит незакрытый долг
Долг не в том, что dropdown “вообще не стандартизированы”.
Долг в том, что стандартизация завершена не до конца на уровне всей системы.
Проблема сейчас состоит из четырех частей.
### 1. Не все legacy dropdown переведены на shared-канон
В проекте еще остаются места, где используются старые механики:
- `CustomMenu`
- `CustomSelect`
- `CustomSearchSelect`
- локальные menu-wrapper решения вокруг существующих control-компонентов
Это критично, потому что:
- соседние controls могут вести себя по-разному на одном экране
- фиксы начинают делаться точечно, а не системно
- новая UI-логика начинает разъезжаться по разным слоям
### 2. Не все dropdown доведены до одной и той же схемы переиспользования
Даже там, где поведение уже близко к канону, еще встречаются расхождения:
- разные trigger-shell
- разные popup-wrapper
- разная схема option-render
- разные локальные классы для похожих dropdown
Это опасно тем, что код выглядит “уже почти каноничным”, но реально еще не является одним и тем же reusable-механизмом.
### 3. Визуальный канон еще не протянут через все экраны
Архитектурный слой во многих местах уже выровнен, но визуально часть экранов еще живет на смешанном состоянии:
- popup уже новый, а surrounding layout еще старый
- dropdown уже каноничный, а рядом карточка, detail-pane или modal сверстаны по старому ритму
- glass shell и spacing формально есть, но не совпадают с эталоном `Внутреннего контура`
### 4. Нет финального закрытия этапа по критерию Definition of Done
Этап можно считать закрытым только тогда, когда:
- legacy dropdown-механики перестают быть обязательным рабочим слоем
- новые экраны не изобретают свои popup-решения
- существующие экраны используют только зафиксированные shared-компоненты
- UI доведен до одного и того же канона не только функционально, но и визуально
Сейчас этот критерий еще не выполнен.
## Что запрещено до полного закрытия долга
До закрытия этого техдолга запрещено:
- добавлять новый dropdown через локальный `isOpen` и `absolute` popup
- делать новый `...` через отдельный компонент, если уже есть `ActionDropdown`
- использовать `CustomMenu` как “быструю временную затычку” для нового action-menu
- использовать `CustomSelect` или `CustomSearchSelect` для новых экранов, если их можно закрыть каноничными shared-компонентами
- лечить проблемы positioning случайными `left/right translate` без исправления placement-контракта
- исправлять визуальный разнобой только внешней оберткой, если проблема находится внутри базового reusable-компонента
## Что обязательно делать при продолжении этапа
Любая новая работа по dropdown и связанным UI-элементам должна идти в таком порядке:
1. Определить тип dropdown:
`selection`, `action` или `context`.
2. Проверить, есть ли shared-компонент для этого сценария.
3. Если shared-компонент есть:
дорабатывать его, а не создавать новый локальный wrapper.
4. Если shared-компонент не покрывает кейс полностью:
расширять shared-контракт, чтобы изменение переиспользовалось и на других экранах.
5. После архитектурного изменения дотягивать экран до дизайн-канона целиком, а не только dropdown.
## Граница между архитектурой и редизайном
Важно разделять два разных этапа.
### Текущий этап
Это этап архитектурной канонизации dropdown-layer.
Его задача:
- вычистить legacy popup-механики
- выровнять trigger/popup/portal/placement слой
- свести похожие выпадающие окна к одним и тем же shared-компонентам
### Следующий большой этап
Это этап редизайна UI-элементов под новые каноны.
Его задача:
- пройтись по живым экранам проекта
- довести карточки, detail-pane, filters, modal, toolbar и list layouts до одного визуального эталона
- использовать уже зафиксированный dropdown-канон как инфраструктурную основу, а не спорить заново о popup-поведении
Именно этот второй этап теперь считается более приоритетным.
## Какие области еще требуют возврата
На момент фиксации документа к этапу нужно вернуться минимум по следующим направлениям:
### 1. Legacy select/search layer
Нужно дочистить остатки старых select-механик:
- `automation`
- `export`
- `pages modal`
- `api-token`
- `publish-project`
- `rich-filters`
Цель:
- убрать остаточные прямые зависимости от legacy select/search dropdown-слоя
- завершить переход на `SelectionDropdown` и `SearchSelectionDropdown`
### 2. Legacy action/context layer
Нужно проверить, не остались ли вторичные места, где visible action-menu еще живет на старом menu-engine.
Цель:
- не допустить, чтобы `ActionDropdown` существовал как “еще один способ”
- закрепить его как основной стандарт для action popup
### 3. Экранный визуальный проход
Нужно отдельно пройтись по:
- `Внутреннему контуру`
- `Внешним контурам`
- `Предложениям`
- `Модулям`
- `Циклам`
- `Видам`
- `Страницам`
- workspace/sidebar/settings flows
Цель:
- довести не только сами dropdown, но и surrounding UI до общего дизайн-ритма
## Признак завершения техдолга
Этот документ можно считать закрытым только если одновременно выполнены все условия:
- на новых экранах больше не появляются локальные dropdown-механики
- legacy `CustomMenu` не используется как основной visible action dropdown
- legacy `CustomSelect` и `CustomSearchSelect` перестают быть рабочим стандартом для новых задач
- общие shared dropdown покрывают реальные product-сценарии без точечных обходов
- визуально dropdown, filters, action menu и related cards/modals подчиняются одному и тому же канону
- команда может вернуться к экрану через несколько недель и продолжить работу без повторного архитектурного переизобретения
## Что делать перед стартом большого этапа редизайна
Перед стартом следующего большого этапа нужно считать зафиксированными следующие вводные:
- dropdown-канон уже существует и описан
- техдолг по миграции еще активен
- редизайн не должен плодить новые popup-механики
- если при редизайне находится dropdown-кейс, которого нет в shared-компонентах, сначала расширяется shared-компонент, а только потом меняется экран
Итоговое правило:
- редизайн делается поверх канона
- канон не ломается ради скорости редизайна