+ );
+}
+```
+
+- [ ] **Шаг 2: Проверить сборку**
+
+Run: `npm run build:frontend`
+Expected: без ошибок
+
+- [ ] **Шаг 3: Проверить линтер**
+
+Run: `npm run lint`
+Expected: без ошибок
+
+- [ ] **Шаг 4: Проверить форматирование**
+
+Run: `npm run format`
+Expected: без изменений
diff --git a/docs/superpowers/specs/2026-06-14-portfolio-allocation-chart-design.md b/docs/superpowers/specs/2026-06-14-portfolio-allocation-chart-design.md
new file mode 100644
index 0000000..8ca9da8
--- /dev/null
+++ b/docs/superpowers/specs/2026-06-14-portfolio-allocation-chart-design.md
@@ -0,0 +1,54 @@
+# Диаграмма распределения портфеля — Спецификация
+
+## Обзор
+Добавить аналитическую диаграмму (donut) на страницу детального просмотра портфеля, показывающую распределение стоимости между акциями и облигациями, с количеством позиций в легенде.
+
+## Источник данных
+`PortfolioDetail.positions[]` — бэкенд уже возвращает:
+- `type: 'share' | 'bond'`
+- `currentValue: number | null`
+- `quantity: number`
+
+Агрегация на клиенте. Изменений бэкенда не требуется.
+
+## Компонент: `AllocationChart`
+- Чистый SVG (два сектора + текст в центре)
+- Без внешних зависимостей
+- Размещается внутри `PortfolioSummary` первым ребенком flex-ряда
+- В центре — общая стоимость портфеля (или «Нет позиций»)
+- Справа — легенда с разбивкой по типу: количество / процент
+
+### Цветовая схема
+| Сектор | Цвет | Легенда |
+|--------|------|---------|
+| Акции | `var(--color-primary)` / #1976d2 | `Акции: N / XX.X%` |
+| Облигации | #f57c00 | `Облигации: N / XX.X%` |
+
+### Состояния
+- **Обычное (оба типа):** две дуги пропорционально стоимости, в центре — сумма
+- **Один тип (только акции или только облигации):** полный круг цветом сектора
+- **Пусто (нет позиций):** серый круг, в центре «Нет позиций»
+
+### Расположение
+```
+┌────────────────────────────────────────────────────────┐
+│ [⭕ donut] Общая стоимость Позиций │
+│ [xxx,xxx] xxx,xxx.xx RUB 12 │
+│ Акции: 8 / 70.5% │
+│ Облигации: 4 / 29.5% │
+└────────────────────────────────────────────────────────┘
+```
+
+## Изменяемые файлы
+
+### Новый
+- `apps/frontend/src/components/portfolios/AllocationChart.tsx`
+
+### Изменяемый
+- `apps/frontend/src/components/portfolios/PortfolioSummary.tsx` — импорт и рендер `AllocationChart`
+
+## Граничные случаи
+
+- `currentValue === null` — считается как 0
+- У всех позиций `currentValue === 0` — серый круг, в центре «0»
+- Один из типов отсутствует (0 позиций) — в легенде `0 / 0.0%`, дуга заполняет 100% для непустого типа