110 lines
8.3 KiB
Markdown
110 lines
8.3 KiB
Markdown
## Context
|
||
|
||
Страница Portfolio уже подготавливает presentation-model позиций во ViewModel и
|
||
рендерит чистые view-компоненты. Акции и облигации выводятся одним широким
|
||
вариантом Position Card: в нём есть логотип, идентификатор, стоимость,
|
||
доходность, средняя цена и доля. Текущие требования задают состав метрик,
|
||
одноколоночность, логотип и цветовую семантику дохода, но не закрепляют
|
||
внутреннюю визуальную иерархию карточки.
|
||
|
||
Изменение остаётся в presentation layer: состав Portfolio, ViewModel-данные,
|
||
маршруты и интерактивные действия не меняются. У страницы нет действия для
|
||
Position Card, поэтому клавиатурный focus-стиль должен быть только следствием
|
||
имеющегося focusable-элемента, а не превращать карточку в контрол.
|
||
|
||
## Goals / Non-Goals
|
||
|
||
**Goals:**
|
||
|
||
- Сделать стоимость и доходность акции визуально первичными, а идентификатор и
|
||
служебные метрики — спокойным вторым уровнем без конкурирующих акцентов.
|
||
- Сохранить цветовую семантику доходности без отдельного badge, фона или
|
||
декоративной иконки.
|
||
- Сохранить читаемость одноколоночной карточки на узком и широком экранах.
|
||
|
||
**Non-Goals:**
|
||
|
||
- Изменение состава, вычисления или форматирования данных Portfolio.
|
||
- Изменение карточек облигаций и других типов позиций, порядка секций,
|
||
навигации, кликабельности или API.
|
||
- Добавление новых UI-библиотек, токенов, изображений либо интерактивных
|
||
состояний без существующего контролa.
|
||
|
||
## Decisions
|
||
|
||
### D1 — Визуальный вариант передаётся для секции акций
|
||
|
||
Position Section передаёт в существующую карточку presentation-only вариант для
|
||
`STOCK`. Это позволяет сделать акцию выразительнее и оставить карточки
|
||
облигаций в поставленном виде без копирования разметки или расхождения метрик.
|
||
Альтернатива — отдельная Stock Card — отклонена: она дублирует уже общий
|
||
контент карточки и повышает риск расхождения при будущих изменениях метрик.
|
||
|
||
### D2 — Две главные зоны и одна тихая мета-строка
|
||
|
||
Главная строка имеет только две зоны: слева логотип, название и одна
|
||
объединённая строка количества с ISIN; справа — текущая стоимость и доходность
|
||
простым цветным текстом. Средняя цена и доля переходят в единую приглушённую
|
||
мета-строку под разделителем. Локальная CSS-сетка обеспечивает устойчивое
|
||
выравнивание, усечение длинного имени и перенос метаданных без изменения DOM
|
||
порядка или доступных текстовых значений. Альтернатива — отдельные вложенные
|
||
карточки/панели — отклонена: лишняя декоративная вложенность ослабляет
|
||
плотность списка.
|
||
|
||
### D3 — Доходность остаётся текстовой метрикой
|
||
|
||
Доходность использует только существующие positive/negative theme colors и
|
||
умеренную насыщенность шрифта; ни фон, ни скруглённый контейнер не создаются.
|
||
При нулевой доходности цветной treatment не применяется. Альтернатива — новая
|
||
палитра или иконка направления — отклонена: цвет и знак уже передают нужный
|
||
сигнал, а дополнительный символ создаёт шум.
|
||
|
||
### D4 — Hover и focus не добавляются к некликабельной карточке
|
||
|
||
Карточка остаётся неинтерактивной. Допустим только ненавязчивый hover для
|
||
визуального отклика указателя; focus-стиль не добавляется, потому что Card не
|
||
участвует в keyboard navigation. Альтернатива — сделать карточку button/link —
|
||
отклонена как выходящая за границы change навигационная функция.
|
||
|
||
## Delivery Map
|
||
|
||
| Area | Status | Architectural outcome or N/A reason |
|
||
| --- | --- | --- |
|
||
| frontend | `affected` | Position Card получает presentation-only вариант акции и локальные стили группировки, статуса доходности и адаптивной компоновки; существующие page tests уточняют ожидаемую разметку акций. |
|
||
| backend | `N/A` | Контракт, data fetching и финансовые расчёты Portfolio не меняются. |
|
||
| specs | `affected` | Change хранит утверждённые Proposal и Design с `skip_specs: true`, поскольку существующие требования уже покрывают состав и семантику карточки. |
|
||
| docs | `affected` | As-built описание Portfolio кратко фиксирует уточнённую визуальную иерархию карточек акций после поставки. |
|
||
|
||
### Contract Gate Decision
|
||
|
||
| Gate | Status | Reason |
|
||
| --- | --- | --- |
|
||
| runtime-openapi | `N/A` | Ни backend, ни frontend API contract и generated snapshot не меняются. |
|
||
|
||
## Risks / Trade-offs
|
||
|
||
- Длинное имя инструмента может конкурировать с суммой на узком экране → имя
|
||
остаётся усечённым, а стоимость занимает приоритетную правую область.
|
||
- Слишком заметная доходность может перегрузить список → используется только
|
||
существующий цвет текста без фона, badge или отдельной иконки.
|
||
- Различие внешнего вида акций и облигаций может восприниматься как
|
||
несогласованность → оно ограничено явной пользовательской целью и не меняет
|
||
общий набор метрик, одноколоночность или логотип.
|
||
|
||
## Migration Plan
|
||
|
||
Поставка ограничена обратимой заменой presentation-разметки и локальных
|
||
стилей frontend, затем обновлением as-built documentation. Данные, миграции и
|
||
совместимость между приложениями не затрагиваются.
|
||
|
||
### Rollback Contract
|
||
|
||
| Field | Decision |
|
||
| --- | --- |
|
||
| Status | `N/A` |
|
||
| Reason | Change не меняет security, данные, миграции, публичный контракт или другое труднообратимое решение; прежний вид возвращается обратимой правкой frontend presentation layer. |
|
||
| Trigger | N/A |
|
||
| Actions | N/A |
|
||
| Data safety | N/A |
|
||
| Verification | N/A |
|