00

Логотип и бренд

Единый источник знака — src/assets/brand.js (MA_BRAND). Перерисовывать запрещено: любая поверхность (страница, лендинг, favicon, письмо) берёт ICON_SVG / ICON_SHORT_SVG / WORDMARK_HTML отсюда. Ниже — знак в обеих темах ОДНОВРЕМЕННО (без переключения), в полной и компактной форме.

Светлая тема
Полный
Компактный
Тёмная тема
Полный
Компактный
Как использовать в любой сессии / репозитории
  • Код: MA_BRAND.ICON_SVG — полный знак; MA_BRAND.ICON_SHORT_SVG — компактный «МА»; MA_BRAND.WORDMARK_HTML — вордмарк. Источник — src/assets/brand.js. Брать оттуда, НЕ рисовать заново.
  • Цвета знака (фикс., одинаковы в обеих темах): #5b6ef5 бренд · #8b5cf6 градиент · #34d96b линия роста.
  • Бренд-синий vs UI-акцент (канон 2026-06-07). «Ассист» в вордмарке = var(--brand) = #5b6ef5 — ЕДИНЫЙ бренд-синий, совпадает со знаком, фикс. в обеих темах. «Маркетплейс» = var(--text) (нейтральный, адаптируется к фону для читаемости). UI-акцент var(--accent) (#2563eb светлая / #6e80f7 тёмная) — ОТДЕЛЬНЫЙ токен для кнопок/ссылок (тюнингуется под контраст по теме). Логотип НЕ использует --accent.
  • Запрещено: старый «4-квадратный» знак; перекрашивать знак под тему; растягивать непропорционально; менять ₽-медальон.
  • Центральный реестр ВСЕХ брендов (имя / цвета / адрес / где лежит лого + прямые ссылки): Bitrix24-www/brands/. Подхват в сессии — скилл brand-registry (по словам «логотип / бренд»).
  • Этот раздел /design-system/#brand — визуальный эталон знака МА (прямая ссылка для других сессий и реестра).
01

Основы

Палитра

Все цвета — только через CSS-переменные из theme.css. Хардкод HEX в коде продукта запрещён.

Тёмная тема data-theme="dark"
Светлая тема data-theme="light"

Типографика

Системный шрифт: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif. Базовый размер: 15px (body), 13px для элементов UI.
Правило h1: в заголовке страницы — 20px (page-header); в диалоге/блоке — 18px; в общем тексте — 22px (.h1 helper).

.h1 / 22px 700Заголовок первого уровня
.h2 / 16px 700Заголовок второго уровня
.h3 / 14px 600Заголовок третьего уровня
body / 13px 400Основной текст страницы — описания, метки, данные
.small-text / 12pxМелкий вспомогательный текст, аннотации
.label-text / 11px 600 upperМЕТКА КОЛОНКИ / KPI
.text-mutedПриглушённый текст — подсказки, вторичная информация
code / monospace--accent: #6e80f7 / var(--space-4)

Сетка и отступы

8pt-сетка: все отступы кратны 4px. Ритм форм: label→control 8px (--space-2), между полями 16px (--space-4).

Радиусы и тени

Правило таблиц: AG Grid / data-таблицы — flush (radius 0). Карточки, поповеры, модалки — --radius-md или --radius-lg.

02

Компоненты

Кнопки

Классы из base.css:181. Один размер по умолчанию, модификаторы .btn-sm / .btn-lg.

ВариантRestHover (наведение)Active (нажато)Disabled
.btn-primary
.btn-ghost
.btn-warning
.btn-sm
.btn-lg
ДЫРА: base.css не задаёт явный :disabled стиль. Предложенный стандарт: opacity: 0.5; cursor: not-allowed; pointer-events: none; — применяется через .ds-hover-demo в этой спеке как демонстрация. Применить глобально в base.css.

Переключатели и ползунки

Сегментный контрол существует (base.css:227). Switch-тогл и range-ползунок — ПРЕДЛОЖЕННЫЙ СТАНДАРТ (в продукте отсутствуют).

Сегментный контрол .btn-group .btn-toggle существующий
Switch / iOS-тогл ПРЕДЛОЖЕННЫЙ СТАНДАРТ
Компактный вид (выкл.)
Компактный вид (вкл.)
Недоступно
Range slider ПРЕДЛОЖЕННЫЙ СТАНДАРТ

Инпуты и формы

Классы из base.css:249. Ритм формы: метка → контрол 8px; между полями 16px.

СЕЙЧАС — разрыв 0px
СТАНДАРТ — метка→контрол 8px, между полями 16px
.input
.input-sm
.select
:focus

Карточки и KPI

Два класса: .kpi-card (base.css:142, примитив) и .kc-card (kpi-card.js/css, компонент с состояниями).

АНТИПАТТЕРН: дублируют друг друга. .kpi-card — CSS-примитив, .kc-card — JS-компонент (state/loading/trend/href). Рекомендация: консолидировать на .kc-card (через KPICard.create), удалить прямое использование .kpi-card. Отметить как P2 бэклог.
.kpi-card (примитив, base.css)
Выручка
1 234 567
▲ +12,3%
За выбранный период
Маржа
18,4 %
▼ −2,1%
Net после всех вычетов
Возвраты
342
— нет данных
.card (карточка контента, base.css:124)
Обычная карточка
border-radius: var(--radius-md); border: 1px solid var(--border)
Кликабельная карточка
.card-clickable — cursor pointer, translateY(-1px) hover

Бейджи и статусы

Базовые бейджи base.css:369
accent success warning error скоро
Статус-бейджи сайдбара app-sidebar.js:486
ГОТОВО БЕТА NEW DEV
Chips / Period-chips base.css:348

Тулбар-кнопки

Канон — src/analytics/styles.css:192. Сегодня page-specific — каждая страница переопределяет. Здесь документируется как стандарт портала.

ЗАДАЧА: перенести .tb-btn / .tb-btn-icon / .tb-link-btn / .tb-gbtn в src/assets/base.css или отдельный toolbar.css. Сейчас каждая страница копирует ~80 строк CSS.
Стандартный тулбар AG Grid
Состояния
.tb-btn (rest)
.tb-btn.active
.tb-btn disabled
.tb-btn-icon
.tb-btn-icon.active
.tb-link-btn
.tb-link-btn.active

Тосты и алерты

⚠️
Предупреждение — .alert-warn
🚫
Ошибка — .alert-error
ℹ️
Информация — .alert-info

Тосты (error-toast.js): авто-дисмисс, стеками вверх-справа. Тип error / warning / info. Нет собственных классов — inline-стили (технический долг, кандидат на рефакторинг под .alert-*).

03

Таблицы — AG Grid Community 32.3.3

Один табличный движок на весь портал. Эталон: src/analytics/ma-aggrid.js. Таблица на всю ширину; режим/возможность выбирается выпадающим списком над таблицей.

Выберите возможность — таблица покажет её в действии, ниже появится инструкция.
Выберите возможность из списка выше — здесь появится инструкция, что сделать с таблицей, чтобы её попробовать.

Лёгкие таблицы дашборда — упрощённый грид (без тулбара)

Решение (2026-06-07, по логике проекта): дашбордные SKU-таблицы — это ТОТ ЖЕ движок AG Grid, просто в УПРОЩЁННОМ режиме (без тулбара, минимум колонок, фикс. короткий список). Не плодим отдельные виджеты — один табличный движок на всё, меняется только конфигурация. Это снимает разнобой и техдолг.

Один движок — 3 режима (а не 3 разных элемента)
  1. Полный грид — данные селлера: тулбар, сортировка / фильтр / группировка, виртуализация, Σ Итого. Эталон: /analytics/, /pricing/.
  2. Упрощённый грид (БЕЗ тулбара) — дашборд: фикс. короткий список (топ-5/10), product-ячейка (фото + название + SKU) + метрики. Тот же AG Grid, конфиг минимальный (без тулбара, без фильтров, autoHeight). Сюда переезжают «Самые прибыльные/убыточные» и сводка категорий.
  3. Презентационная <table data-adr-0002-exempt> — ТОЛЬКО крошечная статика (2–4 строки, без данных селлера, без интерактива), где движок реально избыточен (напр. справочная таблица в модалке).
Тест: данные селлера в таблице → AG Grid (полный или упрощённый — по наличию тулбара). Чистая статика 2–4 строки → презентационная таблица. Отдельных «виджетов-таблиц» НЕ заводим.
Упрощённый грид без тулбара — КАНОН дашборд-таблиц (product-ячейка + метрики, тот же AG Grid)
Как СЕЙЧАС на дашборде (.top-item, легаси) → канон: упрощённый грид выше. Мигрировать.
1
📦
Регилин плоский 4,5 см
A-1001
+33 598 ₽
17,3%
2
📦
Фоторамка 15×21 дерево
C-3020
+18 920 ₽
21,4%
3
📦
Лейка садовая 2 л
B-2012
−1 840 ₽
−7,2%
Презентационная таблица <table data-adr-0002-exempt> — статическая сводка
КатегорияТоваровСр. маржаНа складе
Дом и сад14219,4%3 210
Рукоделие8624,1%1 740
Декор5312,8%920
СПЕЦ — упрощённый грид (канон дашборд-таблиц)
Фиксированодвижок AG Grid (тот же, что на /analytics/); без тулбара; product-ячейка = фото 32px + название + SKU; числовые колонки по правому краю; числа MA_Format / tabular-nums; autoHeight (без внутр. скролла для короткого списка); только токены
Допускикол-во строк (топ-5/10); набор колонок; опц. сортировка по шапке (но без тулбара); цвет прибыли pos/neg; клик по строке → переход
Запрещенобспоке-вёрстка таблицы вместо движка; полный тулбар (тогда это «полный грид»); своя локальная копия стилей; презентационная <table> для данных селлера (только статика 2–4 строки)
Где применяется/dashboard/ (топ SKU, категории) · /owner-dashboard/ · мини-таблицы в модалках. Легаси .top-item — мигрировать на упрощённый грид
04

Паттерны

Шапка страницы (page-shell)

Канон из page-shell.css. Классы: .biz-panel / .biz-row / .header-period / .hs-accent / .hs-accent.pos / .hs-accent.neg.

Аналитика — пример шапки
Выручка 1 234 567 ₽

Контрол периода — канонное расположение

Эталон: src/analytics/ — 2-я строка, слева. Страницы с контролем справа-вверху (returns, advertising) — отклонение. Подробнее в Антипаттернах.

КАНОН (analytics)
Строка 1: [h1] [маржа] [sync-status]
Строка 2: [период ←] [тоглы режима] [spacer] [кнопки экспорта]

MA_Format — единственный способ форматирования чисел

window.MA_Format.fmt(n, opts) из format-utils.js. Никаких локальных function fmt() в page-specific коде.

Порядок кнопок тулбара и правило «compact ON по умолчанию»

Canonical order: [режим] [свернуть] [Компакт✓] [Тепловая] [Σ Итого] [настройки⚙] | [Сбросить] [CSV/Excel].
Компактный вид должен быть включён по умолчанию на всех страницах с AG Grid (analytics ✓, pricing ✓, my-expenses ✓; returns ✗, advertising ✗ — отклонение).

05

Антипаттерны

Реальные расхождения из аудита 2026-06-04. Каждый — доказательство из кода (файл:строка).

A — Скруглённые углы таблицы
СЕЙЧАС
aggrid-theme.css:56
--ag-wrapper-border-radius: 8px

Таблица с radius 8px — углы округлые, видно через border
СТАНДАРТ
Таблицы — вровень (flush). Правка:
aggrid-theme.css:56:
--ag-wrapper-border-radius: 0px

Одна правка в shared-файле → все страницы.
Карточки / поповеры / модалки — var(--radius-md).
B — Контрол периода прыгает между страницами
СЕЙЧАС
returns, advertising: контрол периода в верхней строке, справа.
src/returns/index.html:~40
src/advertising/index.html:~38

Селлер переключается между страницами — период «прыгает».
СТАНДАРТ
Эталон: src/analytics/ — строка 2, слева.
Правило: период всегда в 2-й строке шапки, первый элемент слева.
Применить на returns и advertising при следующем рефакторинге шапки.
C — Компактный вид выключен по умолчанию на части страниц
СЕЙЧАС
returns, advertising: compact OFF по умолчанию — таблица высокая, меньше строк видно.
src/returns/returns.js
src/advertising/advertising.js
СТАНДАРТ
Compact ON по умолчанию везде (analytics ✓, pricing ✓, my-expenses ✓).
Строка 34px → 26px + скрытие фото-колонок.
Правка: инициализировать compact: true в начальном состоянии тулбара.
D — Кнопки: разные имена и состояния для одной функции
СЕЙЧАС
Адаптивные спаны (.tb-full / .tb-compact) на analytics/pricing, но плоский текст на returns/advertising.
⚙ Настройки отсутствует на returns, advertising.
«Группировка» на advertising vs «По группам» на others.
СТАНДАРТ
Правило: один лейбл + одно поведение на одну функцию. Везде.
Адаптивные спаны — на всех страницах.
⚙ Настройки — присутствует на всех страницах с колонками.
Canonical labels: «☰ Компакт», «≡ По группам», «⊡ Свернуть».
E — KPI-карточки без hover-тултипа (метрика + взаимосвязи)
СЕЙЧАС
dashboard, owner-dashboard: KPI-карточки без title= и без hover-тултипа.
kpi-card.js/css: нет title в записи инвентаря.

Селлер видит число — не знает, что с ним делать и как оно связано с другими.
СТАНДАРТ
Правило: каждый числовой элемент UI имеет тултип с:
(1) что означает эта метрика,
(2) как она вычислена,
(3) прямые взаимосвязи (на что влияет).
Реализация: title= на .kc-card + headerTooltip на AG Grid-колонках.
F — Хардкод-цвета вместо токенов / дубль KPI (.kpi-card vs .kc-card)
СЕЙЧАС
В page-specific CSS встречаются: background: rgba(110,128,247,0.3), color: #ef4444.
Два класса KPI: .kpi-card (base.css) и .kc-card (kpi-card.js) — дублируют структуру.
СТАНДАРТ
Только var(--accent-light), var(--error) и т.д.
Канонный KPI-компонент: KPICard.create() (kpi-card.js) → state/loading/trend/href.
Прямое .kpi-card — только для presentational демо. Долг: убрать дубль.
06

Чеклисты QA и Definition of Done

Обязательные проверки перед каждым мержем UI-изменений.

Форма и ритм
  • Метка → контрол: ровно 8px (--space-2)
  • Между полями формы: 16px (--space-4)
  • Нет перекрытий label / input на любом viewport
  • Шрифт инпутов/кнопок: font-family: inherit
Таблицы
  • AG Grid radius = 0 (flush, не скруглён)
  • Одна горизонтальная полоса прокрутки
  • Compact ON по умолчанию
  • Σ Итого — серверный summary, не пересчёт клиента
  • Нет manual <table> без data-adr-0002-exempt
Тултипы
  • Каждая колонка AG Grid: headerTooltip
  • Каждая KPI-карточка: title с метрикой + взаимосвязями
  • Тултип = «что это» + «как считается» + «что делать»
  • Иконки с семантикой: title или aria-label
Контрол периода
  • 2-я строка шапки, левый элемент
  • Канон: как в src/analytics/
  • Не в верхней строке; не справа от h1
Кнопки и лейблы
  • Один лейбл на одну функцию во всём портале
  • ⚙ Настройки есть на всех страницах с колонками
  • Адаптивные спаны (.tb-full / .tb-compact) везде
  • disabled: opacity 0.5, cursor not-allowed
Цвета и токены
  • Нет хардкода HEX в production CSS
  • Только var(--name) из theme.css
  • Обе темы (dark + light) визуально корректны
  • MA_Format для всех числовых значений
Паритет тем
  • Переключить data-theme в CDT — нет «белых пятен»
  • Иконки/свг читаемы в обеих темах
  • Токены контраста: --text на --bg ≥ 4.5:1
Числа и формулы
  • Все числа через window.MA_Format.fmt()
  • Нет локальных function fmt(n)
  • null → «—», не «0» или пустая строка
  • T1-сверка: итог = Σ строк (до копейки)
07

Принятие решений / Утверждения

Живой реестр: что выбрали, к чему пришли и почему. Через него отбираем все элементы портала и приводим сайт к единому виду. Наполнение — на PL.

Тулбар и призмы — решения и развилки (29.07.2026). Зоны тулбара, знаки, подсказки, строка призм и канон строки режимов — принятое отрисовано боевыми контролами, открытое собрано рамками «варианты — отметить один». Перейти к блоку
Обязательное правило раздела — работа в паре с субагентами

Каждое решение готовится не в одиночку, а конвейером ролей:

  • Аналитик — ЧТО выделить / акцентировать, приоритет (данные из карты применения).
  • Дизайнер (UI-Architect) — КАК: токены, цвет, шрифт, размер, состояния.
  • Frontend — внедряет утверждённое в код.
  • QA — верифицирует (обе темы, без регресса).
  • Librarian — фиксирует решение в реестр / ADR (история).

Предлагает пара Аналитик + Дизайнеррешает Александр → Frontend внедряет → QA верифицирует → Librarian записывает.

16

Тулбар и призмы

Решения от 29.07.2026 по панели над таблицей и строке призм. Первая половина — уже принятое, отрисованное боевыми контролами: их не выбирают, на них смотрят и по ним делают. Вторая — развилки, каждая в рамке «варианты — отметить один», каждый вариант — настоящая строка, а не описание словами. Отметки сохраняются в браузере. Документ-первоисточник — docs/design-system/DECISIONS-toolbar-and-prisms-2026-07-29.md.

Принято

1 · Тулбар: зоны и порядок принято

Движковые кнопки (те, что работают одинаково в любом разделе) — пиктограммы 28×28 с подсказкой. Кнопки со смыслом только своего раздела остаются словами и живут в своей строке над таблицей. Порядок зон: строки, колонки, поиск (забирает всё свободное место), что видно и как подкрашено, выгрузки и настройки. Панель ниже собрана из боевых знаков движка: «Перенос строк» в зоне строк взята из каталога MA_TableShell.TOOLBAR_ICONS, а не перерисована здесь второй раз.

2 · Форма кнопки и защита от случайного щелчка принято

Значок — жёсткий квадрат 28×28, включение меняет ТОЛЬКО заливку: ширина кнопки не зависит от состояния. Проверка встроена в блок — кнопка ниже щёлкает все кнопки панели и сравнивает ширины до и после.

Ни одна ширина не должна измениться.
Действие ≠ переключатель

«Колонки по умолчанию», «Сжать колонки», «Сбросить фильтры» не имеют состояния «включено» — они никогда не подсвечиваются акцентом. Защита разная по весу последствий: окно подтверждения там, где теряется настроенное вручную и вернуть нечем; сообщение с «вернуть как было» — там, где потеря мелкая и частая.

Где селлер может потерять свою настройку

3 · Подсказки: единый формат и переименования принято

Формат один для всех: Название. Что делает и за счёт чего. Первое слово подсказки = название кнопки, дальше объяснение словами селлера. Наведите на любой знак в карточках ниже — увидите ровно тот текст, который уйдёт в код.

4 · Знаки кнопок выбраны, кроме «Цены»

Пиктограммы приняты как форма; знаки выбраны — щелчок по варианту меняет отметку и сохраняет её. Стрелки скачивания и обмена — одно семейство: общий лоток, одинаковая длина стержня и головы. Единственный неутверждённый знак — у кнопки «Цены»: он поедет вместе с её именем, развилка ниже.

5 · Строка призм принято

Собрано ровно из выбранных 29.07 осей: невыбранные призмы получают лёгкую заливку (видно, что это кнопки); режимы общих расходов живут внутри кнопки «Прогноз» на приглушённой подложке; кнопка не раскрывается и не сжимается — ширина постоянная, при другой призме режимы просто приглушаются; расшифровка — подсказка на каждом режиме плюс знак на полное окно; предупреждение о незакрытом периоде — жёлтая капсула в конце той же строки.

Что это заменяет

Было: строка призм плюс отдельная жёлтая плашка-баннер под ней. Плашка уходит внутрь строки, таблице возвращается её высота.

Объяснение режимов — на числах

Открывается по знаку в строке призм. Итог периода одинаков в обоих режимах — меняется только раскладка.

6 · Канон строки режимов принято

Одна строка держит разнородное: режимы разбивки (по SKU / по заказам / по склейкам), кнопку состояния «Ожидают», оси-сегменты («Числа», «Отгрузка»), фильтры конкретного раздела («Реклама») и вход в «Сводку». Канон один для всех разделов: слева режимы и состояние, затем оси в порядке «Числа», «Отгрузка», раздел-специфичные, «Сводка» прижата вправо. Слово-подпись оси уходит целиком, остаётся только знак справки — и он стоит ПОСЛЕ сегмента, ровно так же, как в строке призм.

7 · Чем помечаем новинку выкачено

Было — звёздочки-искры: опознавательный знак AI-генерации, на нём продукт читается как сделанный машиной. Стало — флажок-вымпел: знак отметки-вехи, «здесь появилось что-то, на что стоит взглянуть». Знак уже в коде и рисуется одним источникомMA_Glyphs.newFeature() из src/assets/ma-glyphs.js; четыре прежние копии убраны.

8 · Индикация загрузки и потолок ожидания сделано 30.07

Процентов нет намеренно: страница шлёт один запрос и не знает, что сервер уже успел сделать. Шкала, застрявшая на 80 %, хуже честного счётчика секунд. Показываем три факта, которые страница действительно знает, плюс бегущую полосу и счётчик.
🔴 Главное — не картинка, а потолок. До этой правки ограничения по времени не было вовсе: обрыв срабатывал, только когда селлер сам запускал новый запрос. Молчащий сервер = вечное ожидание. Теперь через 3 минуты запрос обрывается и селлеру предлагается выход.

Кнопки ниже показывают настоящую панель — тот же код, что на боевых страницах (src/assets/ma-load-progress.js). Потолок в показе укорочен до 6 секунд, чтобы не ждать три минуты.

Замер на боевых данных (1714 товаров): месяц — 1,7–3,3 с, год — 13 с, 2,5 года — 13–15 с. Поэтому подсказка кнопки говорит «до одной минуты», а не «до нескольких минут»: прежняя формулировка замером не подтвердилась.

Развилки — ждут решения

9 · Строка «ИТОГО», когда включён фильтр или поиск ждёт решения

Сейчас строка «ИТОГО» всегда показывает весь период. Селлер отбирает 128 товаров из 428, смотрит вниз — и видит цифру, которая к отобранному не относится. Ни подписи, ни признака, что это не про них.

🔴 Что важно понимать про число «найденного». Это сложение уже посчитанных строк, а не новый расчёт. Налог считается нелинейно, поэтому сумма по отобранным строкам — это не «прибыль, как если бы у вас были только эти товары». Отсюда и подпись «найдено 128 из 428», а не «прибыль по выбранным»: мы честно говорим, что это подытог, а не отдельный расчёт.

Варианты — отметить один

10 · Кнопка «Цены»: имя, поведение и ограничение ждёт решения

Проверено в коде src/pricing/pricing-ag.js: на Wildberries кнопка видна, но выключена с подсказкой «Пока только для Ozon» (строка 672), и обработчик закрывает вход повторно (строка 5946). Механизм заполнения ищет колонку шаблона Ozon «Новая цена (со скидкой)» — пути для WB в коде нет вовсе. Значит, нейтральное имя «Цены» обещает больше, чем кнопка умеет. Вместе с именем едет и знак — он единственный неутверждённый.

Варианты — отметить один

11 · Стрелки «Excel» и «Цены» — одно семейство или два ждёт решения

Продолжение развилки 10 — про сам знак. Решение 29.07 говорит: «стрелки скачивания и обмена — одно семейство: общий лоток, одинаковая длина стержня и головы». Замер 30.07 показал, что семейства нет. Лоток у обоих знаков действительно один и тот же путь, а дальше расходятся: у «Excel» стержень 12 единиц и голова 5, у «Цен» — стержень 9 и голова 3.5. Обе кнопки стоят вплотную в правой группе «Экономики», поэтому разница видна без всякого сравнения. Числа под каждым вариантом — замеренные браузером (длина штриха берётся у самого пути), а не выписанные на глаз; рисунок и таблица собираются из одних и тех же чисел, поэтому разойтись не могут. Первоисточник замера — docs/audit/_evidence/toolbar-buttons-conformance-2026-07-30.md, пункт D6.

🪤 Почему у стрелки обмена вообще другая голова. Стрелок в квадрате две, а места столько же. Знак «Excel» — не наша выдумка: он совпадает с иконкой download библиотеки Lucide, из которой взят весь набор значков портала. То есть чужеродная в паре — стрелка обмена, и вопрос ровно один: подтянуть её к «Excel» числом в число (вариант А) или по правилу самой библиотеки, которая при двух стрелках уменьшает голову (вариант Б).

Варианты — отметить один

12 · «Сжать колонки» делает разное на разных страницах ждёт решения

Одна кнопка, один знак, одна подсказка — и два несовпадающих поведения. Проверено чтением кода: в «Аналитике» она возвращает объявленные ширины из определения колонок (analytics/ma-aggrid.js, compactCols), а в «Экономике», «Возвратах», «Рекламе» и «Моих расходах» — растягивает колонки так, чтобы они заняли ровно ширину экрана (sizeColumnsToFit). На узкой таблице второе поведение колонки не сжимает, а раздувает.

Варианты — отметить один

13 · Видимый признак включённых фильтров ждёт решения

По решению 29.07 «Сбросить фильтры» — кнопка-действие, и акцентом она больше не подсвечивается. Сигнал «сейчас что-то отфильтровано» переехал в текст подсказки (analytics/ma-aggrid.js, onFilterChanged). Но чтобы прочитать подсказку, надо навести курсор именно на ту кнопку, о существовании которой селлер и не подозревает: строка отфильтрована, итог не сходится с ожидаемым, а почему — не видно. Нужен признак, который заметен без наведения и при этом не спорит с правилом «акцент = включено».

Варианты — отметить один

14 · Три мелких — по подсказкам и поведению ждут решения

Каждая мелочь проверена в коде и стоит отдельного «да / нет»: они не связаны друг с другом и могут разъехаться по разным волнам.

Инвентарь контролов

Всё, что живёт на грид-страницах помимо тулбара и призм — отрисовано боевыми классами, на том фоне, где реально стоит. Жёлтая метка нет подсказки означает: у контрола нет ни title, ни другого объяснения при наведении — селлер догадывается сам. Проверено чтением кода, а не на глаз.

Эти контролы под обсуждение не попали и остаются как есть — сгруппированными. Разбирать их будем отдельной волной: сейчас важно, что группировка «движковое / раздел-специфичное» уже проведена и правило для каждой группы записано.

Что осталось до беты

Живой список: решённое из него уходит, открытое остаётся с указанием, где смотреть.

08

Источники дизайна (картотека)

Где смотреть идеи — человеческий дизайн, без AI-slop, только бесплатное (Запад + Азия). Берём идею, не обязательно готовый кирпич. Полный список (38 ресурсов) → docs/design-system/sources-catalog-2026-06-05.md. Правила — GLOBAL_DESIGN.md; сохранённые эффекты — effects-catalog/.

КОМПОНЕНТЫ
shadcn/ui · Radix · Uiverse · 21st.dev · Азия: Ant Design · Arco (ByteDance) · TDesign (Tencent)
ПАТТЕРНЫ
Nicelydone (228K экранов) · SaaSUI · Screenlane · KR: WWIT
ДИЗАЙН-СИСТЕМЫ
Carbon (IBM) · Atlassian · Primer (GitHub) · Geist · Material 3 · Ant spec · LINE
ВДОХНОВЕНИЕ
Godly · SiteInspire · JP: MUUUUU · CN: ZCOOL/站酷 · Huaban/花瓣
ИКОНКИ
Lucide (наш) · Tabler (5900, бизнес) · Phosphor · Heroicons · Remix · Material Symbols — human-crafted
ШРИФТЫ (RU)
С кириллицей: Onest · Golos Text · Manrope · Geologica. Лендинг: Satoshi · Cabinet Grotesk
ОСТОРОЖНО
AI-slop: Dribbble / Behance trending · Pinterest · Icons8 — только по авторам/командам
09

Иконки

Стандарт

Векторные иконки Lucide — уже используются в сайдбаре (app-sidebar.js → ICONS). Рендерятся как inline SVG: сетка 24×24, stroke 2px, цвет currentColor (наследует цвет текста, работает в обеих темах без правок). Размер управляется атрибутами width/height. Кастомные формы — только под бренд-знак (₽, MA_BRAND §14 канон).

БиблиотекаLucide (MIT, human-crafted)
Сетка24 × 24 px, viewBox="0 0 24 24"
Stroke2px, round caps & joins
ЦветcurrentColor — наследует, тема-независим
Размерчерез width/height (не CSS scale)
КастомТОЛЬКО бренд-знак ₽ (MA_BRAND.ICON_SVG)

Наш набор (живой рендер)

Все иконки из app-sidebar.js ICONS + часто используемые Lucide. Цвет — currentColor: переключите тему кнопкой в шапке — иконки перекрасятся автоматически.

Миграционная таблица: эмодзи → Lucide

Плановая замена эмодзи в тулбарах. Причины — в блоке «Антипаттерн» ниже.

Эмодзи Lucide-иконка Имя / код Где встречается

Антипаттерн — эмодзи вместо иконок

Эмодзи в тулбарах — AI-tell
СЕЙЧАС
💾 CSV, 🌡 Тепловая, Σ Итого, ☰ Компакт, ⚙ Настройки, ⊡ Свернуть, ☑ Выбрать

  • Рендер зависит от ОС: Windows ≠ Mac ≠ Android
  • Не масштабируются с текстом (растровые при zoom)
  • Нет вариантов темы (всегда цветные/чёрные OS-цвета)
  • AI-паттерн — сигнал сгенерированного интерфейса
  • Нет aria-label — ломает a11y для screen readers
СТАНДАРТ
Lucide SVG inline + текстовый лейбл:

<button>[svg save] CSV</button>

  • Одинаковы на всех ОС (векторные)
  • Масштабируются без артефактов
  • currentColor — меняют цвет вместе с текстом в обеих темах
  • Выглядят как профессиональный B2B SaaS
  • Добавить aria-label на кнопку — a11y готова
10

Свечение карточек (ореол)

Деликатный световой контур по периметру карточки — мягкий отклик на наведение, premium-ощущение (как у Vercel/Cursor), не неон. Чистый CSS: контур в покое + усиление на hover работают без JS; нюанс «ярче у курсора» — крошечный внешний /assets/glow-card.js (CSP-safe). Цвет — токены var(--accent) / var(--brand), обе темы. Реализация — общий /assets/glow-card.css (класс .glow-card).

ВАРИАНТЫ — отметить один наведите курсор на карточку, чтобы увидеть отклик · выбрать один → раскатаем на все карточки портала
Пока только примеры. .glow-card ещё НЕ применён к боевым карточкам портала. После выбора Александра — раскатаем на KPI / insight / .biz-panel / топ-листы / дашборд-карточки (Rule of Three → shared).

Контракт компонента

Класс.glow-card + модификатор --subtle / --medium / --cursor
Цвет (фикс.)токен --glow-color = var(--accent) по умолч.; бренд-ореол — --glow-color: var(--brand)
Layout (фикс.)ореол на ::before/::after, pointer-events:none — НЕ влияет на раскладку/клики
Reduced-motionстатичный контур без анимации (a11y)
Допускиинтенсивность покой/hover (--glow-rest/--glow-hover), толщина, blur — per-карточка
Запрещенохардкод-цвет ореола, неоновая интенсивность, ореол на каждом элементе подряд
11

Раскрытие описаний

Индикатор «развернуть/свернуть» для блоков «Про раздел» (MA_HelpSection), аккордеонов, раскрытия строк. Индикатор — векторная Lucide (никаких литеральных «▼»/«→» — это AI-tell). Плавное раскрытие по высоте/прозрачности, тайминг — токенный, reduced-motion уважается.

ВАРИАНТЫ — отметить один кликните по заголовку, чтобы раскрыть/свернуть · выбрать один → применим к «Про раздел» и аккордеонам
Пока только примеры. Живой MA_HelpSection ещё НЕ меняли — это витрина вариантов.
12

Письма

Галерея email-шаблонов — 8 типов писем с live-превью в iframe. Канон: Вариант A·Stripe 600px, тёмный режим, feedback-invite. Шаблоны в api/email-service.js (движок) + api/email-templates/ (HTML-файлы).

Живая галерея (8 типов) открывается на отдельной странице — iframe-превью 600px, sample-данные, подписи subject + preheader.

Открыть галерею писем
13

Терминология

Единый словарь концептов с деньгами и расчётами. Источник: docs/design-system/terminology-dictionary-draft-2026-06-11.md. Программный синоним: src/assets/glossary.js → window.MA_Glossary. Один концепт = одно имя везде: колонка == плитка == тултип == дрилл-даун.
Словарь универсальный: в разделах A–D используется нейтральное слово «маркетплейс» (концепты есть на любом маркетплейсе). Термины, характерные только для конкретного маркетплейса, вынесены в раздел E — только там в описании назван конкретный маркетплейс. У каждого термина — «Где» (где применяется) и «Зачем селлеру» (почему важен).

Статус: ЧЕРНОВИК. Все термины grep-подтверждены в коде. Рассогласования M1–M6 поднимают вопрос согласования с Александром. После утверждения — становится обязательным эталоном для Frontend + Infrastructure Lead.
14

Плитки разделов /overview/ — редизайн

Три направления без AI-tell'ов: убрана 3px левая полоса + литеральная «→». Цвет раздела сохранён (через чип/иконку/dot/верхний бордер). Иконки = Lucide, ровно как в сайдбаре. Спецификация: docs/specs/overview-section-tile-redesign-2026-06-27.md.

ВАРИАНТЫ — отметить один наведите курсор на плитку, чтобы увидеть hover-состояние · выбрать один → Frontend реализует в /overview/
Страница /overview/ не изменена. Это витрина вариантов — реальные плитки на реальном контенте (3 раздела: Экономика, Аналитика, Возвраты). После выбора Александра Frontend применит к /overview/.
15

Кнопка «Сделать приятное»

Портальная кнопка поддержки проекта (будущий «кофе / тортик»). В проде 3 выбранных варианта будут чередоваться по времени суток автоматически. Отметьте 3 понравившихся — маппинг по часам утвердим вместе.