/* ============================================================
   Окно ордера: то, что умеет только СЕССИЯ аккаунта (10.09.2026).
   Отзывы (js/ui/order-window/reviews.js) и запрос на отмену продажи
   (js/ui/order-window/cancelRequest.js) — у ключевого API этого нет вовсе.

   Слой поверх окна ордера в его токенах (--bw-*, объявлены на .brv-overlay в
   order-window.css). Отдельный файл, а не хвост общего: у окна ордера уже 2800
   строк, и класть туда каждое новое окно значит превратить его в свалку.

   Приёмы те же, что у окна подробной проверки: высота задана рабочим
   пространством, содержимое прокручивается внутри — иначе окно прыгало бы за
   содержимым, унося кнопки из-под курсора.
   ============================================================ */

.brv-overlay {
  position: fixed; inset: 0; z-index: 10060;
  display: grid; place-items: center; padding: 58px 16px 20px;
  background: rgba(6, 7, 9, .62); backdrop-filter: blur(2px); overflow: auto;
  scrollbar-width: none;
  animation: brvFade .16s ease-out;
}
.brv-overlay::-webkit-scrollbar { display: none; }
[data-theme="light"] .brv-overlay { background: rgba(30, 28, 25, .42); }

.brv-modal {
  /* Уже окна проверки: отзывы — одна колонка текста, и широкое поле заставляло
     бы глаз бегать через весь экран ради двух слов. */
  width: min(620px, calc(100vw - 48px));
  height: min(760px, calc(100dvh - 96px));
  display: flex; flex-direction: column;
  background: var(--bw-bg); color: var(--bw-ink); font: 14px/1.5 var(--bw-f);
  border: 1px solid var(--bw-line2); border-radius: 14px; overflow: hidden;
  box-shadow: 0 30px 80px rgba(0, 0, 0, .6);
  animation: brvIn .2s cubic-bezier(.2, .8, .2, 1);
}

/* ---------- шапка ---------- */

.brv-head {
  flex: none; display: flex; align-items: center; gap: 10px;
  padding: 12px 14px; background: var(--bw-surf); border-bottom: 1px solid var(--bw-line);
}
.brv-head__t { font: 600 13.5px/1 var(--font-heading, var(--bw-f)); white-space: nowrap; }
.brv-head__nick {
  font: 500 11.5px/1 var(--bw-f); color: var(--bw-ink2);
  padding: 4px 7px; border-radius: 6px; background: var(--bw-surf2);
  max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.brv-tabs { margin-left: auto; display: inline-flex; gap: 4px; padding: 3px; border-radius: 9px; background: var(--bw-surf2); }
.brv-tab {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 5px 9px; border: 0; border-radius: 7px; cursor: pointer;
  background: transparent; color: var(--bw-ink2);
  font: 500 11.5px/1 var(--bw-f); white-space: nowrap;
  transition: background .14s ease, color .14s ease;
}
.brv-tab:hover { color: var(--bw-ink); }
.brv-tab svg { opacity: .7; }
.brv-tab.is-on { background: var(--bw-surf3); color: var(--bw-ink); }
.brv-tab--good.is-on { color: var(--bw-hi); }
.brv-tab--bad.is-on { color: var(--bw-red); }
.brv-tab__n {
  font: 600 10.5px/1 var(--bw-f); font-variant-numeric: tabular-nums;
  padding: 2px 4px; border-radius: 4px;
  background: rgba(255, 255, 255, .07); color: inherit;
}
[data-theme="light"] .brv-tab__n { background: rgba(17, 20, 24, .07); }

.brv-x {
  flex: none; width: 26px; height: 26px; display: grid; place-items: center;
  border: 1px solid var(--bw-line); border-radius: 7px; background: transparent;
  color: var(--bw-ink2); cursor: pointer; transition: background .14s ease, color .14s ease;
}
.brv-x:hover { background: var(--bw-surf2); color: var(--bw-ink); }

/* ---------- лента ---------- */

.brv-scroll { flex: 1; min-height: 0; overflow: auto; padding: 10px 12px 14px; }
.brv-list { display: flex; flex-direction: column; gap: 8px; }

.brv-item {
  padding: 9px 11px; border-radius: 10px;
  background: var(--bw-surf); border: 1px solid var(--bw-line);
  border-left: 2px solid var(--bw-hi);
  /* Появление лесенкой: глаз ловит порядок, а не вспышку всего списка разом.
     Задержка задана позициями, а не переменной в стиле элемента: свой токен
     ради анимации не заводим (сторож css_tokens требует объявленных), а
     дальше десятой строки лесенка превращается в ожидание. */
  animation: brvRow .22s ease-out backwards;
}
.brv-item:nth-child(1) { animation-delay: 0ms; }
.brv-item:nth-child(2) { animation-delay: 22ms; }
.brv-item:nth-child(3) { animation-delay: 44ms; }
.brv-item:nth-child(4) { animation-delay: 66ms; }
.brv-item:nth-child(5) { animation-delay: 88ms; }
.brv-item:nth-child(6) { animation-delay: 110ms; }
.brv-item:nth-child(7) { animation-delay: 132ms; }
.brv-item:nth-child(8) { animation-delay: 154ms; }
.brv-item:nth-child(9) { animation-delay: 176ms; }
.brv-item:nth-child(n+10) { animation-delay: 198ms; }
.brv-item--bad { border-left-color: var(--bw-red); }

.brv-item__head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 3px; }
.brv-item__who { font: 600 12px/1.2 var(--bw-f); color: var(--bw-ink); }
.brv-item__pay { font: 500 10.5px/1 var(--bw-f); color: var(--bw-ink3); padding: 2px 5px; border-radius: 5px; background: var(--bw-surf2); }
.brv-item__when { margin-left: auto; font: 500 10.5px/1 var(--bw-f); color: var(--bw-ink3); white-space: nowrap; }

.brv-item__text { font: 13px/1.45 var(--bw-f); color: var(--bw-ink); overflow-wrap: anywhere; }
.brv-item__text--mute { color: var(--bw-ink3); font-style: italic; }

.brv-item__reply {
  margin-top: 6px; padding: 6px 8px; border-radius: 7px;
  background: var(--bw-surf2); color: var(--bw-ink2);
  font: 12px/1.4 var(--bw-f); overflow-wrap: anywhere;
}
.brv-item__reply::before { content: "Ответ: "; color: var(--bw-ink3); }

/* ---------- «показать ещё» и хвост ---------- */

.brv-more {
  width: 100%; margin-top: 10px; padding: 9px 12px;
  display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  border: 1px solid var(--bw-line2); border-radius: 9px; background: var(--bw-surf);
  color: var(--bw-ink2); font: 500 12px/1 var(--bw-f); cursor: pointer;
  transition: background .14s ease, color .14s ease;
}
.brv-more:hover:not(:disabled) { background: var(--bw-surf2); color: var(--bw-ink); }
.brv-more:disabled { cursor: default; opacity: .8; }

.brv-spin {
  width: 12px; height: 12px; border-radius: 50%;
  border: 2px solid var(--bw-line2); border-top-color: var(--bw-ink2);
  animation: brvSpin .7s linear infinite;
}

.brv-end { margin-top: 10px; text-align: center; font: 500 11px/1 var(--bw-f); color: var(--bw-ink3); }
.brv-end:empty { display: none; }

/* ---------- пустое, отказ, скелет ---------- */

.brv-notice { padding: 34px 18px; text-align: center; }
.brv-notice__t { font: 600 13px/1.3 var(--font-heading, var(--bw-f)); color: var(--bw-ink); }
.brv-notice__s { margin-top: 6px; font: 12.5px/1.5 var(--bw-f); color: var(--bw-ink3); max-width: 380px; margin-inline: auto; }

.brv-skel { display: flex; flex-direction: column; gap: 8px; }
.brv-skel__row { padding: 11px; border-radius: 10px; background: var(--bw-surf); border: 1px solid var(--bw-line); }
.brv-skel__line {
  height: 9px; border-radius: 5px; margin-bottom: 7px;
  background: linear-gradient(90deg, var(--bw-surf2) 25%, var(--bw-surf3) 37%, var(--bw-surf2) 63%);
  background-size: 400% 100%;
  animation: brvShimmer 1.3s ease-in-out infinite;
}
.brv-skel__line:last-child { margin-bottom: 0; }
.brv-skel__line--head { width: 40%; }
.brv-skel__line--short { width: 65%; }

/* ---------- плитка-кнопка «Отзывы» в колонке контрагента ---------- */

/* Плитка метрики, ставшая кнопкой: отличается только откликом. Ни рамки, ни
   цвета — иначе она перестала бы читаться как часть ряда метрик. */
.bw-metric--click { cursor: pointer; transition: background .14s ease, transform .12s ease; }
.bw-metric--click:hover { background: var(--bw-surf3); }
.bw-metric--click:active { transform: translateY(1px); }
.bw-metric__hint {
  display: block; margin-top: 3px;
  font: 500 10px/1 var(--bw-f); color: var(--bw-ink3);
  opacity: 0; transition: opacity .14s ease;
}
.bw-metric--click:hover .bw-metric__hint { opacity: 1; }

/* ---------- движение ---------- */

@keyframes brvFade { from { opacity: 0; } to { opacity: 1; } }
@keyframes brvIn { from { opacity: 0; transform: translateY(8px) scale(.985); } to { opacity: 1; transform: none; } }
@keyframes brvRow { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: none; } }
@keyframes brvSpin { to { transform: rotate(360deg); } }
@keyframes brvShimmer { from { background-position: 100% 50%; } to { background-position: 0 50%; } }

/* Уважение к системной настройке: анимация здесь — украшение, а не смысл. */
@media (prefers-reduced-motion: reduce) {
  .brv-overlay, .brv-modal, .brv-item { animation: none; }
  .brv-skel__line { animation: none; }
}

@media (max-width: 640px) {
  .brv-overlay { padding: 12px; }
  .brv-modal { width: 100%; height: min(100dvh - 24px, 760px); }
  .brv-head { flex-wrap: wrap; }
  .brv-tabs { margin-left: 0; order: 3; width: 100%; }
}

/* ============================================================
   Запрос на отмену продажи (js/ui/order-window/cancelRequest.js)

   Кнопка стоит у номера ордера, панель выпадает ПОВЕРХ — шапка от раскрытия
   не растёт: полоса решения и колонки ниже не имеют права прыгать.
   ============================================================ */

.bw-creq { position: relative; display: inline-flex; align-items: center; flex: none; }

.bw-creq__btn {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 4px 9px; border-radius: 7px; cursor: pointer;
  border: 1px solid var(--bw-line2); background: var(--bw-surf);
  color: var(--bw-ink2); font: 500 11.5px/1 var(--bw-f); white-space: nowrap;
  transition: background .14s ease, color .14s ease, border-color .14s ease;
}
.bw-creq__btn:hover { background: var(--bw-surf2); color: var(--bw-ink); border-color: var(--bw-amber); }
.bw-creq__btn svg { opacity: .75; }
.bw-creq.is-open .bw-creq__btn { background: var(--bw-surf3); color: var(--bw-ink); border-color: var(--bw-amber); }

/* ---------- выпадающая панель ---------- */

.bw-creq__pop {
  position: absolute; top: calc(100% + 6px); left: 0; z-index: 40;
  width: 320px; padding: 10px;
  background: var(--bw-surf); border: 1px solid var(--bw-line2); border-radius: 11px;
  box-shadow: 0 18px 44px rgba(0, 0, 0, .45);
  animation: bwCreqIn .16s cubic-bezier(.2, .8, .2, 1);
}
.bw-creq__head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.bw-creq__title { font: 600 12px/1 var(--font-heading, var(--bw-f)); color: var(--bw-ink); }
.bw-creq__x {
  margin-left: auto; width: 20px; height: 20px; display: grid; place-items: center;
  border: 0; border-radius: 6px; background: transparent; color: var(--bw-ink3);
  font: 400 15px/1 var(--bw-f); cursor: pointer; transition: background .14s ease, color .14s ease;
}
.bw-creq__x:hover { background: var(--bw-surf2); color: var(--bw-ink); }

.bw-creq__reasons { display: flex; flex-direction: column; gap: 3px; max-height: 210px; overflow: auto; }
.bw-creq__reason {
  display: flex; align-items: flex-start; gap: 7px; width: 100%;
  padding: 6px 7px; border: 0; border-radius: 7px; cursor: pointer;
  background: transparent; color: var(--bw-ink2); text-align: left;
  font: 400 12px/1.35 var(--bw-f);
  transition: background .12s ease, color .12s ease;
}
.bw-creq__reason:hover { background: var(--bw-surf2); color: var(--bw-ink); }
.bw-creq__reason.is-on { background: var(--bw-amber-dim); color: var(--bw-ink); }
.bw-creq__dot {
  flex: none; width: 12px; height: 12px; margin-top: 2px; border-radius: 50%;
  border: 1.5px solid var(--bw-line2); transition: border-color .12s ease, box-shadow .12s ease;
}
.bw-creq__reason.is-on .bw-creq__dot {
  border-color: var(--bw-amber);
  box-shadow: inset 0 0 0 3px var(--bw-amber);
}

.bw-creq__remark {
  width: 100%; margin-top: 8px; padding: 7px 8px; resize: vertical;
  background: var(--bw-bg); color: var(--bw-ink);
  border: 1px solid var(--bw-line2); border-radius: 8px;
  font: 400 12px/1.4 var(--bw-f);
}
.bw-creq__remark:focus { outline: none; border-color: var(--bw-amber); }

.bw-creq__foot { display: flex; align-items: center; gap: 8px; margin-top: 10px; }
.bw-creq__note { font: 400 10.5px/1.3 var(--bw-f); color: var(--bw-ink3); }
.bw-creq__send {
  margin-left: auto; flex: none;
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px; border-radius: 8px; cursor: pointer;
  border: 1px solid var(--bw-amber); background: var(--bw-amber-dim); color: var(--bw-amber);
  font: 600 12px/1 var(--bw-f);
  transition: background .14s ease, opacity .14s ease;
}
.bw-creq__send:hover:not(:disabled) { background: var(--bw-amber); color: #1a1206; }
.bw-creq__send:disabled { cursor: default; opacity: .45; }

.bw-creq__load { display: flex; align-items: center; gap: 7px; padding: 12px 4px; font: 400 12px/1 var(--bw-f); color: var(--bw-ink3); }
.bw-creq__err { padding: 10px 4px; font: 400 12px/1.4 var(--bw-f); color: var(--bw-red); }
.bw-creq__spin {
  width: 12px; height: 12px; border-radius: 50%;
  border: 2px solid var(--bw-line2); border-top-color: var(--bw-amber);
  animation: brvSpin .7s linear infinite;
}

/* ---------- «отправлено» ---------- */

.bw-creq--done {
  gap: 6px; padding: 4px 9px; border-radius: 7px;
  background: var(--bw-hi-dim); color: var(--bw-hi);
  font: 500 11.5px/1 var(--bw-f); white-space: nowrap;
  animation: bwCreqDone .32s cubic-bezier(.2, .8, .2, 1);
}
.bw-creq__tick { display: inline-grid; place-items: center; }
.bw-creq__tick svg { animation: bwCreqTick .34s .06s ease-out backwards; }

@keyframes bwCreqIn { from { opacity: 0; transform: translateY(-4px) scale(.98); } to { opacity: 1; transform: none; } }
@keyframes bwCreqDone { from { opacity: 0; transform: scale(.94); } to { opacity: 1; transform: none; } }
@keyframes bwCreqTick { from { opacity: 0; transform: scale(.5) rotate(-12deg); } to { opacity: 1; transform: none; } }

@media (prefers-reduced-motion: reduce) {
  .bw-creq__pop, .bw-creq--done, .bw-creq__tick svg { animation: none; }
}

@media (max-width: 640px) {
  .bw-creq__pop { width: min(320px, calc(100vw - 32px)); }
}


/* mobile.css поднимает ВСЕМ кнопкам min-height 40px ради тач-целей, а окно
   отзывов живёт в `body`, вне `.bw-win`, — общая отбивка окна ордера до него
   не дотягивается. Отбиваем адресно и ВНЕ media-запроса, где выигрывает
   специфичность, а не порядок файлов (ловушка 5 правил портала). */
.brv-tab,
.brv-x,
.brv-more { min-height: 0 }
