diff --git a/openspec/changes/archive/2026-08-26-polish-stock-position-cards/.openspec.yaml b/openspec/changes/archive/2026-08-26-polish-stock-position-cards/.openspec.yaml new file mode 100644 index 0000000..0368522 --- /dev/null +++ b/openspec/changes/archive/2026-08-26-polish-stock-position-cards/.openspec.yaml @@ -0,0 +1,8 @@ +schema: wealth-ledger-sdd +created: 2026-08-26 +skip_specs: true +goal: Сделать карточки акций в портфеле визуально более читаемыми без изменения данных и взаимодействий. +affected_areas: + - frontend + - specs + - docs diff --git a/openspec/changes/archive/2026-08-26-polish-stock-position-cards/README.md b/openspec/changes/archive/2026-08-26-polish-stock-position-cards/README.md new file mode 100644 index 0000000..5835db4 --- /dev/null +++ b/openspec/changes/archive/2026-08-26-polish-stock-position-cards/README.md @@ -0,0 +1,3 @@ +# polish-stock-position-cards + +Визуально уточнить отображение акций в портфеле без изменения состава данных и взаимодействий. diff --git a/openspec/changes/archive/2026-08-26-polish-stock-position-cards/design.md b/openspec/changes/archive/2026-08-26-polish-stock-position-cards/design.md new file mode 100644 index 0000000..5cb7cd2 --- /dev/null +++ b/openspec/changes/archive/2026-08-26-polish-stock-position-cards/design.md @@ -0,0 +1,109 @@ +## 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 | diff --git a/openspec/changes/archive/2026-08-26-polish-stock-position-cards/proposal.md b/openspec/changes/archive/2026-08-26-polish-stock-position-cards/proposal.md new file mode 100644 index 0000000..2e6dd5f --- /dev/null +++ b/openspec/changes/archive/2026-08-26-polish-stock-position-cards/proposal.md @@ -0,0 +1,36 @@ +## Why + +Карточки акций уже показывают нужные данные, но их визуальная иерархия слабо +подчёркивает главные для портфеля ориентиры: название инструмента, текущую +стоимость и доходность. Второстепенные сведения конкурируют с ними за внимание, +а строка доходности не отделена визуально от остальных метрик. + +## What Changes + +- Уточнить визуальную иерархию карточки акции: данные об инструменте, текущей + стоимости и доходности должны считываться как три самостоятельные группы. +- Сделать доходность заметным компактным статусом с сохранением существующей + цветовой семантики положительного и отрицательного результата. +- Привести отступы, выравнивание и состояния наведения/клавиатурного фокуса к + единому аккуратному виду на узких и широких экранах. +- Не менять состав данных, порядок акций, секции портфеля, вычисления, API, + навигацию или кликабельность карточек. + +## Capabilities + +### New Capabilities + +Нет: change уточняет визуальное оформление уже поставленного отображения +Portfolio Position и не вводит нового наблюдаемого поведения. + +### Modified Capabilities + +Нет: требования существующих capabilities не меняются; это presentation-only +уточнение в пределах текущей реализации. + +## Impact + +- Пользователь страницы портфеля быстрее различает инструмент, его стоимость и + результат инвестирования в списке акций. +- Затрагивается frontend presentation-layer карточек акций и его локальные + стили. Backend, API, состав и расчёт данных, а также зависимости не меняются. diff --git a/openspec/changes/archive/2026-08-26-polish-stock-position-cards/tasks.md b/openspec/changes/archive/2026-08-26-polish-stock-position-cards/tasks.md new file mode 100644 index 0000000..974d495 --- /dev/null +++ b/openspec/changes/archive/2026-08-26-polish-stock-position-cards/tasks.md @@ -0,0 +1,21 @@ +## 1. Frontend presentation + +- [x] 1.1 [frontend] Перестроить presentation-only вариант карточки `STOCK` в две главные зоны с единой мета-строкой, убрав badge и сохранив вид облигаций и иных позиций. + - **Covers:** `N/A` — change не вводит самостоятельного requirement: задача реализует утверждённое Design в пределах уже поставленного отображения Portfolio Position. + - **Verification:** Обновить существующий тест страницы для разметки акции и выполнить `npm run verify` в `frontend`. + +## 2. As-built documentation and planning verification + +- [x] 2.1 [docs] Обновить as-built описание Portfolio кратким описанием двухзонной визуальной иерархии карточки акции после проверенной поставки. + - **Covers:** `N/A` — документирует фактический результат presentation-only change, не создавая параллельную requirements specification. + - **Verification:** Выполнить `npm run verify` в `docs` и проверить локальную ссылочную корректность изменённого feature document. + +- [x] 2.2 [specs] Выполнить structural validation утверждённых planning artifacts с зафиксированным `skip_specs: true` и проверить отсутствие whitespace ошибок в SDD authority. + - **Covers:** `N/A` — change не имеет Delta Requirements; задача проверяет канонический SDD artifact и его delivery metadata. + - **Verification:** Выполнить strict change validation через `openspec validate polish-stock-position-cards --type change --strict --store wealth-ledger-specs` и `git diff --check` в `specs`. + +## 3. Cross-area completion + +- [x] 3.1 [workspace] Сверить поставленное frontend presentation behavior с Proposal и Design, затем выполнить canonical workspace dispatcher и independent read-only review перед archive. + - **Covers:** `N/A` — workspace владеет только межрепозиторной semantic verification и review, а не реализацией требования. + - **Verification:** Выполнить `bash specs/scripts/verify-workspace-change.sh polish-stock-position-cards` из workspace root и зафиксировать отсутствие Critical/Important findings в review.