/* Тона позиций и цен заданы владельцем — значения перенесены дословно из
   app.css старой морды, чтобы плашка не сменила смысл при переезде. */
:root {
  --ink: #080808; --body: #363636; --mute: #898989;
  --canvas: #fff; --hairline: #d8d8d8; --hairline-soft: #ededed;
  --won-bg: #e0f6e5; --won-fg: #146c2e;
  --near-bg: #cbd9fa; --near-fg: #1b3a8c;
  --far-bg: #fce4e5; --far-fg: #c0392b;
  --blue-deep: #006acc; --red: #ee1d36; --green: #00d722; --yellow: #ffae13;
}
* { box-sizing: border-box }
body { margin: 0; font: 14px/1.45 -apple-system, "Segoe UI", system-ui, sans-serif;
       color: var(--body); background: #fafafa }
a { color: inherit; text-decoration: none }
.top { display: flex; align-items: center; gap: 16px; padding: 12px 20px;
       background: var(--canvas); border-bottom: 1px solid var(--hairline); position: sticky; top: 0; z-index: 5 }
.brand { font-weight: 700; font-size: 16px; color: var(--ink) }
.top form { margin-left: auto }
button { font: inherit; cursor: pointer; border-radius: 6px; padding: 6px 12px;
         border: 1px solid var(--hairline); background: var(--canvas); color: var(--body) }
button:hover { border-color: var(--mute) }
button.ghost { border-color: transparent; color: var(--mute) }
button.danger { color: var(--red); border-color: #f3c2c7 }
main { padding: 20px; max-width: 1400px; margin: 0 auto }
.loading { color: var(--mute); padding: 40px; text-align: center }
.err { background: var(--far-bg); color: var(--far-fg); padding: 12px 16px; border-radius: 8px; margin-bottom: 16px }

/* ── общие плашки: живут отдельно от раскладки ───────────────────────
   Раньше они лежали внутри блока «список задач» и уехали вместе с ним при
   перевёрстке, хотя используются и на карточке, и в прогонах. */
.chip { font-size: 11px; padding: 2px 8px; border-radius: 20px;
        background: var(--hairline-soft); white-space: nowrap }
.chip.new { background: #e8f0ff; color: var(--near-fg) }
.chip.stock { background: #fff4d6; color: #8a5a00 }
.chip.gone { background: var(--far-bg); color: var(--far-fg) }
.chip.drift { background: #f0e8ff; color: #5b2bb8 }
/* Тона позиции заданы владельцем — значения перенесены из старой морды. */
.pill { display: inline-block; padding: 4px 11px; border-radius: 20px;
        font-weight: 600; color: var(--ink); white-space: nowrap }
.pos-won { background: var(--won-bg); color: var(--won-fg) }
.pos-near { background: var(--near-bg); color: var(--near-fg) }
.pos-far, .pos-none { background: var(--far-bg); color: var(--far-fg) }
.st { font-size: 11px; padding: 1px 7px; border-radius: 4px;
      background: var(--hairline-soft); white-space: nowrap }
.st.ok { background: var(--won-bg); color: var(--won-fg) }
.st.partial { background: #fff4d6; color: #8a5a00 }
.st.error, .st.interrupted { background: var(--far-bg); color: var(--far-fg) }

/* ── список задач: ряды во всю ширину ───────────────────────────────── */
.rows { display: flex; flex-direction: column; gap: 10px }
.row { display: grid; gap: 16px; align-items: center; padding: 14px 18px;
       grid-template-columns: 62px minmax(0, 1fr) auto auto;
       background: var(--canvas); border: 1px solid var(--hairline);
       border-radius: 12px }
/* Та же тень, что у строк якорей: одинаковое действие должно выглядеть
   одинаково на всех экранах. */
.row:hover { border-color: #b9c6d4;
             box-shadow: 0 1px 2px rgba(16,24,40,.14), 0 2px 5px rgba(16,24,40,.08) }
.row img { width: 62px; height: 82px; object-fit: cover; border-radius: 7px;
           background: var(--hairline-soft) }
.row-main { min-width: 0 }
.row-name { font-size: 17px; font-weight: 600; color: var(--ink); overflow-wrap: anywhere }
.row-facts { margin-top: 3px; display: flex; align-items: center; gap: 6px;
             flex-wrap: wrap; font-size: 13px }
.row-facts b { color: var(--ink); font-weight: 600 }
.row-facts .art { font-variant-numeric: tabular-nums }
/* Происхождение выгрузки тише состава: к нему обращаются, когда что-то
   не сходится, а не при каждом взгляде на список. */
.row-origin { margin-top: 4px; font-size: 12px; color: var(--mute) }
.row-median { display: flex; align-items: center; gap: 8px; white-space: nowrap }
.row-median .pill { font-weight: 500; border: 1px solid var(--hairline) }
.row-median .pill b { font-weight: 700; margin-left: 4px }
.row-median .pos-won, .row-median .pos-near,
.row-median .pos-far, .row-median .pos-none { border-color: transparent }
.row-found { font-size: 12px; color: var(--mute); font-variant-numeric: tabular-nums }
.row-last { display: flex; align-items: center; gap: 7px; font-size: 12px;
            white-space: nowrap; min-width: 168px }
.dot { width: 7px; height: 7px; border-radius: 50%; background: var(--mute-soft, #ababab) }
.dot.ok { background: var(--green) }
.dot.partial { background: var(--yellow) }
.dot.error, .dot.interrupted { background: var(--red) }

@media (max-width: 900px) {
  .row { grid-template-columns: 62px 1fr; }
  .row-median, .row-last { grid-column: 2 }
}

/* страница задачи */
.head { display: flex; gap: 16px; align-items: flex-start; margin-bottom: 18px; flex-wrap: wrap }
.head img { width: 92px; height: 122px; object-fit: cover; border-radius: 8px; background: var(--hairline-soft) }
h1 { font-size: 20px; margin: 0 0 4px; color: var(--ink); overflow-wrap: anywhere }
.tiles { display: flex; gap: 6px; flex-wrap: wrap; margin: 10px 0 }
.tile { text-align: center; padding: 6px 10px; border-radius: 8px; min-width: 58px; background: var(--hairline-soft) }
.tile b { display: block; font-size: 17px; color: var(--ink) }
.tile span { font-size: 10px; color: var(--mute) }
table { width: 100%; border-collapse: collapse; background: var(--canvas);
        border: 1px solid var(--hairline); border-radius: 10px; overflow: hidden }
th, td { padding: 8px 10px; text-align: left; border-bottom: 1px solid var(--hairline-soft); vertical-align: middle }
th { font-size: 11px; text-transform: uppercase; letter-spacing: .04em; color: var(--mute); font-weight: 600 }
tr:last-child td { border-bottom: 0 }
td.num, th.num { text-align: right; font-variant-numeric: tabular-nums }
.anchor-img { width: 34px; height: 45px; object-fit: cover; border-radius: 4px; background: var(--hairline-soft) }
.price-up { color: var(--blue-deep) } .price-down { color: var(--red) }
.spark { display: block }
.muted { color: var(--mute) }
.section { margin-top: 24px }
.section h2 { font-size: 13px; text-transform: uppercase; letter-spacing: .04em; color: var(--mute); margin: 0 0 8px }
.cal { display: flex; gap: 2px; overflow-x: auto; padding-bottom: 4px }
.cal div { min-width: 26px; text-align: center; font-size: 10px; padding: 3px 2px; border-radius: 4px; background: var(--hairline-soft) }
.cal div.empty { opacity: .35 }
.cal b { display: block; font-size: 12px; color: var(--ink) }

.cal-row { display: flex; align-items: center; gap: 8px; margin-bottom: 3px }
.cal-label { min-width: 92px; font-size: 11px; color: var(--mute); text-align: right; flex: none }
.cal div.up { background: var(--won-bg); color: var(--won-fg) }
.cal div.down { background: var(--far-bg); color: var(--far-fg) }
.status-chip { font-size: 12px; color: var(--mute) }
.status-chip.err { color: var(--far-fg) }
.mday.pos-won { background: var(--won-bg) }
.mday.pos-won b, .mday.pos-won .mday-date, .mday.pos-won .mday-of { color: var(--won-fg) }
.mday.pos-near { background: var(--near-bg) }
.mday.pos-near b, .mday.pos-near .mday-date, .mday.pos-near .mday-of { color: var(--near-fg) }
.mday.pos-far, .mday.pos-none { background: var(--far-bg) }
.mday.pos-far b, .mday.pos-far .mday-date, .mday.pos-far .mday-of,
.mday.pos-none b, .mday.pos-none .mday-date, .mday.pos-none .mday-of { color: var(--far-fg) }

/* ── шапка карточки товара ───────────────────────────────────────────── */
.panel { background: var(--canvas); border: 1px solid var(--hairline);
         border-radius: 12px; padding: 18px 20px }
.head2 { display: grid; gap: 20px; align-items: start; margin-bottom: 16px;
         grid-template-columns: 132px minmax(240px, 1fr) auto auto }
.hero { width: 132px; height: 176px; object-fit: cover; border-radius: 8px;
        background: var(--hairline-soft) }
.head2-main h1 { font-size: 30px; letter-spacing: -.01em; margin: 0 }
.price-lg { font-size: 20px; font-weight: 700; color: var(--ink); margin-bottom: 14px }
.head2-facts { font-size: 15px; margin-bottom: 6px }
.head2-facts b, .head2-sub b { color: var(--ink); font-weight: 600 }
.head2-sub { font-size: 13px; color: var(--mute); line-height: 1.7 }
/* Имя задачи — второй строкой под артикулом, а не подписью внизу блока.
   Оно человекочитаемое и по нему задачу ищут глазами в списке; серым 12px
   в самом низу оно читалось как служебная метка. */
.head2-name { margin: 2px 0 12px; font-size: 15px; font-weight: 500;
              color: var(--body); overflow-wrap: anywhere }
.head2-act { display: flex; flex-direction: column; gap: 8px }

/* сводка медианы и плитки суток */
.head2-median { min-width: 0 }
.msum { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
        border: 1px solid var(--hairline); border-radius: 10px; padding: 12px 16px }
.msum-label { color: var(--mute) }
.msum-now { font-size: 20px; font-weight: 700; color: var(--ink);
            background: var(--hairline-soft); border-radius: 8px; padding: 4px 14px }
.msum-note { color: var(--mute); font-size: 13px }
.msum-note b { color: var(--ink) }
.mdays { display: flex; gap: 6px; margin-top: 8px; flex-wrap: wrap }
.mday { min-width: 74px; text-align: center; background: var(--hairline-soft);
        border-radius: 10px; padding: 7px 8px 8px }
.mday-date { display: block; font-size: 10px; color: var(--mute) }
.mday b { display: block; font-size: 19px; font-weight: 700; color: var(--ink);
          line-height: 1.25 }
.mday-of { display: block; font-size: 10px; color: var(--mute); margin-top: 1px }

/* Стрелка медианы перевёрнута: вниз по числу = вверх по качеству.
   В таблице присутствия она прямая — там больше полок значит лучше. */
.d { font-size: 12px; font-weight: 700 }
.d.up { color: #157a2e } .d.down { color: var(--far-fg) } .d.flat { color: var(--mute) }

/* ── присутствие ─────────────────────────────────────────────────────── */
.panel-head { display: flex; align-items: center; gap: 12px; margin-bottom: 14px }
.panel-head h2 { margin: 0; font-size: 17px; color: var(--ink);
                 text-transform: none; letter-spacing: 0 }
/* Источник тише названия: он уточняет, а не спорит с заголовком. */
.panel-head h2 .src { color: var(--mute); font-weight: 400 }
/* Первый блок после шапки не отодвигаем — .section даёт отступ сверху,
   а шапка уже отбита своим margin-bottom. */
.head2 + #msg + .section, #msg + .section { margin-top: 0 }
.toggle { margin-left: auto; display: flex; gap: 4px }
.toggle button { border: 0; background: transparent; color: var(--mute); padding: 5px 12px }
.toggle button.on { background: #e8f0ff; color: var(--near-fg); font-weight: 600 }
.pscroll { overflow-x: auto }
/* separate + border-spacing, а не collapse: иначе соседние ячейки одного тона
   сливаются в сплошную полосу и столбцы перестают читаться по отдельности. */
/* width:100% и «сожмись по содержимому» у колонки подписей: иначе таблица
   растягивалась, слак уходил в первую колонку, и слева зияло пустое поле,
   а подписи оказывались прижатыми к сетке. */
.ptable { border: 0; border-radius: 0; width: 100%;
          border-collapse: separate; border-spacing: 8px 8px }
.ptable th, .ptable td { border: 0; padding: 0; text-align: center }
.ptable thead th { font-size: 12px; color: var(--mute); text-transform: none;
                   letter-spacing: 0; font-weight: 400; padding-bottom: 2px }
.ptable th.prow { text-align: left; color: var(--body); font-size: 13px;
                  white-space: nowrap; width: 1%; padding-right: 18px;
                  text-transform: none; letter-spacing: 0; font-weight: 400 }
.ptable thead th:first-child { width: 1% }
/* ПЛАШКА У КАЖДОЙ ячейки, включая нейтральную. Прозрачные нейтральные
   выглядели дырами в сетке, и глаз терял строку на середине. Тон здесь
   говорит «заметное изменение», а не «есть данные». */
/* Разделители строк рисуются В ПРОСВЕТЕ между строками.
   Ни border-bottom, ни фон строки не годятся: при border-collapse: separate
   бордюр рвётся на горизонтальных просветах между ячейками, а фон строки
   целиком перекрывается фоном самих ячеек — проверено, линия была видна
   только под подписью. Поэтому абсолютный псевдоэлемент от позиционированной
   строки: он тянется во всю её ширину поверх просвета. */
.ptable tbody tr { position: relative }
.ptable tbody tr:not(:last-child) th.prow::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: -5px;
  height: 1px; background: var(--hairline-soft) }
/* .ptable td.pcell, а не .pcell: правило «.ptable th, .ptable td { padding: 0 }»
   выше по файлу весит больше одного класса, и отступы просто не применялись —
   высота плашки держалась на межстрочном интервале. */
.ptable td.pcell { min-width: 78px; padding: 18px 12px 16px; border-radius: 10px;
                   background: #f2f4f7 }
/* Воздух СНАРУЖИ пары «число + дельта», а не между ними: они про одно и то же
   и должны читаться как один блок. Разводить их промежутком значит делать
   из сноски второе число. */
.pcell b { display: block; font-size: 18px; font-weight: 700; color: var(--ink);
           line-height: 1.1; margin-bottom: 1px }
.pcell i { font-style: normal; font-size: 11px; font-weight: 600; color: var(--mute);
           line-height: 1 }
/* Тон тоже через .ptable td: поднимая вес селектора у нейтрального фона,
   легко перебить подкраску и не заметить — вся сетка становится серой. */
.ptable td.pcell.is-up { background: var(--won-bg) }
.pcell.is-up b, .pcell.is-up i { color: var(--won-fg) }
.ptable td.pcell.is-down { background: var(--far-bg) }
.pcell.is-down b, .pcell.is-down i { color: var(--far-fg) }
/* Сутки глубже недели приходят в том же payload и просто скрыты —
   поэтому «всё» разворачивает их мгновенно, без обращения к серверу. */
.deep { display: none }
#root.show-deep .deep { display: table-cell }
.foot { margin: 14px 0 0; font-size: 12px; color: var(--mute); line-height: 1.6 }

@media (max-width: 1100px) {
  .head2 { grid-template-columns: 100px 1fr; }
  .head2-median, .head2-act { grid-column: 1 / -1 }
  .head2-act { flex-direction: row }
}

/* ── блок якорей ─────────────────────────────────────────────────────── */
.tscroll { overflow-x: auto }
/* Строка — самостоятельный блок, но таблица остаётся таблицей: колонки
   обязаны быть выровнены между строками, а набор из div'ов это выравнивание
   пришлось бы держать руками. separate + border-spacing даёт и то, и другое. */
.atable { border: 0; border-radius: 0; background: transparent;
          border-collapse: separate; border-spacing: 0 8px }
.atable th, .atable td { padding: 10px 10px; border: 0 }
.atable thead th { padding-bottom: 2px }
.atable tbody td { background: var(--canvas); border-top: 1px solid var(--hairline);
                   border-bottom: 1px solid var(--hairline) }
.atable tbody td:first-child { border-left: 1px solid var(--hairline);
                               border-radius: 10px 0 0 10px; padding-left: 12px }
.atable tbody td:last-child { border-right: 1px solid var(--hairline);
                              border-radius: 0 10px 10px 0; padding-right: 12px }
/* Подсветка под курсором: строку читают по горизонтали, и на четырнадцати
   подряд глаз теряет, в какой он сейчас. Тень приподнимает её над соседями —
   одного изменения фона на светлой теме почти не видно.

   Тень — filter: drop-shadow на СТРОКЕ, а не box-shadow на ячейках.
   Проверено на скриншоте: box-shadow у каждой td даёт свою тень, и на стыках
   ячеек появляются вертикальные полосы посреди строки. drop-shadow обводит
   объединённый силуэт строки одной линией. */
.atable tbody tr:hover td { border-color: #b9c6d4; background: #f7fafd }
.atable tbody tr:hover { filter: drop-shadow(0 1px 2px rgba(16,24,40,.14))
                                 drop-shadow(0 2px 5px rgba(16,24,40,.08)) }
.panel-head .src { color: var(--mute); font-weight: 400 }

/* ── прогоны: справка, а не главное ──────────────────────────────────── */
.runs summary { display: flex; align-items: center; gap: 12px; cursor: pointer;
                list-style: none; user-select: none }
.runs summary::-webkit-details-marker { display: none }
.runs summary::after { content: "▸"; color: var(--mute); margin-left: auto;
                       transition: transform .15s }
.runs[open] summary::after { transform: rotate(90deg) }
.runs summary h2 { margin: 0; font-size: 17px; color: var(--ink);
                   text-transform: none; letter-spacing: 0 }
.runs-sum { display: flex; align-items: center; gap: 8px; font-size: 12px }
.runs[open] summary { margin-bottom: 10px }
/* Прогоны — простой список: выделять каждую строку в блок незачем, это
   справка, и рамки здесь только шумят. Отделяем волоском. */
.rtable { border: 0; border-radius: 0; background: transparent;
          border-collapse: collapse; width: 100% }
.rtable td { background: transparent; border: 0;
             border-bottom: 1px solid var(--hairline-soft); padding: 7px 10px }
.rtable tbody tr:last-child td { border-bottom: 0 }
.rtable tbody tr:hover td { background: #fafbfc }
.rtable .rid { width: 1%; white-space: nowrap; font-variant-numeric: tabular-nums }
/* Дата в одну строку: перенос делает её нечитаемой, а места она просит немного. */
.rtable .rwhen { width: 1%; white-space: nowrap; color: var(--mute);
                 font-variant-numeric: tabular-nums }
.rtable td:last-child { width: 100%; color: var(--mute) }

/* Возврат к списку: логотип в шапке ведёт туда же, но по нему не догадаться. */
.back { display: inline-block; margin-bottom: 12px; color: var(--mute); font-size: 13px }
.back:hover { color: var(--ink) }
/* Остаток: те же два порога, что у счётчиков в списке. Ноль и «кончается» —
   разные факты, поэтому и цвета разные, а не один «тревожный». */
.atable td.low { color: #8a5a00; font-weight: 700 }
.atable td.gone { color: var(--far-fg); font-weight: 700 }
/* Колонки по содержимому; свободную ширину забирает столбец с якорем.
   width:1% + nowrap — табличная идиома «сожмись до содержимого». */
.atable th, .atable td { width: 1%; white-space: nowrap }
/* Свободную ширину забирает колонка ЯКОРЯ. Раньше правило стояло на втором
   столбце, и когда перед ним встала колонка «#», слак ушёл в столбец
   с картинкой: ссылка .thumb-link растянулась на всю его ширину и накрыла
   невидимой ссылкой на WB примерно сорок процентов строки — клик по пустому
   месту уводил из приложения. Поэтому колонка названа по классу, а не по
   номеру: номера смещаются при каждой новой колонке. */
.atable .anchor-col { width: 100% }
/* График фиксированной ширины. preserveAspectRatio="none" и
   non-scaling-stroke оставлены: они держат линию одинаковой толщины
   независимо от того, какую ширину зададут здесь. */
.atable .spark-cell { width: 150px; min-width: 150px }
.atable td.spark-cell { padding-right: 18px }
.spark { display: block; width: 150px; height: 22px }

/* ── ссылки на WB и превью миниатюры ─────────────────────────────────── */
.wb-ref { color: inherit; border-bottom: 1px solid var(--hairline) }
.wb-ref:hover { color: var(--blue-deep); border-bottom-color: currentColor }
h1 .wb-ref { border-bottom: 0 }
h1 .wb-ref:hover { color: var(--blue-deep) }
.thumb-link { display: inline-block; width: fit-content; line-height: 0 }
#thumb-preview { position: fixed; z-index: 1000; padding: 4px; background: #fff;
                 border: 1px solid var(--hairline); border-radius: 10px;
                 box-shadow: 0 8px 28px rgba(0,0,0,.18);
                 /* Окно не должно перехватывать курсор — иначе оно гасит само
                    себя, оказавшись под ним. */
                 pointer-events: none }
#thumb-preview[hidden] { display: none }
#thumb-preview img { display: block; width: 300px; height: 400px;  /* 3:4, как у WB */
                     object-fit: cover; border-radius: 7px; background: #f4f4f4 }

/* Опорный якорь: даёт больше порога доли трафика ниши. Его снятие или
   распродажа заметно двигают всю полку, поэтому строка видна сразу.
   Подсветка слева полосой, а не фоном: фон уже занят наведением, и два
   заливочных состояния на одной строке спорили бы. */
.atable tbody tr.major td:first-child { box-shadow: inset 3px 0 0 var(--near-fg) }
.atable tbody tr.major .share { color: var(--near-fg); font-weight: 700 }
.atable td.share { color: var(--body) }

/* ── развёрнутая карточка якоря ──────────────────────────────────────── */
.atable tbody tr.anchor { cursor: pointer }
.atable tbody tr.anchor.is-open td { border-color: var(--near-fg);
                                     background: #f7fafd; border-bottom-color: transparent }
.atable tbody tr.anchor.is-open td:first-child { border-radius: 10px 0 0 0 }
.atable tbody tr.anchor.is-open td:last-child { border-radius: 0 10px 0 0 }
.detail-row td { padding: 0 !important; background: transparent !important }
.detail-cell { border: 0 !important }
.detail { border: 1px solid var(--near-fg); border-top: 0; border-radius: 0 0 10px 10px;
          background: var(--canvas); padding: 4px 18px 14px; margin-top: -8px;
          cursor: default }
.detail-head { display: flex; gap: 14px; align-items: flex-start; padding: 12px 0 6px }
.detail-img { width: 62px; height: 82px; object-fit: cover; border-radius: 7px;
              background: var(--hairline-soft) }
.detail-title { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
                font-size: 17px; font-weight: 700; color: var(--ink) }
.detail-title .muted { font-size: 12px; font-weight: 400; text-transform: uppercase;
                       letter-spacing: .04em }
.detail-title .pill { font-size: 13px; font-weight: 500 }
.detail-price { margin-top: 6px; font-size: 16px; font-weight: 700; color: var(--blue-deep) }
.detail-price span { font-weight: 600; font-size: 14px }
.detail-facts { margin-top: 3px; font-size: 13px; color: var(--body) }
/* Стрелка вверх, а не крестик: крестик читается как «удалить», и рядом
   в строке стоит настоящий крестик удаления якоря — два одинаковых значка
   с разным смыслом в двадцати пикселях друг от друга. */
.detail-close { margin-left: auto; display: flex; align-items: center;
                padding: 6px 8px; color: var(--mute); border-color: transparent }
.detail-close:hover { color: var(--ink); background: var(--hairline-soft) }

/* график */
.chart { position: relative; margin-top: 6px }
.chart-svg { display: block; width: 100%; height: 250px }
.chart-svg .grid { stroke: var(--hairline-soft); stroke-width: 1;
                   vector-effect: non-scaling-stroke }
.chart-svg .ax { fill: var(--mute); font-size: 11px }
.chart-svg .line { fill: none; stroke: #1a5fb4; stroke-width: 2.5;
                   stroke-linejoin: round; stroke-linecap: round;
                   vector-effect: non-scaling-stroke }
.chart-svg .cursor { fill: #1a5fb4 }
/* Подсказка не должна перехватывать курсор — иначе она гасит сама себя,
   оказавшись под ним, ровно как превью миниатюры. */
.tip { position: absolute; pointer-events: none; background: #14477d; color: #fff;
       padding: 8px 12px; border-radius: 8px; font-size: 13px; line-height: 1.4;
       box-shadow: 0 4px 14px rgba(0,0,0,.2) }
.tip[hidden] { display: none }
.tip b { display: block; font-weight: 700 }
.tip span { opacity: .85 }
.detail-foot { display: flex; align-items: center; gap: 12px; margin-top: 8px;
               font-size: 12px }
.detail-foot .toggle { margin-left: auto }
.detail-title .idx { color: var(--mute); font-weight: 600; font-size: 14px }
/* Номер строки — порядок в выгрузке, по убыванию трафика. Приглушён:
   это ориентир при разговоре о якоре, а не показатель. */
.atable .idx-cell { color: var(--mute); font-variant-numeric: tabular-nums;
                    text-align: right; padding-right: 2px }
/* Высота задаётся контейнером: chart.js в responsive-режиме тянется под него. */
.chart { height: 260px }
.chart canvas { display: block }

/* Кнопка снятия якоря. Квадрат ПОСТОЯННОГО размера: взвод меняет только цвет,
   не габарит, иначе строка переверстывается и колонки прыгают. */
.atable button[data-drop] { width: 30px; height: 30px; padding: 0; flex: none;
                            display: inline-flex; align-items: center;
                            justify-content: center; font-size: 15px }
.atable button[data-drop]:hover { background: var(--far-bg); color: var(--far-fg);
                                  border-color: #f3c2c7 }
/* Взведённая кнопка — само подтверждение вместо модалки. Сплошной красный тот же,
   что у плашки «распродано»: на странице это единственные два места, где красный
   значит «конец», а не «плохая позиция». */
.atable button[data-drop].is-armed,
.atable button[data-drop].is-armed:hover { background: #c8102e; color: #fff;
                                           border-color: #c8102e; font-weight: 700 }

/* Второй уровень: заметный якорь, но не опора. Та же полоса, тоньше и тише —
   иерархия читается сама, без легенды: чем толще и темнее, тем важнее. */
.atable tbody tr.notable td:first-child { box-shadow: inset 3px 0 0 #b9d0ea }
.atable tbody tr.notable .share { color: var(--body); font-weight: 600 }

/* ── форма задачи ────────────────────────────────────────────────────
   Ссылка-кнопка выглядит кнопкой: «Отмена» и «Изменить» — переходы, а не
   действия, и делать их <button> значило бы отнять у них середину клика
   и «открыть в новой вкладке». */
.button { display: inline-block; font: inherit; border-radius: 6px; padding: 6px 12px;
          border: 1px solid var(--hairline); background: var(--canvas); color: var(--body) }
.button:hover { border-color: var(--mute) }
.primary { background: var(--ink); border-color: var(--ink); color: #fff }
.primary:hover { background: #000; border-color: #000 }
button.primary:disabled { background: var(--mute); border-color: var(--mute); cursor: progress }

.list-head { display: flex; align-items: center; gap: 12px; margin-bottom: 12px }
.list-head .button { margin-left: auto }

/* Колонка, а не сетка: поля разной длины, и попытка выровнять их в два столбца
   ставит рядом «имя» и «max_items» — вещи несопоставимой важности. */
.form-panel { max-width: 640px }
.field { margin-bottom: 16px }
.field label { display: block; font-weight: 600; color: var(--ink); margin-bottom: 5px }
.field label .note { font-weight: 400; color: var(--mute) }
.field input, .field textarea { width: 100%; font: inherit; color: var(--body);
                                border: 1px solid var(--hairline); border-radius: 6px;
                                padding: 7px 10px; background: var(--canvas) }
/* Высота задана НАЦЕЛО строками, а не min-height: иначе поле кончается посреди
   строки цифр, и обрезанный артикул читается как опечатка. line-height поэтому
   пришпилен пикселями — от наследуемого 1.45 высота дробная. 14 строк: столько
   якорей в типичной задаче, и состав виден целиком без прокрутки. */
.field textarea { resize: vertical; line-height: 20px; height: calc(20px * 14 + 16px);
                  font-family: ui-monospace, SFMono-Regular, Menlo, monospace }
.field input:focus, .field textarea:focus { outline: 2px solid var(--blue-deep);
                                            outline-offset: -1px; border-color: var(--blue-deep) }
.hint { font-size: 12px; color: var(--mute); margin-top: 4px }
/* Ошибка поля — под полем и красной рамкой, а не сводкой сверху: при семи полях
   список наверху заставляет искать, к какому из них он относится. */
.ferr { font-size: 12px; color: var(--far-fg); margin-top: 4px; font-weight: 600 }
.field:has(.ferr) input, .field:has(.ferr) textarea { border-color: #f3c2c7 }
.actions { display: flex; gap: 10px; align-items: center; margin-top: 20px }
