/* WB Analytics — тема «Neo Soft» по артефакту владельца (2026-07-22, v2).
   Слой поверх инлайновых <style> всех страниц, КРОМЕ дашборда (он самодостаточен).
   Неоморфизм: градиентный фон, выпуклые карточки, вдавленные поля. */
/* Шрифты со своего домена. Раньше здесь стоял @import с
   fonts.googleapis.com: из РФ он отвечает через раз, а @import в CSS
   блокирует отрисовку и грузится ПОСЛЕ самого файла — страница висела
   в спиннере до таймаута. Этот файл подключают 33 шаблона, то есть
   почти весь сервис.
   Веса Manrope намеренно ограничены 500-900, как и в прежнем импорте
   (он просил 500;600;700;800). Файл вариативный и умеет 100-900, но с
   доступным 400 весь интерфейс становится заметно тоньше — владелец
   03.08.2026 сравнил и попросил вернуть прежнюю плотность. Диапазон
   начинается с 500, поэтому font-weight:400 браузер рисует пятисоткой,
   ровно как раньше. Хотите легче — расширьте до 100 900 здесь и в
   static/fonts/webfonts.css.
   Копия static/fonts/webfonts.css — держим здесь же, чтобы не платить
   лишним запросом за 3 КБ. */
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:600;font-display:swap;
  src:url(/static/fonts/jetbrains-mono-var-cyrillic.woff2) format('woff2');
  unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:600;font-display:swap;
  src:url(/static/fonts/jetbrains-mono-var-cyrillic-ext.woff2) format('woff2');
  unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:600;font-display:swap;
  src:url(/static/fonts/jetbrains-mono-var-latin.woff2) format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:600;font-display:swap;
  src:url(/static/fonts/jetbrains-mono-var-latin-ext.woff2) format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}
@font-face{font-family:'Manrope';font-style:normal;font-weight:500 900;font-display:swap;
  src:url(/static/fonts/manrope-var-cyrillic.woff2) format('woff2');
  unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}
@font-face{font-family:'Manrope';font-style:normal;font-weight:500 900;font-display:swap;
  src:url(/static/fonts/manrope-var-cyrillic-ext.woff2) format('woff2');
  unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}
@font-face{font-family:'Manrope';font-style:normal;font-weight:500 900;font-display:swap;
  src:url(/static/fonts/manrope-var-latin.woff2) format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:'Manrope';font-style:normal;font-weight:500 900;font-display:swap;
  src:url(/static/fonts/manrope-var-latin-ext.woff2) format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}

:root{
  --bg-1:#edeef4; --bg-2:#e5e7ef;
  --card:#fbfbfe; --card-2:#f4f5fb;
  /* Вторичный и третичный текст. Прежние #8a8fa6 и #adb1c4 давали на самом
     тёмном фоне (--bg-2) всего 2.59:1 и 1.72:1 — AA требует 4.5:1. Оттенок
     сохранён, изменена только светлота. Замеры на всех фонах — в
     docs/mobile/decisions.md. Значение из первого ТЗ (#6B7383) не подошло:
     на градиентном десктопном фоне оно даёт 3.86:1. */
  --ink:#2b2f45; --muted:#565967; --faint:#636778; --line:#e7e9f2;
  /* Декоративный серый: точки легенды, полоски, заливки иконок — не текст,
     контраст 4.5:1 к ним неприменим. Раньше для этого брали --faint. */
  --decor:#adb1c4;
  --indigo:#5b5bf5; --indigo-soft:#ecebfe;
  /* Нажатый акцент и подчёркивание ссылок-артикулов: были вписаны цифрами
     по месту, теперь токены — чтобы мобильный слой мог их переопределить. */
  --indigo-press:#4340c4; --indigo-line:#c5c4fb;
  --indigo-rgb:91,91,245;
  --orange:#f1632e; --orange-soft:#feeee7;
  --plus:#17b26a; --minus:#e5484d;
  --grad-i:linear-gradient(135deg,#6a63f8,#5b5bf5);
  /* Заливка ГЛАВНОЙ кнопки — одна на весь сервис. Раньше каждая
     страница красила её сама: где var(--grad-i), где прямой
     linear-gradient(135deg,#3B5A8C,#27406B), где #2F6BF5, и в
     админском аккаунте, где --grad-i переопределён на градиент
     бокового меню, кнопки получали сжатую радугу от тёмно-синего до
     голубого — жалоба владельца 26.08.2026 «на разных страницах
     разные оттенки синего». Менять цвет главной кнопки — только
     здесь (и в side-grad.css для админского аккаунта). */
  --btn-pri:var(--grad-i);
  --raise: -6px -6px 16px rgba(255,255,255,.85), 8px 10px 26px rgba(74,84,140,.15);
  --raise-sm: -3px -3px 9px rgba(255,255,255,.8), 4px 5px 14px rgba(74,84,140,.13);
  --inset: inset 3px 3px 7px rgba(74,84,140,.15), inset -3px -3px 7px rgba(255,255,255,.9);
}

html{background:var(--bg-1)}
body{
  font-family:Manrope,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  background:linear-gradient(150deg,var(--bg-1),var(--bg-2)) fixed;
  color:var(--ink);
  -webkit-font-smoothing:antialiased;
}
h1,h2,h3,.logo,.kpi .value,.hero h1{letter-spacing:-.01em}
::selection{background:rgba(var(--indigo-rgb),.18)}

/* Карточки — выпуклые, крупный радиус */
.card,.kpi,.demo,.formcard{
  background:var(--card);
  border-radius:1.375rem;
  border:0;
  box-shadow:var(--raise);
  transition:box-shadow .2s ease, transform .2s ease;
}
.kpi:hover{transform:translateY(-2px)}
.kpi .label{font-size:0.75rem;color:var(--muted);font-weight:600}
.kpi .value{font-size:1.625rem;font-weight:800;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.card h3{font-weight:800}

/* ── Каркас с сайдбаром (внутренние страницы; дашборд самодостаточен) ── */
body:has(> .app){padding:0;max-width:none;margin:0}
/* Сайдбар крупнее на 10% (просьба владельца 09.08.2026): 232 → 255px и все
   размеры внутри с тем же коэффициентом. Тот же блок продублирован в
   dashboard.html — он самодостаточен и эту тему не читает. */
.app{display:grid;grid-template-columns:255px 1fr;min-height:100vh}
.app .main{min-width:0}
/* box-sizing здесь — фикс существовавшего горизонтального скролла: при
   width:100% и content-box паддинги 28px давали .page шириной колонка+56px.
   Скроллились 9 экранов (замеры — docs/mobile/decisions.md §28). Часть
   шаблонов закрывала баг собственным box-sizing — теперь он общий. */
.app .page{padding:1.25rem 1.75rem 2.5rem;max-width:92.5rem;width:100%;margin:0 auto;box-sizing:border-box}
.app .h{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:1rem;gap:0.75rem;flex-wrap:wrap}
.app .h h1{font-size:1.5rem;font-weight:800;letter-spacing:-.02em;margin:0}
/* Та же ошибка, что у .page: width:100% + паддинги без border-box. */
.topbar-neo{position:sticky;top:0;z-index:5;display:flex;align-items:center;gap:0.75rem;flex-wrap:wrap;padding:0.875rem 1.75rem;max-width:92.5rem;width:100%;margin:0 auto;box-sizing:border-box;
  background:linear-gradient(150deg,rgba(237,238,244,.92),rgba(229,231,239,.92));backdrop-filter:blur(8px)}
.store{display:flex;align-items:center;gap:0.5625rem;font-weight:700;font-size:0.8438rem;background:var(--card);padding:0.4375rem 0.8125rem;border-radius:0.75rem;box-shadow:var(--raise-sm)}
.store .av{width:1.625rem;height:1.625rem;border-radius:0.5rem;background:var(--grad-i);color:#fff;display:grid;place-items:center;font-size:0.75rem;font-weight:800}

.side{background:var(--card);box-shadow:6px 0 24px -14px rgba(74,84,140,.3);padding:1.5rem 0.9375rem;display:flex;flex-direction:column;
  position:sticky;top:0;height:100vh;overflow:auto;z-index:6}
.side .brand{display:flex;align-items:center;gap:0.75rem;padding:0.25rem 0.5625rem 1.25rem;text-decoration:none;color:var(--ink)}
.side .brand .mark{width:2.625rem;height:2.625rem;border-radius:0.8125rem;background:var(--grad-i);display:grid;place-items:center;box-shadow:var(--raise-sm);flex:none}
.side .brand .mark svg{width:1.375rem;height:1.375rem;stroke:#fff;fill:none;stroke-width:2.3}
.side .brand b{font-weight:800;font-size:1.0312rem;letter-spacing:-.01em;display:block;line-height:1.1}
.side .brand small{color:var(--faint);font-size:0.75rem}
.side .nav-t{font-size:0.7188rem;letter-spacing:.12em;text-transform:uppercase;color:var(--faint);padding:0.9375rem 0.6875rem 0.5rem}
.side .nav a{display:flex;align-items:center;gap:0.75rem;padding:0.625rem 0.8125rem;margin:0 0 3px;border-radius:0.9375rem;
  color:var(--muted);font-size:0.9375rem;font-weight:600;text-decoration:none;transition:.15s;white-space:nowrap}
.side .nav a svg{width:1.25rem;height:1.25rem;stroke:currentColor;fill:none;stroke-width:1.9;opacity:.9;flex:none}
.side .nav a:hover{color:var(--ink);background:none;box-shadow:none}
.side .nav a.active{background:var(--indigo-soft);color:var(--indigo);box-shadow:var(--raise-sm)}
.side-foot{margin-top:auto;padding-top:0.9375rem}
.plan{background:var(--card-2);border-radius:0.9375rem;padding:0.875rem;box-shadow:var(--inset)}
.plan .free{font-size:0.8125rem;font-weight:700;color:var(--plus);display:flex;align-items:center;gap:0.375rem}
.plan p{margin:0.4375rem 0 0;font-size:0.7812rem;color:var(--muted);line-height:1.45}

.mtopbar,.side-scrim{display:none}
/* Единый мобильный брейкпоинт проекта — 1023px. Раньше здесь стояло 760px,
   а в dashboard.html своя копия этих же правил на 720px: одно и то же
   состояние наступало на трёх разных ширинах. Ниже 1024 боковое меню
   уезжает в выдвижную панель, вместо неё позже встанут нижние табы. */
@media(max-width:1023px){
  .app{grid-template-columns:1fr}
  /* Шапка — не сплошная полоса, а плавающий материал: контент виден
     сквозь неё и уезжает под низ (apple-design §12). Граница снизу не
     линией, а мягким краем — жёсткий 1px читается как шов. */
  .mtopbar{display:flex;align-items:center;gap:0.75rem;position:sticky;top:0;z-index:40;
    background:rgba(255,255,255,.72);backdrop-filter:blur(18px) saturate(180%);
    -webkit-backdrop-filter:blur(18px) saturate(180%);
    box-shadow:0 1px 0 rgba(255,255,255,.5) inset, 0 6px 20px rgba(74,84,140,.10);
    padding:0.625rem 0.875rem}
  .mburger{width:2.625rem;height:2.625rem;flex:none;border:0;border-radius:0.75rem;background:var(--card-2);display:grid;place-items:center;box-shadow:var(--raise-sm);cursor:pointer}
  .mburger svg{width:1.375rem;height:1.375rem;stroke:var(--ink);fill:none;stroke-width:2;stroke-linecap:round}
  .mbrand{display:flex;align-items:center;gap:0.5625rem;font-weight:800;font-size:1rem;color:var(--ink);text-decoration:none}
  .mbrand .mmark{width:2rem;height:2rem;flex:none;border-radius:0.625rem;background:var(--grad-i);display:grid;place-items:center}
  .mbrand .mmark svg{width:1.125rem;height:1.125rem;stroke:#fff;fill:none;stroke-width:2.3}
  .side{position:fixed;top:0;left:0;width:17rem;max-width:84vw;height:100vh;height:100dvh;flex-direction:column;align-items:stretch;overflow-y:auto;padding:1.25rem 0.875rem;gap:0;transform:translateX(-100%);
    /* Ящик выезжает по «iOS-кривой» и уходит той же дорогой (§7).
       Пока идёт жест, transition снимается классом .side-drag —
       панель обязана держаться пальца 1:1 (§2). */
    transition:transform .34s var(--ease-drawer, cubic-bezier(0.32,0.72,0,1));
    z-index:60;box-shadow:10px 0 44px rgba(20,26,44,.3);will-change:transform}
  body.side-drag .side,body.side-drag .side-scrim{transition:none}
  body.nav-open .side{transform:none}
  .side-scrim{display:block;position:fixed;inset:0;background:rgba(20,26,44,.44);opacity:0;visibility:hidden;transition:.2s;z-index:55}
  body.nav-open .side-scrim{opacity:1;visibility:visible}
  body.nav-open{overflow:hidden}
  .side .nav{display:block}
  .side .nav a{padding:0.6875rem 0.8125rem;margin:0 0 2px}
  .side .nav a svg{display:inline-block}
  .side .brand{display:flex;padding:0.25rem 0.5625rem 1rem}
  .side .brand small,.side .nav-t,.side-foot{display:block}
  .topbar-neo,.app .page{padding-left:0.875rem;padding-right:0.875rem}
  .app .page{box-sizing:border-box}
}

/* Контролы: кнопки/селекты выпуклые, поля ввода вдавленные */
select,.refresh,.catsel{border-radius:0.75rem !important}
select{border:0;background:var(--card);box-shadow:var(--raise-sm);font-weight:600;color:var(--ink)}
select:focus,.inp:focus,input:focus,textarea:focus{
  border-color:transparent;outline:none;
  box-shadow:var(--inset),0 0 0 3px rgba(var(--indigo-rgb),.18);
}
.inp,input[type=text],input[type=email],input[type=password],input[type=number],textarea{
  border-radius:0.75rem;border:0;background:var(--card-2);box-shadow:var(--inset);
}
.refresh{border:0;background:var(--card);color:var(--indigo);font-weight:700;box-shadow:var(--raise-sm)}
.refresh:hover{color:var(--indigo-press);box-shadow:var(--raise-sm),0 0 0 3px rgba(var(--indigo-rgb),.12)}
.cache-tag{border-radius:1.25rem;background:var(--bg-2);color:var(--muted);box-shadow:var(--inset);font-weight:700}

/* Кнопки */
.btn,.btn-primary,.btn-ghost,button[type=submit]{border-radius:0.75rem}
/* Ссылка-кнопка без своего цвета текста получала браузерный #0000EE —
   в админке так выглядели «Пользователи» и «ИИ: разборы и чат» среди
   тёмно-синих кнопок. Правила с классом-модификатором (.btn.pri,
   .btn.primary) специфичнее и по-прежнему ставят белый. */
a.btn{color:var(--ink)}
/* :not(.btn) — ключевое. Кнопка с классом .btn уже оформлена страницей
   (светлый фон, тёмный текст, подсветка индиго при наведении), и заливать её
   синим градиентом отсюда нельзя: фон менялся, а цвет текста оставался от
   страницы — получалось фиолетовое на синем, то есть нечитаемое (жалоба
   владельца 24.08.2026: «Сохранить доверителя»). Заодно возвращается
   иерархия: `.btn` — второстепенная кнопка, `.btn primary` — главная.
   Голые submit-кнопки без класса, как и раньше, получают градиент. */
.btn-primary,button[type=submit]:not(.btn){
  background:var(--btn-pri);
  border:none;color:#fff;font-weight:700;
  box-shadow:var(--raise-sm);
  transition:.15s;
}
.btn-primary:hover,button[type=submit]:not(.btn):hover{
  transform:translateY(-1px);filter:brightness(1.06);
  box-shadow:0 12px 28px rgba(var(--indigo-rgb),.35);
  color:#fff;
}
.btn-ghost{background:var(--card);border:0;box-shadow:var(--raise-sm);color:var(--ink)}
.btn-ghost:hover{color:var(--indigo)}

/* Таблицы */
th{color:var(--faint);font-weight:700;letter-spacing:.05em}
td{font-variant-numeric:tabular-nums}
tbody tr{transition:background .1s}
tbody tr:hover td{background:var(--card-2)}
td.sku,td.sku a.sku-link{color:var(--indigo)}
td.sku a.sku-link{border-bottom-color:var(--indigo-line)}

/* Плашки статусов */
.err,.notice,.imp-banner{border-radius:0.875rem;box-shadow:var(--raise-sm)}
.warn{border-radius:1.25rem}
.badge,.b,.dot{font-variant-numeric:tabular-nums}

footer{color:var(--faint)}


/* Файл-инпуты: нативная кнопка «Выберите файл» в нео-стиле */
input[type=file]{color:var(--muted);font-family:inherit}
input[type=file]::file-selector-button{
  border:0;background:var(--btn-pri);color:#fff;font-family:inherit;font-weight:700;font-size:0.7812rem;
  padding:0.5rem 0.9375rem;border-radius:0.6875rem;cursor:pointer;margin-right:0.75rem;
  box-shadow:var(--raise-sm);transition:.15s}
input[type=file]::file-selector-button:hover{filter:brightness(1.06)}
input[type=file]::-webkit-file-upload-button{
  border:0;background:var(--btn-pri);color:#fff;font-family:inherit;font-weight:700;font-size:0.7812rem;
  padding:0.5rem 0.9375rem;border-radius:0.6875rem;cursor:pointer;margin-right:0.75rem;
  box-shadow:var(--raise-sm);transition:.15s}

/* Инлайн-иконки вместо эмодзи */
.i{width:1.05em;height:1.05em;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vertical-align:-0.18em;display:inline-block;flex:none}


/* ══════════════════════════════════════════════════════════════════════
   ДВИЖЕНИЕ: токены и общие правила.
   Добавлено 23.08.2026 по аудиту скиллом emilkowalski/skills
   (improve-animations → AUDIT.md). Файл подключают 33 шаблона, поэтому
   правила живут здесь, а не копируются по страницам.
   ══════════════════════════════════════════════════════════════════════ */
:root{
  /* Встроенные ease/ease-out слишком слабые для осознанного движения.
     Кривые взяты из методики: вход/выход — ease-out, перемещение по
     экрану — ease-in-out, выезжающая панель — «iOS-кривая». */
  --ease-out:cubic-bezier(0.23, 1, 0.32, 1);
  --ease-in-out:cubic-bezier(0.77, 0, 0.175, 1);
  --ease-drawer:cubic-bezier(0.32, 0.72, 0, 1);
  /* Бюджет длительностей интерфейса: всё, что чаще раза в день, — ≤300мс */
  --dur-press:.14s;    /* отклик на нажатие */
  --dur-hover:.16s;    /* наведение, смена цвета */
  --dur-pop:.2s;       /* тултипы, выпадашки */
  --dur-modal:.24s;    /* окна и панели */
}

/* Наведение с движением — только там, где есть настоящая мышь. На тач-
   экране :hover срабатывает по тапу и оставляет элемент «приподнятым»
   до следующего касания (правило 6 аудита). */
@media (hover:hover) and (pointer:fine){
  .kpi:hover{transform:translateY(-2px)}
}
@media not all and (hover:hover){
  .kpi:hover{transform:none}
}

/* Меньше движения — не «совсем без анимаций»: прозрачность и цвет
   оставляем (они объясняют, что изменилось), убираем перемещения и
   бесконечные циклы. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
    scroll-behavior:auto !important;
  }
  /* Переходы прозрачности короткие, но живые: без них смена состояния
     выглядит как мигание. */
  .ovl,.drw,.modal,.toast,.sveil,.ncback{transition-duration:.12s !important}
  .kpi:hover,.post:hover,.sig-tg:hover,.sg:hover{transform:none !important}
}

/* ══════════════════════════════════════════════════════════════════════
   APPLE-DESIGN: отклик, материалы, типографика.
   Применено 23.08.2026 по скиллу apple-design (WWDC «Designing Fluid
   Interfaces» + «The Details of UI Typography»). Живёт в общей теме —
   значит действует на всех 33 страницах, а не на одной.
   ══════════════════════════════════════════════════════════════════════ */

/* §1 Отклик. Нажатие должно отзываться в момент касания, а не по отпусканию.
   touch-action убирает 300мс задержку тапа, tap-highlight — серую заливку
   поверх нашей собственной обратной связи. */
button,.btn,a.btn,[role=button],summary,label.chk,.ctab,.seg button{
  touch-action:manipulation;
  -webkit-tap-highlight-color:transparent;
}
button:active,.btn:active,a.btn:active,[role=button]:active{
  transform:scale(.985);
  transition:transform var(--dur-press, .14s) var(--ease-out, ease-out);
}
/* Крупные плитки-кнопки вдавливаются заметнее — масштаб считается от площади */
.kpi:active,.card button:active{transform:scale(.99)}

/* §12 Материалы. Крупная поверхность = более плотное размытие и глубокая
   тень; мелкая — легче. Светлое стекло на светлом стекле не кладём. */
.sheet-material{
  background:rgba(255,255,255,.72);
  backdrop-filter:blur(20px) saturate(180%);
  -webkit-backdrop-filter:blur(20px) saturate(180%);
  box-shadow:0 1px 0 rgba(255,255,255,.55) inset, 0 18px 50px rgba(20,26,44,.18);
}

/* §15 Типографика. Трекинг зависит от кегля: крупному тексту буквы «разъезжаются»,
   мелкому наоборот нужен воздух. Одно значение на все размеры всегда где-то врёт. */
h1,.h1,.kpi .val,.hero h1{letter-spacing:-.022em;line-height:1.08}
h2,.h2{letter-spacing:-.018em;line-height:1.15}
h3,.card h3{letter-spacing:-.012em;line-height:1.25}
.sub,.hint,.nchint,small,.nd,.faint{letter-spacing:.004em}
/* Цифры в таблицах и плитках — моноширинные по ширине знака, иначе колонка
   «дышит» при каждом обновлении. */
.num,.val,td.num,th.num{font-variant-numeric:tabular-nums}

/* §14 Доступность материалов. Прозрачность и контраст — отдельные настройки
   системы, и у каждой свой ответ: плотный фон против стекла, явная граница
   против мягкой тени. */
@media (prefers-reduced-transparency:reduce){
  .mtopbar,.btabs,.sheet-material,.ncback .ncwin{
    background:var(--card, #fff) !important;
    backdrop-filter:none !important;-webkit-backdrop-filter:none !important;
  }
}
@media (prefers-contrast:more){
  .mtopbar,.btabs,.card,.kpi,.ncwin{border:1px solid var(--ink)}
  .sub,.hint,.nd,.faint{color:var(--ink)}
}

/* Заголовок страницы для скринридера и поиска по странице. На «Прибыли и
   заказах», «Рекламе» и «Ассистенте» видимого h1 нет — место отдано
   данным, — и на вопрос «где я» страница не отвечала ничем, кроме вкладки
   браузера (apple-design §16, wayfinding). */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* Таблица шире экрана прокручивается внутри своей рамки, а не выпирает за
   край страницы. Всплыло при переводе на rem (крупный системный кегль →
   /fbs вылезал на 563px), но проблема была и до него: при узком окне те же
   таблицы толкали горизонтальный скролл всей странице.
   :has поддерживают все живые браузеры; где нет — поведение как раньше. */
.tbl-wrap,
:where(div,section,article):not(.page):not(.main):not(.app):has(> table){
  max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}
table{max-width:100%}

/* Последний рубеж: что бы ни распёрло внутри страницы, горизонтально едет
   содержимое блока, а не весь документ. clip, а не hidden — hidden ломает
   position:sticky у шапок таблиц. Плавающие слои (модалки, панели, тосты)
   живут вне .page и не задеты. */
.page{overflow-x:clip}
