/* Отзывы: блок на карточке товара, «Мои отзывы», правила, согласие, очередь
 * модерации в админке (модуль 7).
 *
 * ⚠ АРТБОРДОВ ЭТИХ ЭКРАНОВ В МАКЕТЕ НЕТ. Ровно та же история, что с кабинетом
 * покупателя: в экспортах Claude Design только витрина, админка и дозаказ.
 * Поэтому файл сделан по образцу `account.css` - значения СНЯТЫ ЗАМЕРОМ с
 * живой витрины (панель фильтров каталога, плитка товара, панель 404, кнопка
 * «В корзину»), а не подобраны на глаз. Откуда что взято - помечено у блока.
 *
 * ⛔ В `custom.css` сессия 10 не пишет НИ ОДНОЙ СТРОКИ: файл принадлежит
 * сессиям 1 и 2 (визуал ПК и телефона), и правка его отсюда - это ровно тот
 * конфликт, ради которого заведены зоны. Стили отзывов живут своим файлом и
 * подключаются: витринные страницы - через `head_extra` базового шаблона,
 * блок карточки и экран модерации - ссылкой внутри самого блока (до <head>
 * чужой страницы им не дотянуться).
 *
 * РАЗМЕТКА ОДНА на десктоп и телефон, ширины разводит медиазапрос. Две копии
 * формы в DOM (как в артбордах макета) дали бы два поля с одним именем в
 * каждой форме и два автофокуса.
 *
 * Токены объявлены здесь же, в :root, и повторяют палитру `account.css`: ни в
 * `storefront.css` (его пишет конвейер), ни в `custom.css` переменных палитры
 * нет вовсе. Когда они появятся в общем месте, блок :root ниже заменяется
 * одной строкой.
 *
 * Префиксы классов: `rv-` и `rv__` - витрина, `rvp-` и `rvp__` - текстовые
 * страницы (правила, согласие, «Мои отзывы»), `rvm-` - админка. Разведены
 * намеренно: у панели управления своя палитра и свой каркас, и общий класс
 * однажды перекрасил бы один экран цветами другого.
 */

:root {
    /* Палитра ровно та, что стоит инлайном в артбордах Design. */
    --rv-bg: #FFEBF2;          /* подложка страницы */
    --rv-surface: #FFF8FB;     /* панели, карточки, поля */
    --rv-accent: #EE7598;      /* кнопки, активные состояния */
    --rv-accent-dark: #C9436E; /* ссылки, активная вкладка, звёзды */
    --rv-text: #2E1D25;
    --rv-muted: #8A7079;       /* подписи, вторичное, юртексты */
    --rv-line: #FFD6E4;        /* разделители, «мягкий» фон */

    /* Тени. Замер: article[data-slug] и aside каталога дают одну и ту же
       пару, кнопка «В корзину» - свою розовую. */
    --rv-shadow: 8px 8px 20px rgba(206, 140, 166, .28),
                 -8px -8px 20px rgba(255, 255, 255, .9);
    --rv-shadow-sm: 6px 6px 16px rgba(206, 140, 166, .28),
                    -6px -6px 16px rgba(255, 255, 255, .9);
    /* Поле поиска в шапке: вдавленная поверхность. */
    --rv-inset: inset 5px 5px 12px rgba(206, 140, 166, .30),
                inset -5px -5px 12px rgba(255, 255, 255, .95);
    /* Чекбокс фильтра и бейдж «Нет в наличии»: та же вдавленность помельче.
       Ею же показывается нажатие пластилиновой кнопки. */
    --rv-inset-sm: inset 3px 3px 8px rgba(206, 140, 166, .28),
                   inset -3px -3px 8px rgba(255, 255, 255, .95);
    /* Наведение на плитку товара (класс scp57cffe из storefront.css). */
    --rv-shadow-up: 12px 14px 30px rgba(206, 140, 166, .36),
                    -8px -8px 20px rgba(255, 255, 255, .9);
    --rv-accent-shadow: 6px 6px 16px rgba(238, 117, 152, .45);

    /* Скругления: 28 панель, 24 малая карточка, 18 поле, 999 кнопки. */
    --rv-r: 28px;
    --rv-r-sm: 24px;
    --rv-r-xs: 18px;

    /* ШРИФТ БЛОКА - СИСТЕМНЫЙ ГРОТЕСК, И В ЗАГОЛОВКАХ, И В ТЕКСТЕ.
     *
     * Правка Павла 30.08 по скриншоту: «шрифт сделай нормальным, как в
     * описании», и на ПК, и на телефоне. Было Playfair Display в заголовках и
     * PT Serif в тексте, из-за чего блок читался отдельной страницей внутри
     * карточки, а не её частью.
     *
     * Тот же ход, что 29.08 на плитках каталога и на мобильной карточке:
     * Playfair это витринная антиква, хороша в крупных заголовках страницы, а
     * в мелком тексте с засечками читается тяжело. Стек взят дословно из
     * `custom.css`, чтобы блок и описание товара совпадали буква в букву.
     *
     * Правка одна на оба артборда: они подключают этот же файл. */
    --rv-title-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;
    --rv-text-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;
    --rv-mono-font: 'PT Mono', monospace;
}

/* ════════════════════════════════════════════════════════════════════════
   БЛОК НА КАРТОЧКЕ ТОВАРА
   ════════════════════════════════════════════════════════════════════════ */

.rv {
    /* Ширину и боковые поля даёт .site-col карточки: блок вставляется внутрь
       её колонки и своей ширины не заводит. */
    margin: 44px 0 10px;
    font-family: var(--rv-text-font);
    color: var(--rv-text);
    font-size: 17px;
    line-height: 1.62;
}

/* ── Шапка блока: средняя, число, разбивка ─────────────────────────────── */

.rv__head {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: 18px 40px;
    margin-bottom: 22px;
}

/* Заголовок блока - h2, а не h1: на карточке товара h1 уже занят названием. */
.rv__title {
    font-family: var(--rv-title-font);
    font-size: 34px;
    font-weight: 900;
    letter-spacing: -.02em;
    line-height: 1.1;
    margin: 0;
    flex: 1 1 260px;
}

.rv__score {
    display: flex;
    align-items: baseline;
    gap: 10px;
    flex-wrap: wrap;
}

.rv__avg {
    font-family: var(--rv-title-font);
    font-size: 40px;
    font-weight: 900;
    line-height: 1;
    color: var(--rv-accent-dark);
}

.rv__stars { color: var(--rv-accent); letter-spacing: .08em; }

.rv__count {
    font-family: var(--rv-mono-font);
    font-size: 11px;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--rv-muted);
}

/* Разбивка по звёздам. Пять строк рисуются ВСЕГДА, включая пустые: полоска
   на нуле показывает, что единиц у товара нет, а пропущенная строка выглядит
   спрятанной. */
.rv__bars {
    list-style: none;
    margin: 0;
    padding: 0;
    flex: 0 1 260px;
    display: grid;
    gap: 6px;
}

.rv__bar {
    display: grid;
    grid-template-columns: 34px 1fr 28px;
    align-items: center;
    gap: 10px;
    font-family: var(--rv-mono-font);
    font-size: 11px;
    color: var(--rv-muted);
}

.rv__bar-label { color: var(--rv-accent-dark); }

.rv__bar-track {
    height: 8px;
    border-radius: 999px;
    background: var(--rv-line);
    box-shadow: var(--rv-inset);
    overflow: hidden;
}

.rv__bar-fill {
    display: block;
    height: 100%;
    border-radius: 999px;
    background: var(--rv-accent);
}

.rv__bar-num { text-align: right; }

/* ── Плашки ответа сервера ─────────────────────────────────────────────── */

.rv__note {
    margin: 0 0 18px;
    padding: 14px 18px;
    border-radius: var(--rv-r-xs);
    background: var(--rv-surface);
    box-shadow: var(--rv-shadow-sm);
    font-size: 16px;
}

.rv__note--ok { border-left: 4px solid var(--rv-accent); }
.rv__note--bad { border-left: 4px solid var(--rv-accent-dark); }

/* ── Фильтры. Замер ряда сортировки каталога: чипы-пилюли 999px ─────────── */

.rv__filters {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-bottom: 22px;
}

.rv__chip {
    display: inline-flex;
    align-items: center;
    height: 38px;
    padding: 0 18px;
    border-radius: 999px;
    background: var(--rv-surface);
    box-shadow: var(--rv-shadow-sm);
    color: var(--rv-text);
    font-family: var(--rv-mono-font);
    font-size: 11px;
    letter-spacing: .08em;
    text-transform: uppercase;
    text-decoration: none;
    transition: .14s;
}

.rv__chip:hover { color: var(--rv-accent-dark); }

.rv__chip--on {
    background: var(--rv-accent);
    color: #fff;
    box-shadow: var(--rv-accent-shadow);
}

.rv__chip--on:hover { color: #fff; }

/* ── Список отзывов ────────────────────────────────────────────────────── */

.rv__list {
    list-style: none;
    margin: 0 0 20px;
    padding: 0;
    display: grid;
    gap: 16px;
}

.rv__item {
    background: var(--rv-surface);
    border-radius: var(--rv-r-sm);
    box-shadow: var(--rv-shadow);
    padding: 22px 24px;
}

.rv__item-head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px 14px;
    margin-bottom: 10px;
}

.rv__author { font-weight: 700; }

/* Знак «Покупал здесь» ставит система по выполненному заказу. Вручную он не
   проставляется и не снимается - об этом прямо сказано в правилах. */
.rv__badge {
    font-family: var(--rv-mono-font);
    font-size: 10px;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--rv-accent-dark);
    background: var(--rv-line);
    border-radius: 999px;
    padding: 4px 12px;
}

.rv__rate { color: var(--rv-accent); letter-spacing: .06em; }

/* Незакрашенные звёзды бледные, а не другой символ: два разных глифа в одной
   строке расходятся по ширине и «съезжают» при разных шрифтах. */
.rv__rate-off { color: var(--rv-line); }

.rv__date {
    margin-left: auto;
    font-family: var(--rv-mono-font);
    font-size: 11px;
    color: var(--rv-muted);
}

.rv__text {
    margin: 0;
    /* Переносы строк автора сохраняются: отзыв часто пишут списком. */
    white-space: pre-line;
}

.rv__photos {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 14px;
}

.rv__photo {
    width: 108px;
    height: 108px;
    object-fit: cover;
    border-radius: var(--rv-r-xs);
    box-shadow: var(--rv-shadow-sm);
    background: var(--rv-bg);
}

/* Ответ магазина: вложенная плашка, чтобы её нельзя было принять за отзыв
   другого покупателя. */
.rv__reply {
    margin-top: 14px;
    padding: 14px 18px;
    border-radius: var(--rv-r-xs);
    background: var(--rv-bg);
}

.rv__reply-who {
    display: block;
    font-family: var(--rv-mono-font);
    font-size: 10px;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--rv-accent-dark);
    margin-bottom: 6px;
}

.rv__reply-text { margin: 0; white-space: pre-line; }

.rv__more { margin: 0 0 14px; }

/* «Показаны все N опубликованных отзывов» плюс ссылка на правила. Обещание
   не прятать негатив, проверяемое глазами. */
.rv__all {
    margin: 0 0 28px;
    font-family: var(--rv-mono-font);
    font-size: 11px;
    letter-spacing: .06em;
    color: var(--rv-muted);
}

.rv__all a, .rv__legal a, .rv__empty-note a { color: var(--rv-accent-dark); }

/* Зона под палец у строчных ссылок: 44 точки по высоте. Отступ, а не накладка
   `::after`: накладку режет любой предок с overflow (грабли соседей в
   custom.css). У строчного элемента вертикальный отступ строки не двигает,
   только расширяет коробку нажатия. Числа: контент строки плюс отступы.
   .rv__empty-note: шрифт 16, замер 21 (сессия 2, 31.08.2026) -> 21 + 24 = 45.
   .rv__all: моно 11, контент около 14 -> 14 + 32 = 46; вверх выходит на 14,
   ровно в нижний отступ кнопки «Показать ещё», её не перехватывает.
   .rv__legal a НЕ трогаем: ссылка стоит сразу под подписью согласия, и зона
   вверх перехватывала бы нажатия по тексту у галочки. */
.rv__empty-note a { padding: 12px 0; }
.rv__all a { padding: 16px 0; }

/* ── Пусто. Ни нулей, ни пустых звёзд ──────────────────────────────────── */

/* Текст по центру карточки, а не прижат к левому краю (правка Павла 30.08).
   Панель во всю ширину колонки, а внутри две короткие строки: слева они
   читались как обрезанный абзац, у которого потерялось продолжение. */
.rv__empty {
    background: var(--rv-surface);
    border-radius: var(--rv-r);
    box-shadow: var(--rv-shadow);
    padding: 38px 28px;
    margin-bottom: 24px;
    text-align: center;
}

.rv__empty-title {
    font-family: var(--rv-title-font);
    font-size: 26px;
    font-weight: 900;
    margin: 0 0 8px;
}

.rv__empty-note { margin: 0; color: var(--rv-muted); font-size: 16px; }

/* ── Окно «Правила публикации» ─────────────────────────────────────────── */

.rv__modal {
    width: min(720px, calc(100vw - 32px));
    max-height: min(80vh, 720px);
    padding: 0;
    border: 0;
    border-radius: var(--rv-r);
    background: var(--rv-surface);
    color: var(--rv-text);
    /* Окно рисует браузер поверх всего, но шрифт наследуется от страницы, а
       у артборда он свой. Задаём явно, иначе окно уедет на витринную антикву. */
    font-family: var(--rv-text-font);
    font-size: 16px;
    box-shadow: 0 30px 60px rgba(120, 60, 85, .35);
    /* Обрезаем по скруглению. Без этого полоса прокрутки рисовалась у края
       САМОГО окна, снаружи закруглённого угла, отдельным серым столбиком
       (правка Павла 30.08 по скриншоту). Прокручивается тело, окно - никогда. */
    overflow: hidden;
}
.rv__modal::backdrop { background: rgba(60, 25, 40, .45); }

/* Колонка ТОЛЬКО у открытого окна: закрытый `<dialog>` держится на
   `display: none`, и безусловный `display: flex` показывал бы его всегда.
   Прокручивается тело, а не всё окно: иначе на узком экране заголовок в три
   строки съедал полокна, а текст уезжал под шапку (поймано на телефоне
   30.08). `min-height: 0` обязателен - без него флекс-ребёнок не сжимается
   ниже своего содержимого и прокрутка не включается. */
.rv__modal[open] { display: flex; flex-direction: column; }

.rv__modal-head {
    flex: none;
    display: flex;
    align-items: center;
    gap: 16px;
    padding: 22px 26px 14px;
    background: var(--rv-surface);
    border-bottom: 1px solid rgba(201, 67, 110, .16);
}

.rv__modal-title {
    flex: 1 1 auto;
    margin: 0;
    font-family: var(--rv-title-font);
    font-size: 22px;
    font-weight: 800;
}

.rv__modal-x {
    flex: none;
    width: 38px;
    height: 38px;
    border: 0;
    border-radius: 50%;
    background: var(--rv-bg);
    color: var(--rv-text);
    font-size: 22px;
    line-height: 1;
    cursor: pointer;
}
.rv__modal-x:hover { background: var(--rv-accent); color: #fff; }
.rv__modal-x:focus-visible { outline: 2px solid var(--rv-accent); outline-offset: 2px; }

.rv__modal-body {
    flex: 1 1 auto;
    min-height: 0;
    padding: 6px 26px 26px;
    overflow: auto;
    /* Докрутили документ до конца - страница за окном не едет следом. */
    overscroll-behavior: contain;
}

/* ── Полосы прокрутки в цвет сайта ──────────────────────────────────────
 *
 * Правка Павла 30.08: системная серая полоса выбивалась из магазина.
 * Значения ТЕ ЖЕ, что у ленты миниатюр на карточке товара (`custom.css`,
 * раздел про колонку миниатюр): своей палитры не заводим, иначе на одной
 * странице будет две разные полосы.
 *
 * Два набора правил, потому что стандарта пока два: `scrollbar-*` понимают
 * Firefox и свежие Chrome, `::-webkit-scrollbar` - Safari и Chrome. Кто не
 * понял ни того ни другого, покажет системную полосу, и это не поломка.
 */
.rv__modal-body,
.rv .rv__photos,
.rv .rv__text {
    scrollbar-width: thin;
    scrollbar-color: rgba(201, 67, 110, .35) transparent;
}
.rv__modal-body::-webkit-scrollbar,
.rv .rv__photos::-webkit-scrollbar,
.rv .rv__text::-webkit-scrollbar {
    width: 5px;
    height: 5px;
}
.rv__modal-body::-webkit-scrollbar-track,
.rv .rv__photos::-webkit-scrollbar-track,
.rv .rv__text::-webkit-scrollbar-track { background: transparent; }
.rv__modal-body::-webkit-scrollbar-thumb,
.rv .rv__photos::-webkit-scrollbar-thumb,
.rv .rv__text::-webkit-scrollbar-thumb {
    background: rgba(201, 67, 110, .35);
    border-radius: 999px;
}
.rv__modal-body::-webkit-scrollbar-thumb:hover,
.rv .rv__photos::-webkit-scrollbar-thumb:hover,
.rv .rv__text::-webkit-scrollbar-thumb:hover {
    background: rgba(201, 67, 110, .55);
}
.rv__modal-load { margin: 12px 0; color: var(--rv-muted); }

/* Текст правил внутри окна: разметка та же, что на странице, поэтому на нём
   висит и `rvp__doc` - панель с фоном, тенью и полями в 40 пикселей. Внутри
   окна это карточка в карточке и лишняя рамка вокруг текста, снимаем. */
.rv__modal .rv__modal-doc {
    background: none;
    box-shadow: none;
    border-radius: 0;
    padding: 0;
    margin: 0;
    max-width: none;
}

/* Заголовки документа тут мельче, чем на странице: заголовок окна уже стоит
   в шапке, и вторая крупная строка спорила бы с ним. */
.rv__modal-doc h2 {
    font-family: var(--rv-title-font);
    font-size: 18px;
    margin: 22px 0 8px;
}
.rv__modal-doc p, .rv__modal-doc li { line-height: 1.55; }
.rv__modal-doc a { color: var(--rv-accent-dark); }

/* ── Форма ─────────────────────────────────────────────────────────────── */

/* Форма закрыта до нажатия (правка Павла 30.08): раскрытая, она занимала на
   карточке больше места, чем сам товар, а нужна единицам из ста.
   Собрано на `<details>`, поэтому работает без скрипта; сам `<summary>`
   оформлен кнопкой магазина, а не системным треугольником. */
.rv__form-box { margin-top: 18px; }

.rv__form-open {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    cursor: pointer;
    list-style: none;               /* треугольник Firefox */
    /* Двойной клик по кнопке иначе выделяет её подпись синей полосой: по
       `summary` часто щёлкают дважды, пока не поймут, что открылось. */
    -webkit-user-select: none;
    user-select: none;
    min-height: 48px;
    padding: 0 26px;
    border-radius: 999px;
    background: var(--rv-accent);
    color: #fff;
    font-family: var(--rv-mono-font);
    font-size: 12px;
    letter-spacing: .08em;
    text-transform: uppercase;
    box-shadow: var(--rv-accent-shadow);
    transition: .14s;
}
/* Треугольник Safari и Chrome. Своей стрелки не рисуем: кнопка и так
   говорит, что будет дальше, а стрелка на кнопке читается как «свернуть». */
.rv__form-open::-webkit-details-marker { display: none; }
.rv__form-open::marker { content: ""; }
.rv__form-open:hover { background: var(--rv-accent-dark); }
.rv__form-open:focus-visible { outline: 2px solid var(--rv-accent); outline-offset: 3px; }
/* Открытая форма: кнопка становится её заголовком, а не кнопкой. Иначе на
   экране две одинаковые розовые кнопки, «Оставить отзыв» и «Отправить отзыв»,
   и непонятно, какая из них отправляет. */
.rv__form-box[open] > .rv__form-open {
    display: block;
    min-height: 0;
    background: transparent;
    color: var(--rv-text);
    box-shadow: none;
    padding: 0 0 14px;
    font-family: var(--rv-title-font);
    font-size: 26px;
    font-weight: 700;
    letter-spacing: normal;
    text-transform: none;
}

.rv__form {
    background: var(--rv-surface);
    border-radius: var(--rv-r);
    box-shadow: var(--rv-shadow);
    padding: 28px;
}

.rv__form-title {
    font-family: var(--rv-title-font);
    font-size: 26px;
    font-weight: 900;
    margin: 0 0 16px;
}

/* Требования к фотографиям: свёрнуты, разворачиваются одним нажатием.
   Текст юридический и дословный, сокращать его нельзя, но три абзаца подряд
   над формой читались как договор, и их переставали читать вовсе. */
.rv__rules { margin: 4px 0 18px; }
.rv__rules > summary {
    cursor: pointer;
    color: var(--rv-muted);
    font-family: var(--rv-mono-font);
    font-size: 12px;
    letter-spacing: .06em;
    text-transform: uppercase;
}
.rv__rules > summary:hover { color: var(--rv-accent); }
.rv__rules > summary:focus-visible { outline: 2px solid var(--rv-accent); outline-offset: 2px; }
.rv__rules[open] > summary { margin-bottom: 10px; }

.rv__own {
    margin: 0 0 18px;
    padding: 14px 18px;
    border-radius: var(--rv-r-xs);
    background: var(--rv-bg);
    font-size: 16px;
}

.rv__own a { color: var(--rv-accent-dark); }

/* Оценка радиокнопками: работает без JavaScript, с клавиатуры и в читалке. */
.rv__rating {
    border: 0;
    margin: 0 0 18px;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    align-items: center;
}

.rv__rating legend {
    padding: 0;
    margin-bottom: 8px;
    font-family: var(--rv-mono-font);
    font-size: 11px;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--rv-muted);
}

.rv__star {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 14px;
    border-radius: 999px;
    background: var(--rv-bg);
    cursor: pointer;
    color: var(--rv-accent-dark);
    font-family: var(--rv-mono-font);
    font-size: 13px;
}

.rv__star:hover { box-shadow: var(--rv-shadow-sm); }

.rv__field {
    display: block;
    margin-bottom: 16px;
    font-family: var(--rv-mono-font);
    font-size: 11px;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--rv-muted);
}

.rv__field textarea,
.rv__field input[type="file"] {
    display: block;
    width: 100%;
    box-sizing: border-box;
    margin-top: 8px;
    padding: 14px 16px;
    border: 0;
    border-radius: var(--rv-r-xs);
    background: var(--rv-bg);
    box-shadow: var(--rv-inset);
    font-family: var(--rv-text-font);
    font-size: 16px;
    letter-spacing: normal;
    text-transform: none;
    color: var(--rv-text);
    resize: vertical;
}

/* ── Выбор фотографий: пластилиновая кнопка вместо родной ──────────────────
 *
 * Стандартная «Выбрать файлы / Файл не выбран» выбивалась из оформления
 * магазина (Павел 30.08). Заменяется НЕ скриптом, а парой «спрятанное поле
 * плюс настоящий <label for>»: клик по метке открывает выбор файла родным
 * поведением браузера, поэтому форма работает и с выключенным JavaScript.
 *
 * Замеры сняты с живой витрины, как и весь файл: подложка и тень - кнопки
 * ряда шапки, подъём при наведении - плитка товара, вдавленность нажатия -
 * чекбокс фильтра.
 */

.rv__file {
    /* Обёртка ловит фокус спрятанного поля: подсветить надо её, иначе с
       клавиатуры не видно, где ты находишься. */
    position: relative;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px 16px;
    margin-bottom: 14px;
    padding: 4px;
    border-radius: 999px;
}

/* ⚠ НЕ `display:none` и НЕ `visibility:hidden`: они выкидывают поле из
   порядка обхода, и до выбора файла нельзя добраться ни клавиатурой, ни
   скринридером. Поле остаётся в потоке, но прозрачное и в 0.1 пикселя -
   приём из руководств по доступности форм. */
.rv__file-native {
    position: absolute;
    opacity: 0;
    width: .1px;
    height: .1px;
    overflow: hidden;
    z-index: -1;
}

.rv__file-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 48px;
    padding: 0 26px;
    border-radius: 999px;
    background: var(--rv-surface);
    box-shadow: var(--rv-shadow-sm);
    color: var(--rv-accent-dark);
    font-family: var(--rv-mono-font);
    font-size: 12px;
    letter-spacing: .08em;
    text-transform: uppercase;
    cursor: pointer;
    transition: .14s;
    user-select: none;
}

.rv__file-btn:hover { box-shadow: var(--rv-shadow-up); }

/* Нажатие вдавливает кнопку в подложку - та же метафора, что у чекбокса
   фильтра и поля поиска. */
.rv__file-btn:active { box-shadow: var(--rv-inset-sm); }

/* Фокус стоит на СПРЯТАННОМ поле, поэтому обёртка ловит его через
   `:focus-within` и рисует кольцо на видимой кнопке. Кольцо именно на
   кнопке, а не на всей обёртке: обёртка вместе с подсказкой и списком файлов
   занимает всю ширину формы, и рамка вокруг неё не показывала бы, ЧТО
   сейчас нажмётся пробелом. Без этого правила человек, идущий по форме
   табом, теряет курсор на ровном месте. */
.rv__file:focus-within .rv__file-btn {
    outline: 3px solid var(--rv-accent);
    outline-offset: 3px;
}

.rv__file-hint {
    font-family: var(--rv-mono-font);
    font-size: 11px;
    letter-spacing: .04em;
    color: var(--rv-muted);
    flex: 1 1 220px;
}

/* Счётчик и список появляются только после выбора: пока не выбрано ничего,
   их нет вовсе (атрибут hidden снимает скрипт). */
.rv__file-count {
    width: 100%;
    margin: 4px 0 0;
    font-family: var(--rv-mono-font);
    font-size: 12px;
    letter-spacing: .04em;
    /* БЕЗ uppercase, в отличие от остальных мононадписей блока: сюда попадает
       не подпись в два слова, а живая фраза («Можно приложить не больше трёх
       фотографий. Лишние не взяли»), и капсом она читается как окрик. */
    color: var(--rv-accent-dark);
}

.rv__file-count[hidden] { display: none; }

.rv__file-list {
    list-style: none;
    width: 100%;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}

.rv__file-item {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    max-width: 100%;
    padding: 6px 8px 6px 14px;
    border-radius: 999px;
    background: var(--rv-bg);
    font-size: 14px;
}

.rv__file-name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 220px;
}

.rv__file-drop {
    /* Цель под палец: 32px это минимум для крестика на телефоне. */
    width: 32px;
    height: 32px;
    border: 0;
    border-radius: 50%;
    background: var(--rv-surface);
    box-shadow: var(--rv-shadow-sm);
    color: var(--rv-accent-dark);
    font-size: 15px;
    line-height: 1;
    cursor: pointer;
}

.rv__file-drop:hover { box-shadow: var(--rv-shadow-up); }
.rv__file-drop:active { box-shadow: var(--rv-inset-sm); }

/* Юридические подписи. Мельче основного текста, но НЕ серее допустимого:
   согласие обязано быть читаемым, иначе оно не информированное. */
.rv__legal {
    margin: 0 0 12px;
    font-size: 14px;
    line-height: 1.55;
    color: var(--rv-muted);
}

/* Галочка согласия на РАСПРОСТРАНЕНИЕ. Снята по умолчанию (ч. 8 ст. 10.1
   152-ФЗ) и подчёркнута фоном: это не «мелкий шрифт внизу формы», а
   отдельное согласие, которое человек даёт осознанно. */
.rv__consent {
    display: flex;
    gap: 12px;
    align-items: flex-start;
    margin: 18px 0 12px;
    padding: 16px 18px;
    border-radius: var(--rv-r-xs);
    background: var(--rv-bg);
    font-size: 15px;
    line-height: 1.5;
    cursor: pointer;
}

.rv__consent input {
    /* Цель под палец: 24px это минимум, ниже него на телефоне промахиваются. */
    width: 24px;
    height: 24px;
    margin: 2px 0 0;
    accent-color: var(--rv-accent-dark);
    flex: 0 0 auto;
}

.rv__btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 48px;
    padding: 0 26px;
    border: 0;
    border-radius: 999px;
    background: var(--rv-surface);
    box-shadow: var(--rv-shadow-sm);
    color: var(--rv-text);
    font-family: var(--rv-mono-font);
    font-size: 12px;
    letter-spacing: .08em;
    text-transform: uppercase;
    text-decoration: none;
    cursor: pointer;
    transition: .14s;
}

.rv__btn:hover { color: var(--rv-accent-dark); }

.rv__btn--go {
    background: var(--rv-accent);
    color: #fff;
    box-shadow: var(--rv-accent-shadow);
}

.rv__btn--go:hover { color: #fff; }

.rv__signin { margin: 0; }

@media (max-width: 768px) {
    .rv { margin-top: 32px; font-size: 16px; }
    .rv__title { font-size: 26px; }
    .rv__avg { font-size: 32px; }
    .rv__item, .rv__form { padding: 18px 16px; }
    /* Закрытая кнопка формы во всю ширину, как остальные кнопки блока.
       Открытая остаётся заголовком и не растягивается. */
    .rv__form-open { display: flex; width: 100%; }
    .rv__form-box[open] > .rv__form-open { display: block; width: auto; font-size: 22px; }
    /* Заголовок окна на узком экране: 22px переносился на три строки и
       съедал полокна ещё до первой строки текста. */
    .rv__modal { max-height: 88vh; }
    .rv__modal-head { padding: 16px 18px 12px; }
    .rv__modal-title { font-size: 17px; line-height: 1.25; }
    .rv__modal-body { padding: 4px 18px 20px; }
    .rv__photo { width: 88px; height: 88px; }
    /* Кнопка выбора файла во всю ширину, подпись под ней: в ряд на телефоне
       они не встают, а перенос посреди строки читается как поломка. */
    .rv__file-btn { width: 100%; }
    .rv__file-hint { flex: 1 1 100%; }
    .rv__file-name { max-width: 150px; }
    /* Дата уезжает на свою строку: в ряд с именем и звёздами она не влезает
       и ломает перенос. */
    .rv__date { margin-left: 0; width: 100%; }
    .rv__btn { width: 100%; }
}

/* ════════════════════════════════════════════════════════════════════════
   ТЕКСТОВЫЕ СТРАНИЦЫ: правила, согласие, «Мои отзывы»
   ════════════════════════════════════════════════════════════════════════ */

.rvp {
    background: var(--rv-bg);
    min-height: 100vh;
    overflow: hidden;
    /* Колонка: остаток высоты короткой страницы уходит МЕЖДУ содержимым и
       подвалом, а не под подвал. Блочная раскладка оставляла под ним 499
       точек пустоты на пустых «Моих отзывах» (замер сессии 2, 31.08.2026). */
    display: flex;
    flex-direction: column;
}

.rvp__narrow { padding: 0 16px; }

/* Подвал прижат к низу. Обёрток две, настольная и телефонная, лишняя спрятана
   медиазапросом и в раскладке не участвует. */
.rvp__foot { margin-top: auto; }

/* Телефонный подвал, снят с .acc-footer кабинета: у обёртки те же поля 16,
   что у мобильных артбордов.
   ⚠ Имя класса завязано снаружи: в custom.css (зона сессии 2) общая накладка
   зон на ссылки подвалов артбордов исключает его через `:not(.rvp__footer)`,
   потому что обёртка .dc-mobile делает этот подвал частью артборда. Зоны
   ссылок здесь свои, ниже. Переименовал класс - скажи сессии 2. */
.rvp__footer {
    padding: 22px 0 30px;
    display: flex;
    /* Между рядами 34, а не 14: на 375 подвал переносится на два ряда, а
       коробки ссылок ниже растянуты до 50 по высоте. При просвете 14 ряды
       заходили бы друг на друга на 24 точки и перехватывали нажатия. С 34
       коробки рядов ровно касаются. В строке просвет прежний, 14. */
    gap: 34px 14px;
    flex-wrap: wrap;
    font-family: var(--rv-mono-font);
    font-size: 10px;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--rv-muted);
    border-top: 1px solid var(--rv-line);
    margin-top: 26px;
}

/* Зона под палец 44x44 у ссылок подвала: отступ и такой же отрицательный
   margin, ряд не растёт и просветы не меняются (механика соседей из
   custom.css, кросс-сейл). По высоте контент около 12 + 34 = 46, коробка
   остаётся внутри полей подвала 22 сверху и 30 снизу. По ширине самая узкая
   ссылка «О нас» 36 (её дописывает storefront.js) -> 36 + 12 = 48; просвет
   между ссылками 14, коробки заходят в него по 6 с каждой стороны и друг до
   друга не достают. Замер на проде 31.08.2026. */
.rvp__footer a {
    color: var(--rv-muted);
    text-decoration: none;
    padding: 17px 6px;
    margin: -17px -6px;
}

.rvp__footer a:hover { color: var(--rv-accent-dark); }

.rvp__main {
    /* Явная ширина, потому что main - ребёнок flex-колонки .rvp. У flex-элемента
       с auto-полями по бокам (их даёт .site-col) растяжение не работает: он
       ужимается до ширины содержимого и центруется. На 1440 колонка стала 892,
       крошка уехала с 34 на 298 (замер на проде 31.08.2026). box-sizing в
       проекте border-box, поля .site-col входят в эти 100%. */
    width: 100%;
    padding-bottom: 40px;
    font-family: var(--rv-text-font);
    color: var(--rv-text);
    font-size: 17px;
    line-height: 1.62;
}

/* Крошка. Замер partials/breadcrumb_catalog.html: PT Mono 11px, .14em,
   uppercase, #8A7079, поля 34px сверху и 14px снизу. */
.rvp__crumbs {
    font-family: var(--rv-mono-font);
    font-size: 11px;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--rv-muted);
    margin: 34px 0 14px;
}

.rvp__crumbs a { color: var(--rv-muted); text-decoration: none; }
.rvp__crumbs a:hover { color: var(--rv-accent-dark); }
.rvp__crumbs span { color: var(--rv-accent-dark); }

/* ── ПК: страница «Мои отзывы» приводится к виду кабинета (03.09.2026,
   сессия 1 «Визуал ПК» по указанию Павла; сессии 10 больше нет).
   Замер при 1440 показывал два расхождения с /account/*:
   * крошка стояла СЛЕВА отдельной строкой во всю колонку (left 34, ширина
     1372), в кабинете она прижата вправо и делит строку с заголовком
     (left 1169.9, ширина 236.1);
   * заголовок был набран системным гротеском, а на всех страницах кабинета
     Playfair Display 56/900.

   ШАПКА СТРАНИЦЫ - КОПИЯ `.acc-head` ИЗ КАБИНЕТА, до значения.

   Требование Павла 03.09 по двум скриншотам: «отступы скачут», меню не должно
   прыгать при переходе между вкладками. Замер на 1440 показывал именно это:
   ряд вкладок стоял на 298 в кабинете и на 331 у отзывов, потому что крошка
   здесь занимала свою строку над заголовком, а в кабинете делит строку с ним.
   Разница в 33 точки видна глазом как рывок меню.

   Поэтому крошка и h1 обёрнуты в `.rvp__head` (шаблоны my, rules, consent), а
   правила ниже повторяют `.acc-head`: те же flex, baseline, gap 20, перенос,
   отступы 34 сверху и 28 снизу, та же `margin-left: auto` у крошки и тот же
   `order: -1` на телефоне. Заводить свои значения тут нельзя: разъедутся при
   первой же правке кабинета.

   ⚠ Два тупика, оба проверены замером и оба не годятся:
   * `float: right` у крошки - вынимает её из потока, h1 занимает всю ширину,
     и на ДЛИННОМ заголовке строка налезает на крошку. Гейт поймал на
     «Правилах публикации отзывов»: пересечение 293x18. На «Моих отзывах»
     заголовок короткий, глазом бы не увидели;
   * `text-align: right` без обёртки - крошка встаёт справа, но остаётся своей
     строкой, и меню по-прежнему прыгает на те же 33 точки. */
.rvp__head {
    display: flex;
    align-items: baseline;
    gap: 20px;
    flex-wrap: wrap;
    margin-top: 34px;
    margin-bottom: 28px;
}

/* Крошка внутри шапки прижата вправо; свои внешние отступы ей здесь не нужны,
   их несёт сама шапка. */
.rvp__head .rvp__crumbs {
    margin: 0 0 0 auto;
}

/* Заголовок в шапке отступов не заводит: снизу отступ у самой шапки. */
.rvp__head .rvp__title {
    margin-bottom: 0;
}

/* H1. Замер каталога: Playfair 900 56px, letter-spacing -.025em и пунктирная
   отбивка под заголовком. */
.rvp__title {
    font-family: var(--rv-title-font);
    font-size: 56px;
    font-weight: 900;
    letter-spacing: -.025em;
    line-height: 1;
    margin: 0 0 30px;
}

.rvp__title::after {
    content: "";
    display: block;
    height: 2px;
    margin-top: 10px;
    width: 150px;
    background: repeating-linear-gradient(
        90deg, var(--rv-accent) 0 12px, transparent 12px 20px
    );
}

/* ── ПК: заголовок страницы «Мои отзывы» витринной антиквой, как `.acc-title`
   в кабинете (--acc-title-font: 'Playfair Display', Georgia, serif). Замер при
   1440 давал здесь системный гротеск, а на всех соседних страницах кабинета
   Playfair.

   Переменную --rv-title-font НЕ трогаем: она системным гротеском намеренно,
   это правка Павла 30.08 «шрифт сделай нормальным, как в описании». Но она
   про БЛОК ОТЗЫВОВ ВНУТРИ КАРТОЧКИ ТОВАРА, где мелкий текст с засечками
   читается тяжело; на отдельную страницу решение растеклось заодно, хотя
   здесь заголовок в 56 точек и ведёт себя как заголовок каталога.

   ⚠ Блок стоит ИМЕННО ЗДЕСЬ, ниже базового `.rvp__title`, и переносить его
   выше нельзя. Специфичность у обоих одна (0,1,0), медиазапрос веса НЕ
   добавляет, поэтому при равной специфичности решает порядок в файле. Первый
   заход 03.09 был написан выше по файлу и молча проиграл: правило в CSSOM
   присутствовало, а computed показывал прежний гротеск. */
@media (min-width: 769px) {
    .rvp__title {
        font-family: 'Playfair Display', Georgia, serif;
    }
}

.rvp__doc {
    background: var(--rv-surface);
    border-radius: var(--rv-r);
    box-shadow: var(--rv-shadow);
    padding: 40px 36px;
    /* Мера строки: длиннее 720px юридический текст читают по диагонали, а
       его написали ради того, чтобы прочли. */
    max-width: 720px;
    margin-bottom: 26px;
}

.rvp__doc h2 {
    font-family: var(--rv-title-font);
    font-size: 24px;
    font-weight: 900;
    margin: 28px 0 10px;
}

.rvp__doc p { margin: 0 0 14px; }
.rvp__doc a { color: var(--rv-accent-dark); }

.rvp__lead { font-size: 19px; }

.rvp__reasons { margin: 0 0 16px; padding-left: 22px; }
.rvp__reasons li { margin-bottom: 8px; }

.rvp__gost, .rvp__rev {
    font-size: 14px;
    color: var(--rv-muted);
}

.rvp__links {
    font-family: var(--rv-mono-font);
    font-size: 11px;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--rv-muted);
}

.rvp__links a { color: var(--rv-muted); text-decoration: none; }
.rvp__links a:hover { color: var(--rv-accent-dark); }

/* ── «Мои отзывы» ──────────────────────────────────────────────────────── */

.rvm-my {
    list-style: none;
    margin: 0 0 24px;
    padding: 0;
    display: grid;
    gap: 16px;
    max-width: 820px;
}

.rvm-my__item {
    background: var(--rv-surface);
    border-radius: var(--rv-r-sm);
    box-shadow: var(--rv-shadow);
    padding: 22px 24px;
}

.rvm-my__head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px 14px;
    margin-bottom: 10px;
}

.rvm-my__product { color: var(--rv-accent-dark); font-weight: 700; }

.rvm-my__state {
    margin-left: auto;
    font-family: var(--rv-mono-font);
    font-size: 10px;
    letter-spacing: .08em;
    text-transform: uppercase;
    border-radius: 999px;
    padding: 5px 14px;
    background: var(--rv-line);
    color: var(--rv-accent-dark);
}

/* Пять состояний - пять разных плашек. «Отклонён» и «вы убрали сами» человеку
   нельзя показывать одинаково: это разные события с разными последствиями. */
.rvm-my__state--published { background: var(--rv-accent); color: #fff; }
.rvm-my__state--pending { background: var(--rv-line); }
.rvm-my__state--rejected,
.rvm-my__state--hidden { background: var(--rv-bg); color: var(--rv-muted); }
.rvm-my__state--withdrawn { background: var(--rv-bg); color: var(--rv-muted); }

/* Причина отказа: человек обязан её видеть, иначе отказ выглядит цензурой. */
.rvm-my__why {
    margin: 12px 0 0;
    padding: 14px 18px;
    border-radius: var(--rv-r-xs);
    background: var(--rv-bg);
    font-size: 16px;
}

.rvm-my__off { margin: 14px 0 0; }

@media (max-width: 768px) {
    .rvp__main { font-size: 16px; }
    .rvp__title { font-size: 34px; }
    .rvp__doc { padding: 24px 20px; }
    .rvp__lead { font-size: 17px; }
    .rvm-my__item { padding: 18px 16px; }
    .rvm-my__state { margin-left: 0; }

    /* ── Телефон: та же шапка, что в кабинете. Значения из `account.css`,
       медиазапрос 768: gap 8, отступы 18 и 18, крошка над заголовком во всю
       строку, пунктирная отбивка заголовка скрыта.

       Замер 03.09 до правки, 390: у отзывов шапка держала ДЕСКТОПНЫЕ 34 и 28,
       а отбивка `::after` оставалась видимой и добавляла 12 точек высоты
       (2 линия плюс 10 отступ). Из-за этого ряд вкладок стоял на 270 против
       232 в кабинете, крошка на 162 против 146, заголовок на 208 против 180.
       Ровно то, на что Павел показал скриншотами. */
    .rvp__head {
        gap: 8px;
        margin-top: 18px;
        margin-bottom: 18px;
    }

    /* Крошка возвращается на свою строку НАД заголовком: в 375 точек рядом с
       ним ей тесно. Один в один с `.acc-head .acc-crumbs`. */
    .rvp__head .rvp__crumbs {
        order: -1;
        width: 100%;
        margin: 0 0 10px;
    }

    /* Как `.acc-title::after` в кабинете: на телефоне отбивки нет. */
    .rvp__title::after {
        display: none;
    }
}

/* ════════════════════════════════════════════════════════════════════════
   ОЧЕРЕДЬ МОДЕРАЦИИ (админка)
   ════════════════════════════════════════════════════════════════════════
   Палитра админки СВОЯ и светлее витринной (#FFEBF2 / #FFF8FB / #C9436E,
   системный шрифт, моноширинный на цифрах - правило проектного CLAUDE.md).
   Классы с префиксом `rvm-` пересекаться с витринными не могут.
   ════════════════════════════════════════════════════════════════════════ */

.rvm-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-bottom: 18px;
}

.rvm-tab {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 9px 16px;
    border-radius: 999px;
    background: #FFF8FB;
    color: #2E1D25;
    text-decoration: none;
    font-size: 14px;
    box-shadow: var(--rv-shadow-sm);
}

.rvm-tab--on { background: #C9436E; color: #fff; }

.rvm-tab__num {
    font-family: var(--rv-mono-font);
    font-size: 12px;
    opacity: .75;
}

.rvm-card {
    background: #FFF8FB;
    border-radius: var(--rv-r-sm);
    box-shadow: var(--rv-shadow-sm);
    padding: 18px 20px;
    margin-bottom: 14px;
}

/* Просрочка подсвечивает карточку, но работать не мешает: срок в три рабочих
   дня это обязанность магазина, а не запрет на действие. */
.rvm-card--late { border-left: 4px solid #C9436E; }

.rvm-card__head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px 14px;
    margin-bottom: 8px;
}

.rvm-stars { color: #EE7598; letter-spacing: .06em; }
.rvm-stars__off { color: #FFD6E4; }

.rvm-who { font-weight: 700; }

.rvm-badge, .rvm-state {
    font-family: var(--rv-mono-font);
    font-size: 11px;
    border-radius: 999px;
    padding: 3px 10px;
    background: #FFEBF2;
    color: #C9436E;
}

.rvm-due {
    margin-left: auto;
    font-family: var(--rv-mono-font);
    font-size: 12px;
    color: #8A7079;
}

.rvm-due--late { color: #C9436E; font-weight: 700; }

.rvm-card__meta {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 16px;
    font-size: 13px;
    color: #8A7079;
    margin-bottom: 10px;
}

.rvm-card__meta a { color: #C9436E; }

/* IP автора виден ТОЛЬКО здесь: он для разбора накрутки. На витрину не
   уходит никогда (заключение юриста, п. 2). */
.rvm-ip { font-family: var(--rv-mono-font); }

.rvm-warn { color: #C9436E; }

.rvm-text { margin: 0 0 12px; white-space: pre-line; }
.rvm-text--none { color: #8A7079; font-style: italic; }

.rvm-photos { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 12px; }

.rvm-photo { margin: 0; text-align: center; }

.rvm-photo img {
    display: block;
    width: 140px;
    height: 140px;
    object-fit: cover;
    border-radius: var(--rv-r-xs);
    margin-bottom: 6px;
}

.rvm-flag {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    margin-bottom: 12px;
    font-size: 13px;
    color: #8A7079;
}

.rvm-reject, .rvm-reply {
    margin: 0 0 12px;
    padding: 10px 14px;
    border-radius: var(--rv-r-xs);
    background: #FFEBF2;
    font-size: 14px;
}

.rvm-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: 10px;
}

.rvm-actions form { margin: 0; }

.rvm-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 40px;
    padding: 0 18px;
    border: 0;
    border-radius: 999px;
    background: #FFEBF2;
    color: #2E1D25;
    font-size: 14px;
    cursor: pointer;
    list-style: none;
}

.rvm-btn::-webkit-details-marker { display: none; }

.rvm-btn--go { background: #C9436E; color: #fff; }
.rvm-btn--stop { background: #2E1D25; color: #fff; }
.rvm-btn--quiet { min-height: 32px; font-size: 13px; background: transparent; color: #8A7079; }

.rvm-drop { position: relative; }

.rvm-drop[open] {
    display: block;
    width: 100%;
    background: #FFEBF2;
    border-radius: var(--rv-r-xs);
    padding: 14px 16px;
}

.rvm-drop form { margin-top: 12px; }

/* Список оснований. Ровно десять радиокнопок из закрытого списка - поля
   «иное» здесь нет и быть не должно: свободное основание позволяет отклонить
   что угодно, и по выгрузке добросовестная модерация перестаёт отличаться от
   чистки негатива (ч. 2 ст. 14.7 КоАП). */
.rvm-reasons {
    border: 0;
    margin: 0 0 12px;
    padding: 0;
    display: grid;
    gap: 6px;
}

.rvm-reasons legend {
    padding: 0 0 8px;
    font-size: 13px;
    color: #8A7079;
}

.rvm-reason {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    font-size: 14px;
    cursor: pointer;
}

.rvm-reason em { color: #8A7079; font-style: normal; }

.rvm-note { display: block; font-size: 13px; color: #8A7079; margin-bottom: 10px; }

.rvm-note input, .rvm-note textarea {
    display: block;
    width: 100%;
    box-sizing: border-box;
    margin-top: 6px;
    padding: 10px 12px;
    border: 1px solid #FFD6E4;
    border-radius: var(--rv-r-xs);
    background: #fff;
    font: inherit;
    color: #2E1D25;
}

.rvm-hint { font-size: 13px; color: #8A7079; margin: 0 0 12px; }

.rvm-check { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; margin-right: 10px; }

.rvm-pages {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-top: 18px;
}

.rvm-pages__now { font-family: var(--rv-mono-font); font-size: 13px; color: #8A7079; }

@media (max-width: 768px) {
    .rvm-card { padding: 14px; }
    .rvm-due { margin-left: 0; width: 100%; }
    .rvm-photo img { width: 104px; height: 104px; }
    .rvm-actions { flex-direction: column; align-items: stretch; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   ПРИДУМАННЫЕ ОТЗЫВЫ ИЗ АРТБОРДА: правила больше нет, и оно больше не нужно.

   30.08.2026 в сгенерированной карточке лежала готовая секция «Отзывы» с
   тремя выдуманными отзывами (Марина, Ольга, Дарья, пятёрки, даты, чужие
   фотографии). Это рисунок из макета Claude Design, попавший в шаблон вместе
   с вёрсткой, и на боевом он показывался покупателю как настоящие отзывы
   магазина: ч. 2 ст. 14.7 КоАП (введение в заблуждение о потребительских
   свойствах, для ИП 12 000-20 000 ₽) и ч. 1 ст. 14.8 КоАП.

   Сначала секцию погасили правилом `display: none` прямо тут: `generated/`
   пишет конвейер, а `custom.css` принадлежит другим сессиям. В тот же день
   секция убрана по-хорошему: конвейер заменяет её живым блоком модуля 7
   (правило `replace` на экране «03 Карточка товара» в
   `Сайт/tools/templates.rules.json`). Гасить стало нечего, правило снято.

   ⚠ Если придуманные отзывы вернутся, чинить надо ПРАВИЛО КОНВЕЙЕРА, а не
   прятать их стилями снова: спрятанный текст остаётся в исходном коде
   страницы и в поисковой выдаче. ═══════════════════════════════════════ */
