/* ============================================================================
   ПЕРЕКОПЫ — ФИРМЕННЫЙ СЛОЙ (brand.css)
   Единый источник истины: токены + нормализованные примитивы.
   Подключается ПОСЛЕДНИМ (после museum.css) и побеждает прежние слои.

   Принципы:
   - стиль игры сохраняем: золото + изумруд + пергамент, Alegreya SC / Alegreya;
   - НЕ трогаем текстуры и орнаменты (background-image из /assets/ui_set/,
     museum_v7, карта музея) — они держат арт;
   - нормализуем то, что расползлось: палитра, типографика, радиусы,
     высоты контролов, отступы, фокус, тач-цели.
   ============================================================================ */

/* ---------- 1. ТОКЕНЫ ---------------------------------------------------- */
:root {
  /* Палитра — роли, а не «просто цвета» */
  --pk-bg:            #02070e;
  --pk-bg-2:          #061524;
  --pk-surface:       rgba(6, 17, 29, .92);
  --pk-surface-2:     rgba(10, 26, 41, .86);

  --pk-gold:          #ffd46f;
  --pk-gold-deep:     #d89531;
  --pk-gold-light:    #fff0b0;
  --pk-emerald:       #17624a;
  --pk-emerald-soft:  #cfe3cf;
  --pk-parchment:     #e8dcc0;

  --pk-ink:           #3c2c12;   /* текст ПО золоту/пергаменту */
  --pk-text:          #f7edcf;   /* текст по тёмному */
  --pk-text-dim:      rgba(247, 237, 207, .68);

  --pk-line:          rgba(255, 212, 111, .28);
  --pk-line-strong:   rgba(255, 212, 111, .52);

  --pk-success:       #8fcb79;
  --pk-attention:     #e6a23b;
  --pk-danger:        #e15b55;
  --pk-placeholder:   #d6e8de;   /* поднят с #bcd6cb — тот не проходил по контрасту */

  /* Типографика */
  --pk-font-title: 'Alegreya SC', 'Alegreya', Georgia, serif;
  --pk-font-body:  'Alegreya', Georgia, 'Times New Roman', serif;

  --pk-fs-xs:  0.8125rem;
  --pk-fs-sm:  0.9375rem;
  --pk-fs-md:  1.0625rem;
  --pk-fs-lg:  1.25rem;
  --pk-fs-xl:  clamp(1.5rem, 2.2vw, 2rem);
  --pk-fs-2xl: clamp(2rem, 4vw, 3.25rem);

  --pk-lh-tight: 1.15;
  --pk-lh-body:  1.5;

  /* Ритм — одна шкала отступов */
  --pk-sp-1: 4px;
  --pk-sp-2: 8px;
  --pk-sp-3: 12px;
  --pk-sp-4: 16px;
  --pk-sp-5: 24px;
  --pk-sp-6: 32px;
  --pk-sp-7: 48px;

  /* Радиусы — было 4 системы, стало 3 */
  --pk-r-sm: 8px;
  --pk-r-md: 14px;
  --pk-r-lg: 22px;

  /* Тени — 3 уровня */
  --pk-sh-sm: 0 2px 8px rgba(0, 0, 0, .35);
  --pk-sh-md: 0 12px 28px rgba(0, 0, 0, .42);
  --pk-sh-lg: 0 26px 60px rgba(0, 0, 0, .55);
  --pk-glow:  0 0 16px rgba(255, 212, 111, .45);

  /* Контролы — было 5 высот, стало 2 (обе >= 44px тач-минимума) */
  --pk-h-control:    48px;
  --pk-h-control-lg: 56px;

  /* Слои */
  --pk-z-hud:    10;
  --pk-z-panel:  100;
  --pk-z-modal:  1000;
  --pk-z-toast:  2000;

}

/* Мостик к старым именам — ТОЛЬКО в SPA (body[data-view] есть на index.html,
   но НЕ на страницах мини-игр). Иначе, когда слой подключим к мини-играм,
   их собственные --line/--card/--panel/--ink с ДРУГОЙ семантикой
   (layer_story: --line зелёный; amphora: свой --panel) перекрасятся вслепую. */
body[data-view] {
  --gold:        var(--pk-gold);
  --gold-2:      var(--pk-gold-deep);
  --gold-light:  var(--pk-gold-light);
  --text:        var(--pk-text);
  --text-main:   var(--pk-text);
  --muted:       var(--pk-text-dim);
  --text-dim:    var(--pk-text-dim);
  --success:     var(--pk-success);
  --attention:   var(--pk-attention);
  --danger:      var(--pk-danger);
  --font-title:  var(--pk-font-title);
  --font-body:   var(--pk-font-body);
  --font-ui:     var(--pk-font-body);
}

/* ---------- 2. БАЗА ------------------------------------------------------ */
body {
  font-family: var(--pk-font-body);
  color: var(--pk-text);
  -webkit-text-size-adjust: 100%;
  text-rendering: optimizeLegibility;
}

/* Заголовки — единая титульная гарнитура */
h1, h2, h3, .auth-view h1, .landing-title {
  font-family: var(--pk-font-title);
  line-height: var(--pk-lh-tight);
  letter-spacing: .01em;
}

/* Фокус с клавиатуры — был не виден нигде */
:where(button, a, input, select, textarea, [tabindex]):focus-visible {
  outline: 2px solid var(--pk-gold);
  outline-offset: 2px;
  border-radius: var(--pk-r-sm);
}

/* Нет горизонтального скролла на входе/регистрации.
   Игровой экран НЕ трогаем: там свои скролл-контейнеры и fixed-элементы. */
body[data-view="landing"],
body[data-view="auth"] { max-width: 100%; overflow-x: hidden; }

/* Уважение к системной настройке «меньше движения» */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
  }
}

/* ---------- 3. ПРИМИТИВЫ ------------------------------------------------- */

/* Кнопки: единая геометрия и типографика.
   ВАЖНО: background/border НЕ трогаем — там текстурные плашки ui_set. */
.button {
  min-height: var(--pk-h-control);
  padding: 0 var(--pk-sp-5);
  font-family: var(--pk-font-title);
  font-size: var(--pk-fs-sm);
  letter-spacing: .02em;
  border-radius: var(--pk-r-md);
  cursor: pointer;
  transition: transform .14s ease, filter .16s ease, box-shadow .16s ease;
}
.button:active:not(:disabled) { transform: translateY(1px) scale(.985); }
.button:disabled { opacity: .55; cursor: not-allowed; transform: none; }

/* Поля ввода: одна геометрия (текстурный фон остаётся из landing.css).
   СКОУП обязателен: без body[data-view] это правило после подключения слоя
   к мини-играм переломает их компактные поля и хрупкую геометрию (amphora). */
body[data-view] input,
body[data-view] select,
body[data-view] textarea {
  min-height: var(--pk-h-control);
  font-family: var(--pk-font-body);
  font-size: max(16px, 1rem);   /* >=16px убирает авто-зум полей на iOS */
  caret-color: var(--pk-gold);
}
/* iOS зумит страницу, если шрифт поля < 16px. Правила лендинга/auth
   специфичнее базовых, поэтому здесь нужен точечный перебой. */
body[data-view] .landing-fields input,
body[data-view] .auth-view input,
body[data-view] .auth-view textarea {
  font-size: max(16px, 1rem) !important;
}

body[data-view] input::placeholder,
body[data-view] textarea::placeholder {
  font-family: var(--pk-font-body);
  color: var(--pk-placeholder);
  opacity: 1;                    /* было .75 — не проходило по контрасту */
}

/* Метки полей — читаемые, не «мелкий капс на грани видимости» */
.landing-fields label,
.auth-view label {
  font-family: var(--pk-font-title);
  font-size: var(--pk-fs-xs);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--pk-emerald-soft);
}

/* Ссылка-кнопка (мелкие действия) */
.linkbtn {
  font-family: var(--pk-font-body);
  font-size: var(--pk-fs-sm);
  color: var(--pk-emerald-soft);
  min-height: 44px;               /* тач-минимум */
  display: inline-flex;
  align-items: center;
}
/* hover — только для мыши: на тачах он «залипает» после тапа */
@media (hover: hover) and (pointer: fine) {
  .linkbtn:hover { color: var(--pk-gold); }
}

/* Статус-заметка (ошибки/успех форм) — была почти невидимой */
.status-note {
  min-height: 1.25em;
  font-family: var(--pk-font-body);
  font-size: var(--pk-fs-sm);
  line-height: var(--pk-lh-body);
  color: var(--pk-text-dim);
  text-align: center;
}
.status-note:not(:empty) {
  margin-top: var(--pk-sp-3);
  padding: var(--pk-sp-2) var(--pk-sp-3);
  border-radius: var(--pk-r-sm);
  background: rgba(0, 0, 0, .35);
  border: 1px solid var(--pk-line);
  color: var(--pk-gold-light);
}

/* ---------- 4. ЭКРАН AUTH — приводим к фирменному виду лендинга ---------- */
/* Был тёмный «чужой» экран с другой рамкой/шрифтами. Делаем ту же
   изумрудно-золотую панель, что и на входе, но НЕ ломая её текстуру. */
.auth-screen {
  background:
    radial-gradient(circle at 68% 26%, rgba(255, 212, 111, .10), transparent 30rem),
    linear-gradient(180deg, var(--pk-bg-2), var(--pk-bg) 74%);
  min-height: 100svh;
  padding: var(--pk-sp-7) var(--pk-sp-4);
}
/* ШИРИНУ .auth-card не трогаем: фон — орнаментальная рамка ui_login_frame.png,
   растянутая 100% 100%; сузишь карточку — орнамент искажается (проверено).
   Правим только ВНУТРЕННИЕ отступы: контент заезжал на завитки рамки. */
/* Рамка-фон растягивается вместе с карточкой, поэтому отступы должны быть
   ДОЛЕЙ ОТ ШИРИНЫ КАРТОЧКИ — тогда контент не «уплывает» от орнамента ни на
   какой ширине. Проценты тут не годятся: padding в % считается от контейнера
   (у нас это широкий .auth-screen), а не от самой карточки. */
.auth-card {
  --pk-authw: min(680px, calc(100vw - 36px));   /* = ширина .auth-card из auth.css */
  padding:
    calc(var(--pk-authw) * .150)
    calc(var(--pk-authw) * .112)
    calc(var(--pk-authw) * .105);
}
.auth-view { gap: var(--pk-sp-4); }
.auth-view h1 {
  font-family: var(--pk-font-title);
  font-size: var(--pk-fs-xl);
  color: var(--pk-gold);
  margin-bottom: var(--pk-sp-1);
}
.auth-view p {
  font-family: var(--pk-font-body);
  font-size: var(--pk-fs-sm);
  line-height: var(--pk-lh-body);
  color: var(--pk-text-dim);
  font-weight: 600;
}
.auth-view .button { min-height: var(--pk-h-control-lg); font-size: var(--pk-fs-md); }
.auth-tabs { gap: var(--pk-sp-3); margin-bottom: var(--pk-sp-5); }
.auth-tab {
  min-height: var(--pk-h-control);
  border-radius: var(--pk-r-md);
  font-family: var(--pk-font-title);
  font-size: var(--pk-fs-sm);
  letter-spacing: .03em;
}
.auth-back { border-radius: var(--pk-r-md); }

/* ---------- 5. АДАПТИВ — один набор брейкпоинтов ------------------------- */
@media (max-width: 720px) {
  :root { --pk-h-control: 46px; --pk-h-control-lg: 52px; }

  /* карточки входа/авторизации не должны упираться в края экрана */
  .landing-card,
  .auth-card { width: min(100%, calc(100vw - 24px)); }

  /* все кнопки в форме — в одну колонку и во всю ширину */
  .landing-actions,
  .auth-tabs { grid-template-columns: 1fr; }

  .auth-screen { padding: var(--pk-sp-6) var(--pk-sp-3); }
}


/* ============================================================================
   ПЕРЕКОПЫ — ФИРМЕННЫЙ СЛОЙ, ДОПОЛНЕНИЕ v3. Дописывается В КОНЕЦ brand.css v2.
   Порядок: токены -> общие примитивы -> auth/landing -> музей -> мини-игры ->
   все медиа-запросы -> сводка (в ней же список ручных правок вне CSS).

   СКВОЗНЫЕ РЕШЕНИЯ ПО КОНФЛИКТАМ ЗАГОТОВОК:
   1. Один :root вместо трёх параллельных наборов (--pk-m-* музея, токены
      .pk-game, :root адаптива). Имена — канон спеки --pk-*.
   2. Токены v2 НЕ переобъявляются (--pk-line/-strong, --pk-r-*, --pk-sh-*,
      --pk-h-control, --pk-fs-xs/sm/md/lg/xl, --pk-gold*, --pk-text*, --pk-sp-*).
      Где заготовки давали ВТОРОЕ значение того же смысла (линия rgba(201,162,76),
      радиусы 10/20, тень 0 30px 70px, --pk-surface-2) — взят вариант v2, иначе
      в проекте снова две шкалы.
   3. Новая типошкала получила НЕконфликтующие имена (--pk-fs-h2/h3/btn/label/
      cap/mini): в v2 --pk-fs-sm = 15px, --pk-fs-xs = 13px, а спека тем же именам
      даёт 13/11px — переобъявление сломало бы .button/.linkbtn/.status-note v2.
   4. Скоупы: SPA — body[data-view] (значения landing/auth/game подтверждены в
      index.html:17 и museum.css:642), музей дополнительно .museum-ui-final,
      мини-игры — только .pk-game. Глобальных правил на body/html/звёздочку/
      button/canvas в v3 нет.
   5. Риски §A-§I соблюдены поимённо — см. сводку в конце файла.
   ============================================================================ */


/* ###################### A. ТОКЕНЫ v3 (только новые имена) ################### */
:root {
  /* палитра и поверхности (спека §1.1) */
  --pk-gold-hi:        #f0cf7a;
  --pk-gold-pale:      #ffe9b0;                                     /* поглощает ffe9c0/ffe09a/ffe7b0/ffeec9 */
  --pk-gold-frame:     #c9a24c;
  --pk-grad-gold:      linear-gradient(180deg, #f0cf7a, #d89b37);   /* литералы: в v2 --pk-gold-deep = #d89531, другое значение */
  --pk-grad-emerald:   linear-gradient(180deg, #2c6a5a, #1d5044);   /* = .field-skin, landing.css:308 */
  --pk-grad-ok:        linear-gradient(180deg, #9ff0bf, #4cae74);
  --pk-ink-gold:       #2e2008;
  --pk-ink-sand:       #3a2a10;
  --pk-ok:             #7ee0a3;
  --pk-ok-ink:         #06210f;
  --pk-warn:           #ffce7a;
  --pk-locked:         rgba(94, 84, 68, .64);
  --pk-text-emerald:   #cfe3cf;
  --pk-surface-1:      linear-gradient(180deg, #17302e, #0e201d);
  --pk-surface-row:    linear-gradient(180deg, rgba(24,50,42,.88), rgba(9,20,16,.93));   /* имя НЕ --pk-surface-2: оно занято в v2:20 синим */
  --pk-surface-ok:     linear-gradient(180deg, rgba(28,72,48,.60), rgba(10,30,20,.85));
  --pk-surface-chip:   linear-gradient(180deg, rgba(22,54,40,.97), rgba(9,24,16,.98));
  --pk-surface-sunken: rgba(0, 0, 0, .28);
  --pk-scrim:          rgba(6, 12, 11, .86);    /* одна подложка оверлеев вместо 8 */
  --pk-blur:           4px;                     /* один блюр вместо 2/3/4/5/6/7 */

  /* типографика */
  --pk-fs-h2:     clamp(20px, 2.2vw, 25px);
  --pk-fs-h2-lg:  clamp(24px, 2.8vw, 32px);
  --pk-fs-h3:     15px;
  --pk-fs-btn:    15px;
  --pk-fs-label:  12px;
  --pk-fs-cap:    12.5px;
  --pk-fs-mini:   11px;
  --pk-fw-md: 500;
  --pk-fw-bd: 700;
  --pk-fw-bk: 800;              /* 850/900/950 запрещены: файлов начертаний нет, браузер синтезирует */
  --pk-tr-title: .02em;
  --pk-tr-wide:  .04em;
  --pk-tr-caps:  .06em;

  /* ритм и форма */
  --pk-gap:        10px;
  --pk-pad-screen: clamp(12px, 3vw, 24px);
  --pk-pad-panel:  clamp(18px, 3vw, 28px);   /* спека давала clamp(16px,4vw,40px): 40px на широкой модалке даёт пустую раму */
  --pk-pad-row:    12px 16px;
  --pk-pad-ctl-x:  18px;
  --pk-head-inset: 52px;                     /* мёртвая зона шапки под крестик 44px */
  --pk-r-pill:     999px;
  --pk-tap:        44px;
  --pk-sh-ctl:     inset 0 1px 0 rgba(255,255,255,.28), 0 4px 12px rgba(0,0,0,.34);

  /* движение */
  --pk-dur-fast: .12s;
  --pk-dur:      .18s;
  --pk-ease:     cubic-bezier(.2, .7, .3, 1);

  /* safe-area (в проекте 0 вхождений env(); без viewport-fit=cover в index.html
     всё это равно нулю — см. п.1 списка ручных правок) */
  --pk-safe-t: env(safe-area-inset-top, 0px);
  --pk-safe-r: env(safe-area-inset-right, 0px);
  --pk-safe-b: env(safe-area-inset-bottom, 0px);
  --pk-safe-l: env(safe-area-inset-left, 0px);
}


/* ###################### B. ОБЩИЕ ПРИМИТИВЫ (вне зон) ####################### */

/* B1. Тач: мгновенный тап без серой вспышки Android. Скоуп обязателен —
   в мини-играх свой touch-action (layer_survivor: body{touch-action:none}). */
body[data-view] button,
body[data-view] a,
body[data-view] [role="button"],
body[data-view] input[type="submit"],
body[data-view] input[type="button"] {
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
}

/* B2. ЕДИНАЯ ПОЛИТИКА ПЕРЕХОДОВ. Заготовки «музей» и «адаптив» объявляли
   transition на одних и тех же элементах (обе с !important) — оставлена ОДНА
   группа, из музейных рецептов ниже transition убран. Анимируются только дешёвые
   свойства: исчезает покадровая перерисовка drop-shadow по PNG-кнопкам
   (landing.css:127/167, museum.css:6180) и `transition:all` (museum.css:6336).
   НЕ включены: .toast (там намеренная пружина), любые input (снесёт анти-autofill
   хак transition:background-color 600000s), .room-mark/.room-marker (§C),
   .dig-layer-prog>span (ширину пишет JS). */
body[data-view] .button,
body[data-view] .about-btn,
body[data-view] .linkbtn,
body[data-view] .auth-tab,
body[data-view] .museum-ui-final .button,
body[data-view] .museum-ui-final .cabinet-btn,
body[data-view] .museum-ui-final .keeper-cta,
body[data-view] .museum-ui-final .keeper-util-btn,
body[data-view] .museum-ui-final .howto-cta,
body[data-view] .museum-ui-final .top-hud .museum-profile .hud-map-btn,
body[data-view] .museum-ui-final .cabinet-overlay button,
body[data-view] .museum-ui-final .cabinet-overlay :is(.rq-find, .rs-node, .rz-order, .codex-entry, .knw-art, .ht-room),
body[data-view] .museum-ui-final .room-zone-panel button,
body[data-view] .museum-ui-final :is(.wm-tab, .wm-back, .wm-codex-btn, .wm-region-tab, .wm-layercard, .dev-tab, .dig-site-tab, .lyr-card, .hero-pick, .region-railbtn) {
  transition-property: transform, opacity, border-color, color !important;
  transition-duration: var(--pk-dur-fast) !important;
  transition-timing-function: var(--pk-ease) !important;
}

/* B3. will-change — точечно: на кнопках держать нельзя (слой на каждую). */
body[data-view] .toast { will-change: opacity, transform; }
body[data-view] .room-screen,
body[data-view] .reward-overlay.is-open { will-change: opacity; }


/* ############ C. ЗОНА: ВХОД (landing) + АВТОРИЗАЦИЯ (auth) ################# */

/* C0. Токены зоны. ПОЧЕМУ НЕ ПРОЦЕНТЫ: padding в % считается от ширины
   КОНТЕЙНЕРА. .landing-card абсолютна внутри .landing (ширина = вьюпорт),
   поэтому `padding:18% 12.7%` из заготовки «адаптив» дал бы на 1920px ~345px
   бокового отступа; тем же болеет действующее v2 `.auth-card{padding:15% 11%}`
   (считает от .auth-screen). Здесь базис задан явно и обязан совпадать с
   фактической шириной карточки (см. C1/C4 и F5). */
body[data-view="landing"],
body[data-view="auth"] {
  --pk-landing-w: min(520px, calc(100vw - 2 * var(--pk-pad-screen)));
  --pk-auth-w:    min(680px, 100%);   /* 100%, а не 100vw: иначе ширина скроллбара даёт горизонтальный сдвиг */
  --pk-col:       100%;               /* мобильная колонка контента; десктопная — в F5 */
  /* доли отступов рамок: на узком экране карточка выше авторской пропорции,
     фон растянут по вертикали, орнамент выше в абсолютных пикселях */
  --pk-lc-pt: .30;  --pk-lc-px: .10;   --pk-lc-pb: .16;   /* ui8_login_panel.webp */
  --pk-ac-pt: .22;  --pk-ac-px: .085;  --pk-ac-pb: .14;   /* ui_login_frame.webp  */
  --pk-form-gap:    var(--pk-sp-3);   /* строка -> строка */
  --pk-form-gap-lg: var(--pk-sp-5);   /* последнее поле -> главная кнопка */
  color-scheme: dark;                 /* тёмные UA-контролы: экраны не расходятся при автозаполнении */
}

/* C1. Карточка лендинга: позиционирование — inset+margin-inline (в landing.css:76
   заданы left и right, а :248 — width, из-за чего right в LTR игнорируется и
   карточка уезжает вправо); отступы — доля от ширины карточки.
   !important только на padding: landing.css:280 и :356 объявлены с !important.
   §A: background/border-image/radius/shadow не трогаем. */
body[data-view="landing"] .landing-card {
  left: var(--pk-pad-screen);
  right: var(--pk-pad-screen);
  width: auto;
  max-width: 520px;
  margin-inline: auto;
  bottom: max(var(--pk-sp-5), var(--pk-safe-b));   /* было 6vh/8vh — прыгало при сворачивании адресной строки */
  transform: none;
  min-height: calc(var(--pk-landing-w) * .90);     /* замок пропорции: иначе фон сжимался и орнамент наезжал на «Email» */
  gap: var(--pk-form-gap);
  padding:
    calc(var(--pk-landing-w) * var(--pk-lc-pt))
    calc(var(--pk-landing-w) * var(--pk-lc-px))
    calc(var(--pk-landing-w) * var(--pk-lc-pb)) !important;
}

/* C2. Логотип: landing.css:156 задаёт width:min(560px,46vw) ВНЕ медиа и убивает
   мобильные ширины — на 375px это 172px. */
body[data-view="landing"] .landing-logo {
  width: min(440px, 82vw);
  top: max(clamp(14px, 3svh, 22px), var(--pk-safe-t));
}

/* C3. Общий ритм форм на обоих экранах. */
body[data-view="auth"] .auth-view,
body[data-view="auth"] .auth-tabs {
  width: min(100%, var(--pk-col));
  margin-inline: auto;
}
body[data-view] .landing-fields label,
body[data-view] .auth-view label { gap: var(--pk-sp-2); margin: 0; }
/* поле -> поле 12px: перебивает landing.css:249 (6px), auth.css:44 (14px) и
   сознательно v2:252 (16px) — один шаг на оба экрана */
body[data-view] .landing-fields,
body[data-view="auth"] .auth-view,
body[data-view] .landing-actions { gap: var(--pk-form-gap); }
/* .field-skin съедала лишние 4px сверху (margin:4px auto 0) */
body[data-view] .landing-fields .field-skin {
  margin: 0 auto;
  min-height: var(--pk-h-control);
  display: flex;
  align-items: center;
}
/* последнее поле -> главная кнопка: 24px на обоих экранах (общий gap 12 + 12) */
body[data-view] .landing-actions { margin-top: calc(var(--pk-form-gap-lg) - var(--pk-form-gap)); }
body[data-view="auth"] .auth-view .button-gold { margin-top: calc(var(--pk-form-gap-lg) - var(--pk-form-gap)); }
body[data-view] .landing-links,
body[data-view] .status-note { margin: 0; }
body[data-view="auth"] .auth-view h1,
body[data-view="auth"] .auth-view p { margin: 0; max-width: none; }
body[data-view="auth"] .auth-view p { font-weight: var(--pk-fw-md); }   /* было 850 — синтетический жир */

/* C4. Карточка auth: ширину не сужаем (искажает орнамент), правим отступы.
   min-height НЕ ставим: базис содержит %, а процент в min-height считается от
   ВЫСОТЫ контейнера — правило из заготовки дало бы мусор и мешало прокрутке. */
body[data-view="auth"] .auth-card {
  width: var(--pk-auth-w);
  padding:
    calc(var(--pk-auth-w) * var(--pk-ac-pt))
    calc(var(--pk-auth-w) * var(--pk-ac-px))
    calc(var(--pk-auth-w) * var(--pk-ac-pb));
  display: flex;
  flex-direction: column;
  justify-content: center;      /* контент по центру рамки в любом из 5 состояний */
  gap: var(--pk-form-gap-lg);
}

/* C5. Экран auth: сверху место фиксированной «На главную» (перебивает v2:236/289). */
body[data-view="auth"] .auth-screen {
  padding-top:    calc(82px + var(--pk-safe-t));
  padding-right:  max(var(--pk-pad-screen), var(--pk-safe-r));
  padding-bottom: calc(var(--pk-sp-6) + var(--pk-safe-b));
  padding-left:   max(var(--pk-pad-screen), var(--pk-safe-l));
  min-height: 100svh;
}

/* C6. Подписи полей: было 10px/.08em на лендинге и 13px/.055em/вес 950 в auth —
   главный источник «разных шрифтов» на двух экранах. */
body[data-view] .landing-fields label,
body[data-view] .auth-view label {
  font-family: var(--pk-font-title);
  font-size: var(--pk-fs-label);
  font-weight: var(--pk-fw-bd);
  letter-spacing: var(--pk-tr-caps);
  text-transform: uppercase;
  color: var(--pk-text-emerald);
}

/* C7. Поля auth получают ту же изумрудную шкурку, что .field-skin на лендинге
   (значения 1:1 из landing.css:306-316, новых литералов нет). §A их не касается. */
body[data-view="auth"] .auth-view input {
  padding: 8px var(--pk-pad-ctl-x);
  background: var(--pk-grad-emerald);
  border: 2px solid var(--pk-gold-frame);
  border-radius: 11px;
  box-shadow: inset 0 2px 5px rgba(0,0,0,.4), 0 1px 0 rgba(255,236,180,.15);
  color: var(--pk-gold-pale);
  font-weight: var(--pk-fw-md);
  text-align: left;
}
body[data-view="auth"] .auth-view input:focus {
  border-color: var(--pk-gold);
  box-shadow: inset 0 2px 5px rgba(0,0,0,.4), 0 0 10px rgba(255,212,111,.35);
  outline: none;
}
/* автозаполнение Chrome красило поля auth жёлтым — экраны расходились в момент входа */
body[data-view="auth"] .auth-view input:-webkit-autofill,
body[data-view="auth"] .auth-view input:-webkit-autofill:hover,
body[data-view="auth"] .auth-view input:-webkit-autofill:focus,
body[data-view="auth"] .auth-view input:-webkit-autofill:active {
  -webkit-text-fill-color: var(--pk-gold-pale) !important;
  -webkit-box-shadow: 0 0 0 1000px transparent inset !important;
  box-shadow: inset 0 2px 5px rgba(0,0,0,.4) !important;
  transition: background-color 600000s 0s, color 600000s 0s !important;
  caret-color: var(--pk-gold) !important;
}
/* лендинг: текст поля был по центру и цветом #ffeec9 (landing.css:317-324, всё с !important) */
body[data-view] .landing-fields .field-skin input {
  text-align: left !important;
  padding: 8px var(--pk-pad-ctl-x) !important;
  color: var(--pk-gold-pale) !important;
  font-family: var(--pk-font-body) !important;
  font-weight: var(--pk-fw-md) !important;
}
/* плейсхолдеры: было #bcd6cb/opacity .85 (ниже AA) и дефолтный серый в auth */
body[data-view] .landing-fields .field-skin input::placeholder,
body[data-view="auth"] .auth-view input::placeholder {
  color: var(--pk-placeholder) !important;
  opacity: 1 !important;
  font-family: var(--pk-font-body);
  font-weight: var(--pk-fw-md);
}

/* C8. Кнопки форм: ОДИН размер на обоих экранах. Для лендинга это принципиально —
   плашки ui8_btn_*.webp растянуты background-size:100% 100%, одинаковый размер =
   одинаковая степень растяжения. 48px — родная высота плашек, поэтому auth
   опускается с 58/56 (сознательно перебиваем v2:266), а не лендинг растёт. */
body[data-view] .landing-actions .button,
body[data-view="auth"] .auth-view .button {
  width: min(100%, var(--pk-col));
  margin-inline: auto;
  min-height: var(--pk-h-control);
  font-family: var(--pk-font-title);
  font-size: var(--pk-fs-btn);
  font-weight: var(--pk-fw-bd);        /* было 950 */
  letter-spacing: var(--pk-tr-title);  /* было .05em у gold и .01em у ghost */
  line-height: 1.1;
  padding: 0 var(--pk-sp-5);
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
/* Кнопки auth не текстурные — красим по рецепту спеки .pk-btn--gold/--ghost.
   Вариант заготовки с background:url(ui8_btn_gold.png) ОТКЛОНЁН: в проекте эти
   плашки в .webp (landing.css:222/236/296), путь с .png дал бы 404. Как включить
   текстуру вручную — п.11 списка ручных правок. */
body[data-view="auth"] .auth-view .button-gold {
  background: var(--pk-grad-gold);
  color: var(--pk-ink-gold);
  border: 1px solid var(--pk-gold-pale);
  border-radius: var(--pk-r-md);
  box-shadow: var(--pk-sh-ctl);
  text-shadow: 0 1px 0 rgba(255,240,190,.45);
}
body[data-view="auth"] .auth-view .button-ghost {
  background: transparent;
  color: var(--pk-gold-pale);
  border: 1px solid var(--pk-line-strong);
  border-radius: var(--pk-r-md);
  box-shadow: none;
}
/* один рецепт «выключено» вместо сложения base.css:30 (.62) и museum (.65) */
body[data-view] .landing-actions .button:disabled,
body[data-view="auth"] .auth-view .button:disabled,
body[data-view="auth"] .auth-back:disabled {
  opacity: .55;
  filter: grayscale(.4);
  cursor: not-allowed;
  transform: none;
}
body[data-view="auth"] .auth-view .button:active:not(:disabled) { transform: translateY(1px) scale(.97); filter: brightness(.92); }
/* «Об игре» — только типографика: фон и padding это ui8_btn_small.webp (§A) */
body[data-view="landing"] .about-btn {
  font-family: var(--pk-font-title);
  font-size: var(--pk-fs-btn);
  font-weight: var(--pk-fw-bd);
  letter-spacing: var(--pk-tr-title);
  color: var(--pk-ink-gold);
}

/* C9. Ссылки-кнопки: было min-height:0; padding:5px 2px (цель ~24px) и
   opacity:.8 (landing.css:345). Правило безусловное — вариант из заготовки
   «адаптив» под @media(pointer:coarse) убран как дубль. Это же рабочая замена
   МЁРТВОМУ v2:197 `.linkbtn{min-height:44px}` (0,1,0 против 0,2,0). */
body[data-view] .landing-links .linkbtn {
  min-height: var(--pk-tap);
  padding: 0 var(--pk-sp-2);
  display: inline-flex;
  align-items: center;
  font-family: var(--pk-font-body);
  font-size: var(--pk-fs-btn);
  font-weight: var(--pk-fw-bd);
  letter-spacing: var(--pk-tr-title);
  color: var(--pk-text-emerald);
  opacity: 1;                       /* иерархию держим цветом, а не прозрачностью */
  text-underline-offset: 3px;
}

/* C10. Вкладки «Вход / Регистрация»: ряд ограничен колонкой --pk-col и центрован
   (C3) — раньше шёл во всю ширину и упирался в угловые завитки рамки. */
body[data-view="auth"] .auth-tabs { gap: var(--pk-form-gap); margin-bottom: 0; }
body[data-view="auth"] .auth-tab {
  min-height: var(--pk-h-control);  /* было 56 */
  border-radius: var(--pk-r-md);
  border: 1px solid var(--pk-line);
  background: rgba(255,255,255,.05);
  color: var(--pk-text);
  font-family: var(--pk-font-title);
  font-size: var(--pk-fs-btn);
  font-weight: var(--pk-fw-bd);     /* было 950 */
  letter-spacing: var(--pk-tr-title);
}
body[data-view="auth"] .auth-tab[aria-selected="true"] {
  background: var(--pk-grad-gold);
  border-color: var(--pk-line-strong);
  color: var(--pk-ink-gold);
}
/* «активна ни одна» — режимы forgot/verify/reset (auth.js пишет body[data-auth-mode]) */
body[data-auth-mode="forgot"] .auth-tabs,
body[data-auth-mode="verify"] .auth-tabs,
body[data-auth-mode="reset"]  .auth-tabs { opacity: .72; }

/* C11. «На главную» — не текстурная кнопка, оформляем целиком по .pk-btn--ghost. */
body[data-view="auth"] .auth-back {
  top:  max(18px, var(--pk-safe-t));
  left: max(22px, var(--pk-safe-l));
  min-height: var(--pk-tap);
  padding: 0 var(--pk-sp-4);
  display: inline-flex;
  align-items: center;
  gap: var(--pk-sp-2);
  border: 1px solid var(--pk-line-strong);
  border-radius: var(--pk-r-md);
  background: rgba(3, 10, 18, .72);
  color: var(--pk-text-emerald);
  font-family: var(--pk-font-body);
  font-size: var(--pk-fs-btn);
  font-weight: var(--pk-fw-bd);
  letter-spacing: var(--pk-tr-title);
  box-shadow: var(--pk-sh-sm);
}
body[data-view="auth"] .auth-back::before { content: "\2190"; font-size: 1.05em; line-height: 1; }

/* C12. Статус-заметка: база и рамка уже есть в v2 — здесь только дельта и
   семантические модификаторы. Классы .pk-note--* пока никто не вешает (auth.js
   пишет только textContent), поэтому без правки JS работает нейтральный вид v2. */
body[data-view] .status-note { font-weight: var(--pk-fw-md); text-wrap: pretty; }
body[data-view] .status-note.pk-note--ok:not(:empty) {
  color: var(--pk-ok);
  border-color: color-mix(in srgb, var(--pk-ok) 45%, transparent);
  background: color-mix(in srgb, var(--pk-ok) 10%, transparent);
}
body[data-view] .status-note.pk-note--error:not(:empty) {
  color: var(--pk-danger);
  border-color: color-mix(in srgb, var(--pk-danger) 55%, transparent);
  background: color-mix(in srgb, var(--pk-danger) 12%, transparent);
}
body[data-view] .status-note.pk-note--busy:not(:empty) { color: var(--pk-text-dim); }

/* C13. Оверлей «Об игре» и кнопка «Об игре» — те же отступы и safe-area. */
body[data-view="landing"] .about-panel {
  padding-top:    max(var(--pk-pad-screen), var(--pk-safe-t));
  padding-right:  max(var(--pk-pad-screen), var(--pk-safe-r));
  padding-bottom: max(var(--pk-pad-screen), var(--pk-safe-b));
  padding-left:   max(var(--pk-pad-screen), var(--pk-safe-l));
}
body[data-view="landing"] .about-btn { top: max(16px, var(--pk-safe-t)); right: max(24px, var(--pk-safe-r)); }


/* ############################ D. ЗОНА: МУЗЕЙ ############################### */
/* Только нетекстурные элементы. Исключено по рискам: §A текстуры (.top-hud,
   .cabinet-head, .keeper-scroll, .map-toast, .cabinet-btn, .keeper-cta,
   .room-screen-back, .museum-gate-btn, .room-zone-panel/frame_teal) — им отданы
   лишь типографика и padding, высоту тоже не меняем (растягивает арт);
   §B .room-card-actions .button — ни одного правила; §C карта музея целиком;
   §H z-index/position/display оверлеев. */

/* D1. ОВЕРЛЕИ: один скрим, один блюр, один рецепт отступов.
   По render.js (487/1064/1734/2207/2312/2332/2403/2548/2600/2627) ВСЕ музейные
   оверлеи несут базовый .cabinet-overlay — список алиасов из заготовки «адаптив»
   убран как дубль. Специфичность (0,3,1) против `.cabinet-overlay.heroes-overlay`
   (0,2,0)!important. .minigame-overlay не трогаем: там непрозрачный фон под iframe. */
body[data-view] .museum-ui-final .cabinet-overlay,
body[data-view] .museum-ui-final .prologue-overlay,
body[data-view] .museum-ui-final .exp-planner-overlay,
body[data-view] .reward-overlay {                  /* уходит в document.body, поэтому без .museum-ui-final */
  background: var(--pk-scrim) !important;
  -webkit-backdrop-filter: blur(var(--pk-blur)) !important;
  backdrop-filter: blur(var(--pk-blur)) !important;
  padding-top:    max(var(--pk-pad-screen), var(--pk-safe-t)) !important;
  padding-right:  max(var(--pk-pad-screen), var(--pk-safe-r)) !important;
  padding-bottom: max(var(--pk-pad-screen), var(--pk-safe-b)) !important;
  padding-left:   max(var(--pk-pad-screen), var(--pk-safe-l)) !important;
}

/* D2. ПАНЕЛИ: одна поверхность, один радиус, одна сетка отступов.
   :not(.room-zone-panel) — у неё border-image frame_teal (§A). .lyr-panel тоже
   исключена: её ::before рассчитан под border:3px/radius:24px.
   Побочный полезный эффект: .exp-event-modal перестаёт быть коричневой. */
body[data-view] .museum-ui-final .cabinet-overlay .cabinet-modal:not(.room-zone-panel),
body[data-view] .museum-ui-final .cabinet-overlay :is(.dig-hub, .wm-screen, .codex-screen, .hero-sel, .howto-modal),
body[data-view] .museum-ui-final .prologue-overlay .prologue-panel,
body[data-view] .museum-ui-final .exp-planner-overlay .exp-planner {
  background: var(--pk-surface-1) !important;
  border: 1px solid var(--pk-line-strong) !important;
  border-radius: var(--pk-r-lg) !important;
  box-shadow: var(--pk-sh-lg) !important;
  padding: var(--pk-pad-panel) !important;
  color: var(--pk-text) !important;
  font-family: var(--pk-font-body) !important;
}
/* Высота и прокрутка — ОДИН рецепт. Он заменяет поштучный список vh->svh из
   заготовки «адаптив» для .howto-modal/.dig-hub/.wm-screen/.codex-screen/
   .heroes-modal--v2 (там было 90/92/95svh) — иначе два источника правды.
   dvh: на мобиле vh не учитывает схлопывающуюся адресную строку. */
body[data-view] .museum-ui-final .cabinet-overlay .cabinet-modal,
body[data-view] .museum-ui-final .cabinet-overlay :is(.dig-hub, .wm-screen, .codex-screen, .hero-sel, .howto-modal) {
  max-height: min(92svh, calc(100dvh - 32px)) !important;
  overflow-y: auto !important;
  overscroll-behavior: contain !important;
}
/* полноэкранные виды карты Крыма перебивают общий потолок */
body[data-view] .museum-ui-final .cabinet-overlay .wm-screen:is(.wm-view-crimea, .wm-view-hub, .wm-view-region) {
  height: 100dvh !important;
  max-height: 100dvh !important;
}
/* пара, которую нельзя разлучать: ширина и высота считают одно 16:9 (museum.css:5612-5613) */
body[data-view] .museum-ui-final .wm-crimea-full {
  width:  min(calc(100vw - var(--side, 0px)), 177.78svh);
  height: min(calc((100vw - var(--side, 0px)) * 0.5625), 100svh);
}
/* остальные vh -> svh: только то, что не покрыто общим потолком */
body[data-view] .museum-ui-final .prologue-stage        { max-height: 92svh; }
body[data-view] .museum-ui-final .prologue-art          { max-height: 50svh; }
body[data-view] .museum-ui-final .prologue-art.is-portrait { max-height: 42svh; }
body[data-view] .museum-ui-final .wm-view-crimea .wm-crimea { max-height: 82svh; }
body[data-view] .museum-ui-final .lyr-panel             { height: min(92svh, 980px); }
body[data-view] .museum-ui-final .region-img-pic        { max-height: 74svh; }
body[data-view] .museum-ui-final .knw-panel .dev-pane   { max-height: 56svh; }
body[data-view] .museum-ui-final .room-zone-panel .sc-collections { max-height: min(46svh, 340px) !important; }   /* !important как в museum.css:6053 */
body[data-view] .museum-ui-final .room-screen-curator-art { width: clamp(130px, 19svh, 215px); }
body[data-view] .museum-ui-final :is(.heroes-roster, .heroes-detail, .knw-panel .dev-pane, .room-zone-panel .sc-collections) { overscroll-behavior: contain; }
body[data-view] .museum-ui-final .exp-planner-overlay .exp-planner-detail,
body[data-view] .museum-ui-final .cabinet-overlay .dig-strata {
  border: 1px solid var(--pk-line) !important;
  border-radius: var(--pk-r-md) !important;
}

/* D3. ШАПКА ПАНЕЛИ: заголовок + крестик 44x44.
   Специфичность (0,4,1)+ против `.room-zone-panel .rz-head h2` (0,3,0)!important. */
body[data-view] .museum-ui-final .cabinet-overlay :is(.rz-head, .dig-hub-head, .wm-head, .howto-head, .hero-sel, .codex-screen) h2,
body[data-view] .museum-ui-final .prologue-overlay .prologue-panel h2 {
  font-family: var(--pk-font-title) !important;
  font-size: var(--pk-fs-h2) !important;
  font-weight: var(--pk-fw-bd) !important;
  line-height: var(--pk-lh-tight) !important;
  letter-spacing: var(--pk-tr-title) !important;
  color: var(--pk-gold-pale) !important;
  text-shadow: none !important;                 /* было 4 разных «свечения» */
}
body[data-view] .museum-ui-final .cabinet-overlay .heroes-modal--v2 .heroes-head h2,
body[data-view] .museum-ui-final .cabinet-overlay .lyr-panel .lyr-head h2 {
  font-family: var(--pk-font-title) !important;
  font-size: var(--pk-fs-h2-lg) !important;
  font-weight: var(--pk-fw-bd) !important;
  color: var(--pk-gold-pale) !important;
}
body[data-view] .museum-ui-final .cabinet-overlay :is(.dig-hub-head, .wm-head, .howto-head) p,
body[data-view] .museum-ui-final .cabinet-overlay .heroes-modal--v2 .heroes-head span,
body[data-view] .museum-ui-final .cabinet-overlay .exp-event-eyebrow {
  font-family: var(--pk-font-body) !important;
  font-size: var(--pk-fs-cap) !important;
  font-weight: var(--pk-fw-bd) !important;
  color: var(--pk-text-dim) !important;
  letter-spacing: var(--pk-tr-caps) !important;
}
body[data-view] .museum-ui-final .cabinet-overlay :is(.dig-hub-head, .wm-head, .howto-head) {
  padding-inline: var(--pk-head-inset) !important;   /* заголовок не заезжает под крестик 44x44 */
  min-height: var(--pk-tap) !important;
}
/* Крестик: font-size:0 + ::after, потому что в разметке два вида крестика —
   текстовый и <img class="cabinet-close-img">; гасим оба и рисуем один глиф,
   иначе у половины панелей был бы двойной. Это НЕ §B (тот запрет только про
   .room-card-actions .button). Позицию (top/right) не задаём: у панели зон она
   откалибрована под 32px border-image рамки. */
body[data-view] .museum-ui-final .cabinet-overlay :is(.cabinet-modal, .dig-hub, .wm-screen, .codex-screen, .hero-sel, .howto-modal) .cabinet-close {
  width: var(--pk-tap) !important;
  height: var(--pk-tap) !important;
  min-width: var(--pk-tap) !important;
  min-height: var(--pk-tap) !important;
  padding: 0 !important;
  display: grid !important;
  place-items: center !important;
  border-radius: 50% !important;
  border: 1px solid var(--pk-line-strong) !important;
  background: rgba(9, 20, 16, .72) !important;
  box-shadow: var(--pk-sh-md) !important;
  font-size: 0 !important;
  line-height: 0 !important;
  cursor: pointer !important;
}
body[data-view] .museum-ui-final .cabinet-overlay .heroes-close-btn,
body[data-view] .museum-ui-final .exp-planner-overlay .exp-planner-close {
  width: var(--pk-tap) !important;
  height: var(--pk-tap) !important;
  display: grid !important;
  place-items: center !important;
  border-radius: 50% !important;
  border: 1px solid var(--pk-line-strong) !important;
  background: rgba(9, 20, 16, .72) !important;
  font-size: 0 !important;
}
body[data-view] .museum-ui-final .cabinet-overlay .cabinet-close .cabinet-close-img,
body[data-view] .museum-ui-final .cabinet-overlay .heroes-close-btn .cabinet-close-img { display: none !important; }
body[data-view] .museum-ui-final .cabinet-overlay .cabinet-close::after,
body[data-view] .museum-ui-final .cabinet-overlay .heroes-close-btn::after,
body[data-view] .museum-ui-final .exp-planner-overlay .exp-planner-close::after {
  content: "\2715";
  font-family: var(--pk-font-body);
  font-size: 18px;
  line-height: 1;
  font-weight: var(--pk-fw-bk);
  color: var(--pk-gold-pale);
}

/* D4. СТРОКИ-КАРТОЧКИ: один ритм, одна типографика, три состояния.
   (0,4,1) против `.room-zone-panel .rq-find,...` (0,2,0)!important.
   display/flex-раскладку не трогаем — она чинит перекрытие текста и кнопки. */
body[data-view] .museum-ui-final .cabinet-overlay :is(
  .rq-find, .rq-slot, .rs-node, .sc-coll, .rz-order, .ht-step, .ht-room,
  .knw-row, .knw-art, .knw-hero, .shelf, .codex-entry, .dev-stat,
  .daily-chip, .dig-active-strip, .exp-event-choice, .rq-restored
) {
  background: var(--pk-surface-row) !important;
  border: 1px solid var(--pk-line) !important;
  border-radius: var(--pk-r-md) !important;
  padding: var(--pk-pad-row) !important;
  gap: var(--pk-gap) !important;
  box-shadow: inset 0 1px 0 rgba(255, 238, 190, .08) !important;
  color: var(--pk-text) !important;
}
/* заголовок строки; заодно уходит «стальная» палитра #eef6fb/#dceaf2/#9fd0e0 */
body[data-view] .museum-ui-final .cabinet-overlay :is(
  .rq-find-title, .rs-node-body strong, .sc-coll-title, .rq-slot-title,
  .rz-order-client, .rz-order-want, .knw-row b, .knw-art b, .knw-hero b,
  .shelf-head b, .codex-entry-head b, .ht-step-tx b, .ht-room-tx b,
  .dev-stat b, .exp-detail-head h3, .exp-stat b, .daily-chip b
) {
  font-family: var(--pk-font-body) !important;
  font-size: var(--pk-fs-h3) !important;
  font-weight: var(--pk-fw-bd) !important;
  line-height: 1.25 !important;
  color: var(--pk-gold-pale) !important;
}
body[data-view] .museum-ui-final .cabinet-overlay :is(
  .rq-find-title small, .rs-node-desc, .knw-row small, .knw-art small,
  .knw-hero small, .shelf-head small, .codex-entry-text, .ht-step-tx small,
  .ht-room-tx small, .dev-stat small, .dev-headline small, .dev-next small,
  .rz-order-meta, .rz-soon-dim, .rq-hero, .exp-detail-blurb, .exp-stat span,
  .exp-hero-role, .exp-dur-note, .wm-lc-txt small, .exp-event-hint
) {
  font-family: var(--pk-font-body) !important;
  font-size: var(--pk-fs-cap) !important;
  font-weight: var(--pk-fw-md) !important;
  line-height: var(--pk-lh-body) !important;
  color: var(--pk-text-dim) !important;
}
/* микро-заголовок секции («ТИР 2», «АРТЕФАКТЫ») */
body[data-view] .museum-ui-final .cabinet-overlay :is(.rq-section-head h3, .rs-tier-h, .knw-sec, .howto-sub, .exp-detail-label, .heroes-legend-head) {
  font-family: var(--pk-font-title) !important;
  font-size: var(--pk-fs-mini) !important;
  font-weight: var(--pk-fw-bd) !important;
  letter-spacing: var(--pk-tr-caps) !important;
  text-transform: uppercase !important;
  color: var(--pk-gold) !important;
  text-shadow: none !important;
}
body[data-view] .museum-ui-final .cabinet-overlay :is(.rq-find, .rq-slot, .rs-node, .sc-coll, .rz-order, .codex-entry, .knw-art):is(.is-done, .is-owned, .is-ready, .is-complete) {
  border-color: rgba(120, 210, 150, .55) !important;
  background: var(--pk-surface-ok) !important;
}
body[data-view] .museum-ui-final .cabinet-overlay :is(.rq-find, .rq-slot, .rs-node, .sc-coll, .rz-order, .codex-entry, .knw-art, .heroes-card, .exp-hero-pick, .dig-site-tab):is(.is-locked, .is-cant, .is-busy, .is-soon) {
  opacity: .55 !important;
  filter: grayscale(.4) !important;   /* один рецепт вместо .42/.5/.55/.58/.72 + grayscale .2/.35/.45/.6 */
}
body[data-view] .museum-ui-final .cabinet-overlay :is(.dev-next, .howto-tip, .dig-layer-lore) {
  border: 1px solid var(--pk-line-strong) !important;
  border-radius: var(--pk-r-md) !important;
  background: linear-gradient(180deg, rgba(255, 205, 110, .14), rgba(201, 162, 76, .05)) !important;
  padding: var(--pk-pad-row) !important;
}
/* :not(.is-legendary) обязателен: у легендарной карточки своя золотая рамка */
body[data-view] .museum-ui-final .cabinet-overlay .heroes-card:not(.is-legendary) {
  border: 1px solid var(--pk-line) !important;
  border-radius: var(--pk-r-md) !important;
}

/* D5. КНОПКИ В ПАНЕЛЯХ. §B гарантирован конструктивно: все правила живут внутри
   оверлеев, а .room-card-actions .button — в карточке комнаты на карте, вне
   любого оверлея. «Страховочное» правило на него из заготовки «музей» удалено:
   оно само задавало font-size/min-height, то есть нарушало запрет. */
body[data-view] .museum-ui-final .cabinet-overlay :is(
  .rq-start, .rq-exhibit, .rs-btn, .rz-order-btn, .dig-layer-go, .dig-self-btn,
  .hero-up-btn, .howto-cta, .hero-sel-start, .wm-back, .wm-codex-btn,
  .wm-open-btn, .heroes-btn-gold, .heroes-btn-ghost, .reward-ok, .keeper-util-btn
),
body[data-view] .museum-ui-final .prologue-overlay :is(.prologue-next, .prologue-opt),
body[data-view] .museum-ui-final .exp-planner-overlay .exp-planner-send {
  min-height: var(--pk-h-control) !important;
  padding: 0 var(--pk-pad-ctl-x) !important;
  border-radius: var(--pk-r-md) !important;      /* было 9/10/11/12/13/999px */
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  gap: 8px !important;
  font-family: var(--pk-font-title) !important;
  font-size: var(--pk-fs-h3) !important;
  font-weight: var(--pk-fw-bd) !important;
  line-height: 1.1 !important;
  letter-spacing: var(--pk-tr-title) !important;
  white-space: nowrap !important;
  cursor: pointer !important;
}
body[data-view] .museum-ui-final .cabinet-overlay :is(.rq-start, .rq-exhibit, .rs-btn, .rz-order-btn, .dig-layer-go, .hero-up-btn, .howto-cta, .hero-sel-start, .heroes-btn-gold),
body[data-view] .museum-ui-final .prologue-overlay .prologue-next,
body[data-view] .museum-ui-final .exp-planner-overlay .exp-planner-send {
  background: var(--pk-grad-gold) !important;
  color: var(--pk-ink-gold) !important;
  border: 1px solid var(--pk-gold-pale) !important;
  box-shadow: var(--pk-sh-ctl) !important;
}
/* зелёная = «забрать / готово / отправить» */
body[data-view] .museum-ui-final .cabinet-overlay :is(.rq-claim, .wm-open-btn, .rs-node.is-owned .rs-btn) {
  min-height: var(--pk-h-control) !important;
  padding: 0 var(--pk-pad-ctl-x) !important;
  border-radius: var(--pk-r-md) !important;
  background: var(--pk-grad-ok) !important;
  color: var(--pk-ok-ink) !important;
  border: 1px solid rgba(190, 245, 214, .8) !important;
  font-family: var(--pk-font-title) !important;
  font-size: var(--pk-fs-h3) !important;
  font-weight: var(--pk-fw-bd) !important;
}
body[data-view] .museum-ui-final .cabinet-overlay :is(.dig-self-btn, .wm-back, .wm-codex-btn, .heroes-btn-ghost, .keeper-util-btn),
body[data-view] .museum-ui-final .prologue-overlay .prologue-opt {
  background: transparent !important;
  color: var(--pk-gold-pale) !important;
  border: 1px solid var(--pk-line-strong) !important;
  box-shadow: none !important;
}
body[data-view] .museum-ui-final .cabinet-overlay button:disabled,
body[data-view] .museum-ui-final .prologue-overlay button:disabled,
body[data-view] .museum-ui-final .exp-planner-overlay button:disabled {
  opacity: .55 !important;
  filter: grayscale(.4) !important;
  transform: none !important;
  box-shadow: none !important;
  cursor: not-allowed !important;
}
/* §A: текстурным кнопкам — только гарнитура и вес. ВЫСОТУ НЕ ТРОГАЕМ
   (в заготовке было min-height:48px): фон растянут 100% 100%, рост тянет арт. */
body[data-view] .museum-ui-final .cabinet-overlay :is(.cabinet-btn, .keeper-cta, .room-screen-back, .museum-gate-btn) {
  font-family: var(--pk-font-title) !important;
  font-size: var(--pk-fs-h3) !important;
  font-weight: var(--pk-fw-bk) !important;      /* было 950 */
  letter-spacing: var(--pk-tr-title) !important;
}

/* D6. ВКЛАДКИ. .dig-site-tab — только кайма и активное состояние: это
   вертикальная карточка с виньеткой, высоту и раскладку менять нельзя. */
body[data-view] .museum-ui-final .cabinet-overlay :is(.dev-tab, .wm-tab, .heroes-tab, .wm-region-tab) {
  min-height: var(--pk-h-control) !important;
  padding: 0 var(--pk-pad-ctl-x) !important;
  border-radius: var(--pk-r-md) !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  gap: 7px !important;
  font-family: var(--pk-font-title) !important;   /* было system-ui — главный источник «чужого» вида вкладок */
  font-size: var(--pk-fs-h3) !important;
  font-weight: var(--pk-fw-bd) !important;
  letter-spacing: var(--pk-tr-title) !important;
  color: var(--pk-text-dim) !important;
  background: rgba(255, 255, 255, .05) !important;
  border: 1px solid var(--pk-line) !important;
  cursor: pointer !important;
}
body[data-view] .museum-ui-final .cabinet-overlay :is(.dev-tab, .wm-tab, .heroes-tab, .wm-region-tab):is(.is-active, [aria-selected="true"]) {
  background: var(--pk-grad-gold) !important;
  color: var(--pk-ink-gold) !important;
  border-color: var(--pk-gold-pale) !important;
  box-shadow: var(--pk-sh-ctl) !important;
}
body[data-view] .museum-ui-final .cabinet-overlay .dig-site-tab {
  border: 1px solid var(--pk-line) !important;
  border-radius: var(--pk-r-md) !important;
  background: rgba(255, 255, 255, .05) !important;
}
body[data-view] .museum-ui-final .cabinet-overlay .dig-site-tab.is-active { border-color: var(--pk-gold) !important; background: rgba(255, 212, 111, .12) !important; }
body[data-view] .museum-ui-final .cabinet-overlay .dig-site-name {
  font-family: var(--pk-font-body) !important;
  font-size: var(--pk-fs-cap) !important;
  font-weight: var(--pk-fw-bd) !important;
  color: var(--pk-text) !important;
}

/* D7. ЧИПЫ И БЕЙДЖИ */
body[data-view] .museum-ui-final .cabinet-overlay :is(.dig-active-chip, .exp-chip, .rz-head span, .wm-legend span),
body[data-view] .museum-ui-final .exp-planner-overlay .exp-chip {
  display: inline-flex !important;
  align-items: center !important;
  min-height: 32px !important;
  padding: 0 14px !important;
  border-radius: var(--pk-r-pill) !important;
  font-family: var(--pk-font-body) !important;
  font-size: var(--pk-fs-cap) !important;
  font-weight: var(--pk-fw-bd) !important;
  line-height: 1 !important;
  color: var(--pk-gold-pale) !important;
  background: rgba(255, 212, 111, .10) !important;
  border: 1px solid var(--pk-line) !important;
}
body[data-view] .museum-ui-final .cabinet-overlay .exp-chip.is-sel,
body[data-view] .museum-ui-final .exp-planner-overlay .exp-chip.is-sel { border-color: var(--pk-gold) !important; background: rgba(255, 212, 111, .18) !important; }
/* одна форма, четыре семантики вместо 8 хардкодов */
body[data-view] .museum-ui-final .cabinet-overlay :is(
  .rs-status, .heroes-card__lvl, .hero-lvl, .ach-prog, .rq-timer,
  .exp-risk-badge, .codex-tag, .prologue-badge, .dig-active-chip.is-ready
),
body[data-view] .museum-ui-final .room-hot-badge {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  padding: 3px 10px !important;
  border-radius: var(--pk-r-pill) !important;
  font-family: var(--pk-font-body) !important;      /* .rs-status держал Arial — единственный Arial в музее */
  font-size: var(--pk-fs-mini) !important;
  font-weight: var(--pk-fw-bk) !important;
  line-height: 1.35 !important;
  letter-spacing: var(--pk-tr-title) !important;
  white-space: nowrap !important;
  font-variant-numeric: tabular-nums !important;    /* таймеры не «прыгают» при тике */
}
body[data-view] .museum-ui-final .cabinet-overlay :is(.rs-status.is-free, .exp-risk-badge.risk-low, .dig-active-chip.is-ready),
body[data-view] .museum-ui-final .room-hot-badge.is-ready,
body[data-view] .museum-ui-final .room-hot-badge.is-up { background: rgba(126, 224, 163, .18) !important; color: var(--pk-ok) !important; border: 1px solid rgba(126, 224, 163, .45) !important; }
body[data-view] .museum-ui-final .cabinet-overlay :is(.rs-status.is-busy, .exp-risk-badge.risk-mid, .rq-timer),
body[data-view] .museum-ui-final .room-hot-badge.is-busy { background: rgba(255, 206, 122, .16) !important; color: var(--pk-warn) !important; border: 1px solid rgba(255, 206, 122, .45) !important; }
body[data-view] .museum-ui-final .cabinet-overlay .exp-risk-badge.risk-high,
body[data-view] .museum-ui-final .room-hot-badge.is-cd { background: var(--pk-locked) !important; color: var(--pk-text) !important; border: 1px solid rgba(160, 148, 124, .5) !important; }
body[data-view] .museum-ui-final .cabinet-overlay :is(.heroes-card__lvl, .hero-lvl, .ach-prog),
body[data-view] .museum-ui-final .room-hot-badge:is(.is-have, .is-go) { background: var(--pk-grad-gold) !important; color: var(--pk-ink-gold) !important; border: 1px solid var(--pk-gold-pale) !important; }
/* КАПСУЛЫ HUD — §A/§G: геометрия заморожена (52/46, радиус 40, текстура в
   .museum-bottom). Только шрифт и цвет; 950 -> 800 ещё и сужает цифры, снижая
   риск переполнения ряда nowrap. */
body[data-view] .museum-ui-final .top-hud .hud-capsule .capsule-value b,
body[data-view] .museum-ui-final .museum-bottom .capsule-value b {
  font-family: var(--pk-font-body) !important;
  font-weight: var(--pk-fw-bk) !important;
  font-variant-numeric: tabular-nums !important;
  color: var(--pk-gold-pale) !important;
}
body[data-view] .museum-ui-final .top-hud .hud-capsule .capsule-value small,
body[data-view] .museum-ui-final .museum-bottom .capsule-value small {
  font-family: var(--pk-font-title) !important;
  font-size: var(--pk-fs-mini) !important;
  font-weight: var(--pk-fw-bd) !important;
  letter-spacing: var(--pk-tr-caps) !important;
  text-transform: uppercase !important;
  color: var(--pk-text-dim) !important;
}
/* высота 44, а не 48: HUD — один ряд nowrap, лишние 4px приближают перенос (§G) */
body[data-view] .museum-ui-final .dig-hub-btn {
  min-height: var(--pk-tap) !important;
  border-radius: var(--pk-r-pill) !important;
  font-family: var(--pk-font-title) !important;
  font-size: var(--pk-fs-h3) !important;
  font-weight: var(--pk-fw-bk) !important;
  background: var(--pk-grad-gold) !important;
  color: var(--pk-ink-gold) !important;
  border: 1px solid var(--pk-gold-pale) !important;
  box-shadow: var(--pk-sh-ctl) !important;
}

/* D8. ПРОГРЕСС — пять полосок (5/5/7/6/8px, три заливки) в одну */
body[data-view] .museum-ui-final .cabinet-overlay :is(.sc-coll-bar, .ach-bar, .dig-layer-prog) {
  height: 8px !important;
  border-radius: var(--pk-r-pill) !important;
  background: var(--pk-surface-sunken) !important;
  overflow: hidden !important;
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, .45) !important;
}
body[data-view] .museum-ui-final .cabinet-overlay :is(.sc-coll-bar > span, .ach-bar > b, .dig-layer-prog > span) {
  display: block !important;
  height: 100% !important;
  border-radius: var(--pk-r-pill) !important;
  background: var(--pk-grad-gold) !important;
  transition: width .3s var(--pk-ease) !important;   /* единственный transition вне политики B2: ширину пишет JS */
}

/* D9. ПУСТЫЕ СОСТОЯНИЯ (у .rq-empty в museum.css:6161 есть ::before — сохраняем) */
body[data-view] .museum-ui-final .cabinet-overlay :is(.rq-empty, .rz-soon, .shelf-empty, .dig-active-empty, .heroes-empty, .exp-locked-note),
body[data-view] .museum-ui-final .exp-planner-overlay .exp-planner-noheroes {
  display: block !important;
  padding: 24px 16px !important;
  text-align: center !important;
  border: 1px dashed var(--pk-line) !important;
  border-radius: var(--pk-r-md) !important;
  background: rgba(255, 255, 255, .02) !important;
  font-family: var(--pk-font-body) !important;
  font-size: var(--pk-fs-cap) !important;
  font-style: italic !important;
  line-height: var(--pk-lh-body) !important;
  color: var(--pk-text-dim) !important;
}
body[data-view] .museum-ui-final .cabinet-overlay .rq-empty { display: flex !important; flex-direction: column !important; align-items: center !important; gap: 8px !important; }

/* D10. СКРОЛЛБАРЫ — три набора legacy в один. Селектор со звёздочкой безопасен:
   он под .cabinet-overlay и в мини-игры не течёт. */
body[data-view] .museum-ui-final .cabinet-overlay *,
body[data-view] .museum-ui-final .cabinet-overlay :is(.cabinet-modal, .dig-hub, .wm-screen, .codex-screen, .howto-modal),
body[data-view] .museum-ui-final .exp-planner-overlay * {
  scrollbar-width: thin !important;
  scrollbar-color: var(--pk-line-strong) transparent !important;
}
body[data-view] .museum-ui-final .cabinet-overlay ::-webkit-scrollbar,
body[data-view] .museum-ui-final .exp-planner-overlay ::-webkit-scrollbar { width: 8px !important; height: 8px !important; }
body[data-view] .museum-ui-final .cabinet-overlay ::-webkit-scrollbar-track,
body[data-view] .museum-ui-final .exp-planner-overlay ::-webkit-scrollbar-track { background: transparent !important; border-radius: var(--pk-r-pill) !important; box-shadow: none !important; }
body[data-view] .museum-ui-final .cabinet-overlay ::-webkit-scrollbar-thumb,
body[data-view] .museum-ui-final .exp-planner-overlay ::-webkit-scrollbar-thumb {
  background: var(--pk-line-strong) !important;
  border: 0 !important;                         /* было 3px — «съедал» половину ползунка */
  border-radius: var(--pk-r-pill) !important;
  box-shadow: none !important;
}

/* D11. ТУЛТИПЫ: .room-hint и .hud-hint были двумя дословными копиями.
   §C: position/left/top/transform/z-index не трогаем (координаты из render.js). */
body[data-view] .museum-ui-final :is(.room-hint, .hud-hint, .wm-lm-cap) {
  padding: 10px 13px !important;
  border-radius: var(--pk-r-md) !important;
  border: 1px solid var(--pk-line-strong) !important;
  background: linear-gradient(180deg, rgba(22, 30, 26, .98), rgba(10, 14, 12, .99)) !important;
  box-shadow: var(--pk-sh-md) !important;
  font-family: var(--pk-font-body) !important;
  color: var(--pk-text) !important;
  text-align: left !important;
}
body[data-view] .museum-ui-final .room-hint::after { border-top-color: var(--pk-line-strong) !important; }
body[data-view] .museum-ui-final .room-hotspot.rh-down .room-hint::after { border-top-color: transparent !important; border-bottom-color: var(--pk-line-strong) !important; }
body[data-view] .museum-ui-final .hud-hint::before { border-bottom-color: var(--pk-line-strong) !important; }
body[data-view] .museum-ui-final :is(.room-hint .rh-name, .hud-hint .hh-title) {
  font-family: var(--pk-font-title) !important;
  font-size: var(--pk-fs-h3) !important;
  font-weight: var(--pk-fw-bd) !important;
  color: var(--pk-gold-pale) !important;
}
body[data-view] .museum-ui-final :is(.room-hint .rh-status, .room-hint .rh-do, .room-hint .rh-up, .hud-hint .hh-row, .wm-lm-cap small) {
  font-size: var(--pk-fs-cap) !important;
  line-height: var(--pk-lh-body) !important;
  color: var(--pk-text-dim) !important;
}
body[data-view] .museum-ui-final :is(.room-hint .rh-up i, .hud-hint .hh-up) { color: var(--pk-ok) !important; }
body[data-view] .museum-ui-final :is(.room-hint .rh-locked i, .hud-hint .hh-dn) { color: var(--pk-warn) !important; }

/* D12. ТОСТ. museum.css:6091 уже даёт фирменный тост, поэтому здесь только
   ДЕЛЬТА (safe-area + кайма токеном) — полная перекраска из заготовки «музей»
   была бы повтором. transform/transition не трогаем: там пружина появления.
   .map-toast — §A (ui8_toast.png): только гарнитура. */
body[data-view] .toast {
  bottom: calc(28px + var(--pk-safe-b));
  border-color: var(--pk-line-strong);
  font-family: var(--pk-font-body);
}
body[data-view] .museum-ui-final .map-toast { font-family: var(--pk-font-body) !important; font-weight: var(--pk-fw-bd) !important; }
body[data-view] .levelup-banner {
  border-radius: var(--pk-r-lg) !important;
  border: 1px solid var(--pk-line-strong) !important;
  box-shadow: var(--pk-sh-lg) !important;
}
body[data-view] .levelup-banner b { font-family: var(--pk-font-title) !important; color: var(--pk-gold-pale) !important; }
body[data-view] .levelup-banner small { font-family: var(--pk-font-title) !important; font-size: var(--pk-fs-mini) !important; letter-spacing: var(--pk-tr-caps) !important; color: var(--pk-text-dim) !important; }

/* D13. ОСТАТКИ ЧУЖИХ ПАЛИТР. Единственная синяя плашка музея — на экране комнаты
   (§C её не покрывает: это не элемент карты). */
body[data-view] .room-screen-plaque {
  background: var(--pk-surface-1) !important;
  border: 1px solid var(--pk-line-strong) !important;
  border-radius: var(--pk-r-md) !important;
  box-shadow: var(--pk-sh-md) !important;
}
body[data-view] .room-screen-plaque .rsp-title { font-family: var(--pk-font-title) !important; color: var(--pk-gold-pale) !important; }
body[data-view] .room-screen-plaque small { color: var(--pk-text-dim) !important; }
/* readonly-строки кабинета были пергаментными рядом с тёмными input'ами */
body[data-view] .museum-ui-final .cabinet-overlay .cabinet-field-ro b,
body[data-view] .museum-ui-final .cabinet-overlay .rq-hero select {
  background: rgba(16, 28, 19, .6) !important;
  border: 1px solid var(--pk-line) !important;
  border-radius: var(--pk-r-sm) !important;
  color: var(--pk-gold-pale) !important;
  font-family: var(--pk-font-body) !important;
  font-weight: var(--pk-fw-bd) !important;
}
body[data-view] .museum-ui-final .cabinet-overlay .cabinet-field span,
body[data-view] .museum-ui-final .cabinet-overlay .cabinet-block h3 {
  font-family: var(--pk-font-title) !important;
  font-size: var(--pk-fs-mini) !important;
  font-weight: var(--pk-fw-bd) !important;
  letter-spacing: var(--pk-tr-caps) !important;
  text-transform: uppercase !important;
  color: var(--pk-text-dim) !important;
  text-shadow: none !important;
}
/* §A: .cabinet-head на текстуре cab_header.png — только гарнитура, размер не
   меняем (заголовок вписан в фикс-плашку 58px) */
body[data-view] .museum-ui-final .cabinet-overlay .cabinet-head h2 { font-family: var(--pk-font-title) !important; letter-spacing: var(--pk-tr-wide) !important; }

/* D14. ОБОЛОЧКА МУЗЕЯ — база (мобильный и любой низкий вьюпорт).
   ДЫРА 761-820: museum.css:873 (@media max-820) переводит .museum-main в одну
   колонку и даёт .map-card{min-height:56svh} — раскладка выше экрана; museum.css:
   5851 (@media min-761) идёт ПОЗЖЕ и с !important ставит height:100svh+
   overflow:hidden, снимая с неё контейнер прокрутки: всё ниже первого экрана
   обрезано (body[data-view="game"]{overflow:auto} из museum.css:642 не спасает —
   странице нечего скроллить). Здесь оболочка растёт и скроллится; «единый экран»
   возвращается в F7 с 821px (не с 768: полоса 768-820 стакнута по HUD).
   overflow:visible, а не auto: auto при height:auto не скроллит, но создаёт
   контекст обрезки для absolute-детей карты. padding 6px = museum.css:873. */
body[data-view] .museum-ui-final {
  height: auto !important;
  min-height: 100svh !important;
  overflow: visible !important;
  padding-top:    max(6px, var(--pk-safe-t)) !important;
  padding-right:  max(6px, var(--pk-safe-r)) !important;
  padding-bottom: max(6px, var(--pk-safe-b)) !important;
  padding-left:   max(6px, var(--pk-safe-l)) !important;
}


/* ########################## E. ЗОНА: 8 МИНИ-ИГР ############################ */
/* Работает БЕЗ body[data-view] — в играх его нет; единственный скоуп .pk-game.
   Без <link> и class="pk-game pk-game--<id>" в разметке зона мертва (п.3 списка
   ручных правок). Модификатор обязателен: имена классов в играх совпадают, а
   семантика разная (.board, .btn, .panel, .hint значат в разных играх разное).
   Не тронуто: §F игровая графика, §G хрупкая геометрия (ни одной высоты кнопок
   в шапках), §A текстуры /assets/ui_runtime/ в find_sorting, §H display/z-index
   оверлеев (показ сделан через display), фон сцены html/body. */

/* E1. Мостики к переменным самих игр. В заготовке они шли одним блоком на
   .pk-game вместе с --green/--cyan; разнесены по играм, потому что имена
   --green/--card/--panel/--line/--ink/--bg заняты в layer_story и amphora с
   РАЗНОЙ семантикой (§D), а .pk-game лежит на <body> и работает как их :root. */
.pk-game {
  --gold: var(--pk-gold);      /* story #cea831 и survivor #ffe09a -> один */
  --text: var(--pk-text);      /* было 4 варианта */
  --good: var(--pk-ok);
  --bad:  var(--pk-danger);
}
.pk-game--story   { --cream: var(--pk-text); --green: var(--pk-ok); }
.pk-game--analysis,
.pk-game--sorting { --muted: var(--pk-text-dim); }
.pk-game--analysis { --mid: var(--pk-gold); --cyan: var(--pk-gold-pale); }   /* ретируем голубую ветку #65d8ff */
/* НЕ переопределяем: --gold2, --gold-d, --line, --card, --panel, --ink, --ink2,
   --bg, --sand, --s1..--s3, --shadow — разная семантика, перекрасит вслепую. */

/* E2. ТИПОГРАФИКА. Без !important и без html{}: класс на body бьёт
   `html,body{font-family:Arial}` (story) и 'Manrope' (survivor) специфичностью. */
body.pk-game {
  font-family: var(--pk-font-body);
  color: var(--pk-text);
  -webkit-text-size-adjust: 100%;
}
.pk-game h1, .pk-game h2, .pk-game h3 {
  font-family: var(--pk-font-title);
  line-height: var(--pk-lh-tight);
  letter-spacing: var(--pk-tr-title);
}
/* общий рецепт интерактивов — ТЕКСТОВЫЙ шрифт: под него попадают длинные
   подписи (.opt, .mrow, .tray), капитель их бы испортила */
.pk-game button, .pk-game input, .pk-game select, .pk-game textarea { font-family: var(--pk-font-body); }
.pk-game .chip b, .pk-game #timer, .pk-game .tier,
.pk-game--amphora .count, .pk-game--survivor .statline b { font-variant-numeric: tabular-nums lining-nums; }
.pk-game--analysis .sample-title,
.pk-game--sorting .item-title,
.pk-game--sorting .tray strong,
.pk-game--expert .vbtn { font-weight: var(--pk-fw-bk); }             /* 900 синтезируется браузером */
.pk-game .badge { color: var(--pk-text-dim); opacity: .55; letter-spacing: var(--pk-tr-wide); }

/* E3. ШАПКА ИГРЫ */
.pk-game--amphora .top h1,
.pk-game--expert  .top h1,
.pk-game--route   .top h1,
.pk-game--training .top h1,
.pk-game--analysis .topbar h1,
.pk-game--sorting  .topbar h1,
.pk-game--story   .bar .logo {
  font-family: var(--pk-font-title);
  color: var(--pk-gold);
  letter-spacing: var(--pk-tr-wide);
  text-shadow: 0 2px 8px rgba(0, 0, 0, .65);
}
/* фирменный знак был только у expert_table и route_perekop — раздаём всем */
.pk-game--amphora .top h1::before,  .pk-game--amphora .top h1::after,
.pk-game--expert  .top h1::before,  .pk-game--expert  .top h1::after,
.pk-game--route   .top h1::before,  .pk-game--route   .top h1::after,
.pk-game--training .top h1::before, .pk-game--training .top h1::after,
.pk-game--analysis .topbar h1::before, .pk-game--analysis .topbar h1::after,
.pk-game--sorting  .topbar h1::before, .pk-game--sorting  .topbar h1::after,
.pk-game--story   .bar .logo::before,  .pk-game--story   .bar .logo::after {
  content: "\2726";
  color: var(--pk-line-strong);
  font-size: .62em;
  margin: 0 .42em;
  vertical-align: middle;
}
.pk-game--analysis .subtitle,
.pk-game--sorting  .subtitle,
.pk-game--story .bar .goal,
.pk-game--story .sub { font-family: var(--pk-font-body); font-weight: var(--pk-fw-md); color: var(--pk-text-dim); }
.pk-game--story .bar { border-bottom: 1px solid var(--pk-line); }
/* капсулы HUD: фон всем, кроме find_sorting (там текстура ui_hud_chip_base.webp,
   §A). Геометрию не трогаем — §G. */
.pk-game .chip {
  font-family: var(--pk-font-body);
  font-weight: var(--pk-fw-bd);
  color: var(--pk-gold-pale);
  border-color: var(--pk-line-strong);
}
.pk-game:not(.pk-game--sorting) .chip { background: var(--pk-surface-chip); box-shadow: var(--pk-sh-sm); }
/* survivor: §F разрешает только цвет — фон .pill оставляем прозрачным, иначе
   исчезнет backdrop-filter поверх канваса; у #ctl (34x34) тоже только цвет. */
.pk-game--survivor .pill { font-family: var(--pk-font-body); color: var(--pk-gold); border-color: var(--pk-line-strong); }
.pk-game--survivor .pill small { color: var(--pk-text-dim); }
.pk-game--survivor #ctl button { color: var(--pk-gold); border-color: var(--pk-line-strong); }

/* E4. КНОПКИ. ВЫСОТЫ НЕ ЗАДАЁМ (§G): amphora scatter() y=52 и clampPos() y>=48
   зашиты под высоту .top; training .board=min(92vw,86vh,720px) даёт скролл при
   росте шапки; survivor #hud заворачивается на вторую строку. */
.pk-game--amphora .done .btn,        /* «Поставить в витрину» — главный CTA игры */
.pk-game--expert   .btn-gold,
.pk-game--route    .btn-gold,
.pk-game--training .btn-gold,
.pk-game--survivor .btn-gold,
.pk-game--story    .btn,
.pk-game--analysis .btn {
  background: var(--pk-grad-gold);
  color: var(--pk-ink-gold);
  border: 1px solid var(--pk-gold-hi);
  border-radius: var(--pk-r-md);
  box-shadow: var(--pk-sh-sm);
  font-family: var(--pk-font-title);
  letter-spacing: var(--pk-tr-title);
  cursor: pointer;
}
.pk-game--sorting .btn { font-family: var(--pk-font-title); letter-spacing: var(--pk-tr-title); color: var(--pk-ink-gold); }   /* §A: фон-текстура остаётся */
/* призрачная кнопка; (0,3,0) сознательно выше золотого рецепта (0,2,0) */
.pk-game--amphora  .top .btn,
.pk-game--expert   .btn:not(.btn-gold),
.pk-game--route    .btn:not(.btn-gold),
.pk-game--training .btn:not(.btn-gold),
.pk-game--survivor .btn-ghost,
.pk-game--story    .btn.ghost,
.pk-game--analysis .btn.secondary,
.pk-game--sorting  .btn.secondary {
  background: var(--pk-surface-1);
  color: var(--pk-gold-pale);
  border: 1px solid var(--pk-line-strong);
  border-radius: var(--pk-r-md);
  box-shadow: var(--pk-sh-sm);
  font-family: var(--pk-font-title);
  letter-spacing: var(--pk-tr-title);
}
/* в модалках высоту поднимать безопасно (это не шапка): было 46/48, стало 48 */
.pk-game .rbtns .btn,
.pk-game--analysis .modal-actions .btn,
.pk-game--sorting  .modal-actions .btn { min-height: var(--pk-h-control); }
.pk-game .btn:disabled, .pk-game button:disabled { opacity: .55; filter: grayscale(.4); cursor: not-allowed; transform: none; }
/* голубая кнопка сканера -> золото; min-height:56px оставляем — главный тап игры */
.pk-game--analysis .scanbtn {
  background: var(--pk-grad-gold);
  color: var(--pk-ink-gold);
  border: 1px solid var(--pk-gold-hi);
  border-radius: var(--pk-r-md);
  box-shadow: var(--pk-sh-md);
  font-family: var(--pk-font-title);
  letter-spacing: var(--pk-tr-title);
}
/* варианты выбора: рамка и радиус общие, заливку оставляем — она несёт состояние */
.pk-game--expert   .cult,
.pk-game--route    .opt,
.pk-game--survivor .choice,
.pk-game--story    .tk,
.pk-game--training .help-tools .ht,
.pk-game--expert   .clue { border-radius: var(--pk-r-md); border-color: var(--pk-line); }
.pk-game--expert .cult { font-family: var(--pk-font-title); }

/* E5. ОВЕРЛЕИ И ПАНЕЛИ — только подложка и блюр; display/position/z-index нет. */
.pk-game--expert   .ov, .pk-game--expert .loupe-ov,
.pk-game--route    .ov, .pk-game--route .act,
.pk-game--training .result, .pk-game--training .help-overlay,
.pk-game--story    .ov,
.pk-game--survivor .overlay,
.pk-game--analysis .modal,
.pk-game--sorting  .modal {
  background: var(--pk-scrim);
  -webkit-backdrop-filter: blur(var(--pk-blur));
  backdrop-filter: blur(var(--pk-blur));
}
/* одна поверхность вместо «изумруд у 4 игр / тёмно-синий у 3»; border-color, а не
   border — сохраняем их толщины 1px и 2px.
   `.pk-game--analysis .board` из заготовки УБРАН: .board держит полосы прибора,
   а имя коллидирует с игровой графикой других игр (§F). */
.pk-game--amphora  .done,
.pk-game--expert   .case, .pk-game--expert .card, .pk-game--expert .loupe-card,
.pk-game--route    .card,
.pk-game--training .rcard, .pk-game--training .help-card,
.pk-game--story    .panel,
.pk-game--survivor .card,
.pk-game--analysis .topbar, .pk-game--analysis .bottom,
.pk-game--analysis .modal-card, .pk-game--analysis .panel, .pk-game--analysis .lab {
  background: var(--pk-surface-1);
  border-color: var(--pk-line-strong);
  border-radius: var(--pk-r-lg);
  box-shadow: var(--pk-sh-lg);
}
/* find_sorting остаётся тёмно-синим: её .topbar/.board/.bottom/.modal-card держат
   текстуру ui_card_panel.webp (§A) — только типографика */
.pk-game--sorting .panel p, .pk-game--sorting .panel li,
.pk-game--sorting .modal-card p, .pk-game--sorting .log, .pk-game--sorting .fact,
.pk-game--sorting .tray strong, .pk-game--sorting .tray span,
.pk-game--analysis .panel p, .pk-game--analysis .panel li,
.pk-game--analysis .modal-card p, .pk-game--analysis .log, .pk-game--analysis .fact { font-family: var(--pk-font-body); }
.pk-game--analysis .fact, .pk-game--sorting .fact,
.pk-game--analysis .log,  .pk-game--sorting .log { color: var(--pk-text-dim); }
/* `.rfind .ic` из заготовки убран: имя .ic принадлежит графике route (§F) */
.pk-game .mini { border-color: var(--pk-line); border-radius: var(--pk-r-md); }

/* E6. ПОДСКАЗКИ И СТАТУСЫ. `.hint` скоуплен по играм: в training это значок в
   клетке, в expert — подпись на находке (обе §F, не трогаем). */
.pk-game--amphora .hint { font-family: var(--pk-font-body); color: var(--pk-text-dim); }
.pk-game--amphora .count { color: var(--pk-text-dim); }
.pk-game--route .status { font-family: var(--pk-font-body); color: var(--pk-text); border-color: var(--pk-line); }
.pk-game--training .status { font-family: var(--pk-font-body); }
.pk-game--training .status.info { color: var(--pk-gold-pale); }        /* был стальной #a9c7ee */
.pk-game--training .help-goal,
.pk-game--training .help-notes,
.pk-game--training .help-tools .ht span,
.pk-game--expert .help ul, .pk-game--route .help ul,
.pk-game--story .small { color: var(--pk-text-dim); }
.pk-game--training .help-tools .ht b,
.pk-game--training .help-notes b,
.pk-game--expert .help b, .pk-game--route .help b,
.pk-game--expert .rank { color: var(--pk-gold-pale); }
.pk-game--training .tool .tname, .pk-game--training .tool .tnote { font-family: var(--pk-font-body); }   /* фон/размер .tool — §F, не тронуты */
.pk-game--training .tool .tnote { color: var(--pk-text-dim); }
.pk-game--route .legend span { color: var(--pk-text-dim); font-family: var(--pk-font-body); }

/* E7. ЭКРАН ИТОГОВ (тройной дубль expert/route/training; цвета .tier.perfect/
   .gold/.silver/.bronze не трогаем — это арт-шкала). */
.pk-game .tier { font-family: var(--pk-font-title); letter-spacing: var(--pk-tr-wide); }
.pk-game .rscore, .pk-game .rsub, .pk-game .rfind .nm { font-family: var(--pk-font-body); color: var(--pk-text-dim); }
.pk-game .rrewards { color: var(--pk-gold-pale); }
.pk-game--survivor .statline em { color: var(--pk-text-dim); }

/* E8. LAYER_STORY: точечное. `.jr` (пергамент журнала) не трогаем — эталон
   пергамента; Alegreya он получает по наследству от body. */
.pk-game--story .tag { font-family: var(--pk-font-body); }
.pk-game--story .tag.cur { color: var(--pk-ink-gold); }
.pk-game--story .side h3 { letter-spacing: var(--pk-tr-caps); }

/* E9. LAYER_SURVIVOR: перебой инлайновых стилей. Здесь и только здесь нужен
   !important — у этих узлов style="" в разметке (18 штук). Только гарнитура,
   цвет и заливка; размеры/позиции/z-index не трогаем (§G/§H). */
.pk-game--survivor #loadScreen,
.pk-game--survivor #cdEl,
.pk-game--survivor #startScreen > div,
.pk-game--survivor #dlgWho,
.pk-game--survivor #dlgText,
.pk-game--survivor #dlgPortrait,
.pk-game--survivor #dlgSkip,
.pk-game--survivor #dlgNext { font-family: var(--pk-font-body) !important; }   /* было 'Manrope'/'Literata' — их в проекте нет */
.pk-game--survivor #cdEl,
.pk-game--survivor #startScreen > div:first-child,
.pk-game--survivor #dlgWho {
  font-family: var(--pk-font-title) !important;
  font-weight: var(--pk-fw-bk) !important;
  color: var(--pk-gold) !important;
}
.pk-game--survivor #loadScreen { color: var(--pk-gold) !important; }
.pk-game--survivor #startBtn {
  font-family: var(--pk-font-title) !important;
  background: var(--pk-grad-gold) !important;
  color: var(--pk-ink-gold) !important;
  border-radius: var(--pk-r-md) !important;
}
.pk-game--survivor #ovDlg > div {
  background: var(--pk-surface-1) !important;
  border-color: var(--pk-gold-frame) !important;
  border-radius: var(--pk-r-lg) !important;
}
.pk-game--survivor #dlgPortrait { border-color: var(--pk-line-strong) !important; border-radius: var(--pk-r-md) !important; color: var(--pk-gold) !important; }
.pk-game--survivor #dlgText { color: var(--pk-text) !important; }
.pk-game--survivor #dlgNext { background: var(--pk-grad-gold) !important; color: var(--pk-ink-gold) !important; border-radius: var(--pk-r-md) !important; }
.pk-game--survivor #dlgSkip { color: var(--pk-text-dim) !important; border-color: var(--pk-line-strong) !important; border-radius: var(--pk-r-md) !important; }
.pk-game--survivor #hint { font-family: var(--pk-font-body); color: var(--pk-gold-pale); border-color: var(--pk-line-strong); }
.pk-game--survivor #startprompt { border-color: var(--pk-gold-frame); }
.pk-game--survivor #startprompt b { font-family: var(--pk-font-title); color: var(--pk-gold); }
.pk-game--survivor #startprompt span { color: var(--pk-text); }
.pk-game--survivor .card p, .pk-game--survivor .choice span { color: var(--pk-text-dim); }
.pk-game--survivor .choice b { font-family: var(--pk-font-title); color: var(--pk-gold); }


/* ####################### F. МЕДИА-ЗАПРОСЫ (все в конце) #################### */
/* Брейкпоинты: sm 768 / md 1024 / lg 1440. Два порога оставлены легаси-
   привязанными: 720 (шторка героев, museum.css:4349) и 820/821 (стакание HUD,
   museum.css:873 и :5933) — перенос их на 768 разъедет раскладку. */

/* F1. HOVER ТОЛЬКО ДЛЯ МЫШИ (на тачах он залипает после тапа). */
@media (hover: hover) and (pointer: fine) {
  body[data-view] .landing-links .linkbtn:hover { color: var(--pk-gold); opacity: 1; }
  body[data-view="auth"] .auth-view .button:hover:not(:disabled) { transform: translateY(-1px); filter: brightness(1.06); }
  body[data-view="auth"] .auth-back:hover {
    color: var(--pk-gold);
    border-color: var(--pk-gold);
    transform: none;                 /* гасим translateY из base.css:50 — кнопка fixed */
    box-shadow: var(--pk-sh-sm);
  }
  body[data-view] .museum-ui-final .cabinet-overlay :is(.rq-find, .rs-node, .rz-order, .codex-entry, .knw-art, .ht-room):hover {
    border-color: var(--pk-line-strong) !important;
    transform: translateY(-1px) !important;
  }
  body[data-view] .museum-ui-final .cabinet-overlay button:hover:not(:disabled),
  body[data-view] .museum-ui-final .prologue-overlay button:hover:not(:disabled),
  body[data-view] .museum-ui-final .exp-planner-overlay button:hover:not(:disabled) {
    filter: brightness(1.07) !important;
    transform: translateY(-1px) !important;
    /* box-shadow НЕ меняем — источник прямоугольного ореола за PNG-кнопкой */
  }
  body[data-view] .museum-ui-final .cabinet-overlay .cabinet-close:hover,
  body[data-view] .museum-ui-final .cabinet-overlay .heroes-close-btn:hover,
  body[data-view] .museum-ui-final .exp-planner-overlay .exp-planner-close:hover {
    background: rgba(44, 32, 16, .95) !important;
    transform: scale(1.06) !important;
  }
  body[data-view] .museum-ui-final .cabinet-overlay ::-webkit-scrollbar-thumb:hover { background: var(--pk-gold) !important; }
}

/* F2. ГАШЕНИЕ LEGACY-HOVER НА ТАЧЕ. Переписать 128 legacy-правил нельзя, поэтому
   гасим поимённо подъём и свечение. Никакого `*:hover{transform:none}`: на карте
   у .room-mark/.room-marker базовый transform:translate(-50%,-50%) (§C). */
@media (hover: none) {
  body[data-view="landing"] .landing-actions .button:hover,
  body[data-view="landing"] .landing-actions .button-gold:hover,
  body[data-view="landing"] .landing-actions .button-ghost:hover,
  body[data-view="landing"] .about-btn:hover,
  body[data-view="landing"] .landing-links .linkbtn:hover,
  body[data-view] .button:hover:not(:disabled),
  body[data-view] .museum-ui-final .top-hud .museum-profile .hud-map-btn:hover,
  body[data-view] .museum-ui-final .lyr-card:hover,
  body[data-view] .museum-ui-final .hero-pick:hover,
  body[data-view] .museum-ui-final .region-railbtn:hover { transform: none !important; }
  /* filter восстанавливаем базовым значением, а не `none`: у .button-ghost и
     .about-btn фильтр несёт БАЗОВЫЙ вид. Значения = landing.css:136/:145/:239. */
  body[data-view="landing"] .landing-actions .button-gold:hover  { filter: drop-shadow(0 4px 10px rgba(0,0,0,.4)) !important; }
  body[data-view="landing"] .landing-actions .button-ghost:hover { filter: saturate(.45) brightness(.92) drop-shadow(0 4px 10px rgba(0,0,0,.4)) !important; }
  body[data-view="landing"] .about-btn:hover                     { filter: drop-shadow(0 4px 10px rgba(0,0,0,.45)) !important; }
  .pk-game .btn:hover, .pk-game .cult:hover,
  .pk-game .opt:hover, .pk-game .choice:hover { filter: none; transform: none; }
}

/* F3. ТАЧ-ЦЕЛИ, НЕ ПОКРЫТЫЕ БЕЗУСЛОВНЫМИ ПРАВИЛАМИ. Из списка заготовки убраны
   .linkbtn, .dev-tab, .wm-*, .keeper-util-btn (уже 44-48px в C9/D5/D6) и
   .dig-site-tab (ей высоту и display менять нельзя). */
@media (pointer: coarse) {
  body[data-view] .museum-ui-final .region-railbtn {
    min-height: var(--pk-tap);
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }
  body[data-view="landing"] .about-close { width: var(--pk-tap); height: var(--pk-tap); top: 8px; right: 8px; }
}

/* F4. МОБИЛЬНЫЙ (< 768). Заготовки держали свои блоки на 720 (наследие v2:278);
   сведено к новому sm=768, блок v2 на 720 задаёт то же в подмножестве. */
@media (max-width: 767px) {
  body[data-view] {
    --pk-pad-panel: 16px;
    --pk-pad-row: 10px 12px;
    --pk-head-inset: 44px;
    --pk-fs-h2: 20px;
    --pk-fs-h2-lg: 23px;
  }
  body[data-view] .museum-ui-final .cabinet-overlay .cabinet-modal:not(.room-zone-panel),
  body[data-view] .museum-ui-final .cabinet-overlay :is(.dig-hub, .wm-screen, .codex-screen, .hero-sel, .howto-modal) {
    width: min(100%, calc(100vw - 24px)) !important;    /* было min(640…1240px,96vw): на 375px текст прилипал к кайме */
    max-height: min(94svh, calc(100dvh - 24px)) !important;
  }
  body[data-view] .museum-ui-final .cabinet-overlay :is(.howto-cta, .hero-sel-start, .dig-self-btn, .heroes-btn-gold, .heroes-btn-ghost),
  body[data-view] .museum-ui-final .exp-planner-overlay .exp-planner-send { width: 100% !important; }
  body[data-view] .museum-ui-final .cabinet-overlay :is(.dev-tabs, .heroes-tabs, .wm-tabbar) { flex-wrap: wrap !important; }
  body[data-view="auth"] .auth-tabs { grid-template-columns: 1fr; }   /* два слова в 56px-кнопке переносятся */
}

/* F5. ДЕСКТОП (>= 768): возврат правой привязки лендинга. База выше мобильная,
   а revert-layer недоступен (@layer в проекте запрещён). Значения зеркалят
   landing.css: 520x.18 = 94px — ровно как костыль padding-top:94px!important. */
@media (min-width: 768px) {
  body[data-view="landing"],
  body[data-view="auth"] {
    --pk-landing-w: min(520px, calc(100vw - 44px));
    --pk-col: calc(var(--pk-landing-w) * .75);
    --pk-lc-pt: .18;  --pk-lc-px: .125; --pk-lc-pb: .105;
    --pk-ac-pt: .12;  --pk-ac-px: .095; --pk-ac-pb: .10;
  }
  body[data-view="landing"] .landing-card {
    left: auto;
    right: 9vw;
    width: min(520px, calc(100vw - 44px));
    max-width: none;
    margin-inline: 0;
    bottom: max(6svh, var(--pk-safe-b));
  }
  body[data-view="landing"] .landing-logo { width: min(560px, 46vw); top: clamp(18px, 3svh, 34px); }
  body[data-view="auth"] .auth-tabs { grid-template-columns: 1fr 1fr; }
  body[data-view="auth"] .auth-screen { padding-top: calc(70px + var(--pk-safe-t)); }
}

/* F6. ШИРОКИЙ ЭКРАН (>= 1440) */
@media (min-width: 1440px) {
  body[data-view="landing"] .landing-card { right: 12vw; }
}

/* F7. ЛЕГАСИ-ПРИВЯЗАННЫЕ ИСКЛЮЧЕНИЯ */
/* 720 — полноэкранная «шторка» героев: правим только единицы vh -> dvh. */
@media (max-width: 720px) {
  body[data-view] .museum-ui-final .cabinet-modal.heroes-modal--v2 { height: 100dvh !important; max-height: 100dvh !important; }
  body[data-view] .museum-ui-final .cabinet-modal.heroes-modal--v2 :is(.heroes-roster, .heroes-detail) { max-height: calc(100dvh - 130px) !important; }
}
/* 820 — карточка комнаты становится fixed-шторкой только здесь (museum.css:886);
   вне диапазона у неё bottom:auto и якоря data-anchor. Это .room-card, а НЕ
   .room-card-actions .button (§B). */
@media (max-width: 820px) {
  body[data-view] .museum-ui-final .room-card,
  body[data-view] .museum-ui-final .room-card[data-anchor="bottom-right"],
  body[data-view] .museum-ui-final .room-card[data-anchor="top-left"],
  body[data-view] .museum-ui-final .room-card[data-anchor="top-right"] {
    bottom: max(10px, var(--pk-safe-b));
    left:   max(10px, var(--pk-safe-l));
    right:  max(10px, var(--pk-safe-r));
    max-height: 44svh;
  }
}
/* 821 + высота 560 — пара к D14: «единый экран» возвращается только там, где HUD
   в одну строку И хватает высоты (на 900x500 замок обрезал бы так же, как в
   дыре). padding:8px = museum.css:682, не новое значение. */
@media (min-width: 821px) and (min-height: 560px) {
  body[data-view] .museum-ui-final {
    display: flex !important;
    flex-direction: column !important;
    height: 100svh !important;
    min-height: 100svh !important;
    overflow: hidden !important;
    padding: 8px !important;
    padding-left:  max(8px, var(--pk-safe-l)) !important;
    padding-right: max(8px, var(--pk-safe-r)) !important;
  }
}


/* ============================================================================
   СВОДКА v3

   ОБЪЁМ: 218 селекторных правил (789 деклараций), из них 29 — внутри 9 медиа-
   запросов; 49 новых токенов в одном :root. Файл прогнан разбором: скобки
   сбалансированы, комментарии закрыты, текста вне блоков нет, вложенность не
   глубже одного @media, битых деклараций нет, ни одна var(--pk-*) не осталась
   без объявления (с учётом токенов v2).

   ЗОНЫ
   A токены      49 новых --pk-* (палитра, поверхности, типошкала, ритм,
                 движение, safe-area). Имена v2 не переобъявлены; имён из
                 запрета §D в глобальном :root нет.
   B примитивы   тач-цели, единая политика переходов на весь SPA, will-change.
   C auth+landing карточки входа и авторизации, ритм формы, метки, поля +
                 autofill, кнопки, ссылки-кнопки, вкладки, «На главную»,
                 статус-заметка (+ .pk-note--ok/--error/--busy), «Об игре»,
                 логотип.
   D музей       оверлеи, панели (поверхность/радиус/потолок высоты, svh+dvh),
                 шапки и крестик 44x44, строки-карточки и 3 состояния, кнопки в
                 панелях, вкладки, чипы и бейджи (4 семантики вместо 8
                 хардкодов), типографика HUD, прогресс, пустые состояния,
                 скроллбары, тултипы, тост, плашка комнаты, поля кабинета,
                 оболочка музея (дыра 761-820).
   E мини-игры   8 игр через .pk-game + модификатор: мостики переменных,
                 типографика, шапка со знаком, кнопки, оверлеи и панели,
                 подсказки, экран итогов, layer_story, layer_survivor.
   F медиа       hover:hover / hover:none / pointer:coarse / max-767 / min-768 /
                 min-1440 / три легаси-исключения (720, 820, 821+560).

   РИСКИ — ПРОВЕРЕНО ГРЕПОМ ПО КОДУ (без комментариев)
   §A  0 объявлений background/background-image/border-image/border-radius/
       box-shadow на .landing-card, .auth-card, .about-btn, .top-hud,
       .cabinet-head, .keeper-scroll, .map-toast, .cabinet-btn, .keeper-cta,
       .room-screen-back, .museum-gate-btn, .room-zone-panel, ui_runtime-узлах
       find_sorting. Им отданы только padding и типографика; высоту текстурным
       кнопкам тоже не меняем.
   §B  0 правил на .room-card-actions .button (в т.ч. удалена «страховка» из
       заготовки «музей», которая сама задавала font-size/min-height).
   §C  0 правил на .museum-map, .map-frame, .map-layer-base/-atmosphere/-slots,
       .map-room-patch, .room-slot-shape, .room-visual, .room-rim-glow,
       .locked-shade, .room-hotspot, .room-mark/.room-marker/.room-label.
       Тултипы правятся без position/transform/z-index.
   §D  глобальный :root — только --pk-*; игровые мостики на .pk-game, а
       --green/--cream/--muted/--mid/--cyan разнесены по конкретным играм.
   §E  0 правил на body/html/звёздочку/button/canvas/iframe без скоупа.
       Единственная звёздочка — под .cabinet-overlay.
   §F  игровая графика не тронута; из заготовок убраны .pk-game--analysis .board
       и .rfind .ic.
   §G  0 высот кнопок в шапках мини-игр; #ctl — только цвет; .hud-capsule —
       только шрифт и цвет; .dig-hub-btn 44px, а не 48.
   §H  0 объявлений z-index; display/position оверлеев не тронуты.
   §I  свой prefers-reduced-motion v3 НЕ добавляет: v2:135-141 уже делает то же
       (дубль был бы бессмысленным) — см. п.4 ручных правок.

   УБРАНО КАК ДУБЛЬ ИЛИ КОНФЛИКТ
   · три параллельных набора токенов -> один :root;
   · вторая шкала линий/радиусов/теней -> значения v2;
   · переобъявление --pk-fs-sm/xs с другими значениями -> имена --pk-fs-cap/mini;
   · два рецепта отступов оверлеев (16px vs clamp) -> один clamp + safe-area;
   · поштучный список vh->svh для модалок -> один общий потолок панелей;
   · два блока transition -> одна политика B2;
   · два блока prefers-reduced-motion -> ни одного (v2 уже есть);
   · два рецепта .landing-card (проценты vs calc-базис) -> calc-базис + inset;
   · min-height у .auth-card -> убран (процент в min-height считается от высоты);
   · PNG-текстура на кнопках auth -> градиент (в проекте плашки .webp);
   · два @media 720 -> один @media 767;
   · дубли тач-целей в @media(pointer:coarse) -> убраны;
   · .toast перекрашен дважды -> оставлена дельта.

   ================================================================
   ТРЕБУЕТ РУЧНОЙ ПРАВКИ В HTML / JS / CSS (без этого часть v3 мертва)
   ================================================================

   1. frontend/public/index.html, строка 5 — ОБЯЗАТЕЛЬНО, иначе весь safe-area-код
      в C/D/F равен нулю:
        <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
      Ставить строго ВМЕСТЕ с этим CSS: cover пускает контент под чёлку, а
      отступы v3 его оттуда вынимают.

   2. frontend/public/index.html — поднять версию ссылки на слой (иначе кэш v2):
        <link rel="stylesheet" href="/assets/css/brand.css?v=20260726a">
      Ссылка идёт ПОСЛЕДНЕЙ, после museum.css.

   3. frontend/public/minigames/<игра>/index.html — 8 файлов. В каждый:
      (а) СРАЗУ ПОСЛЕ его собственного </style>, до </head> (порядок важен:
          brand.css обязан идти после inline-стиля игры):
            <link rel="preconnect" href="https://fonts.googleapis.com">
            <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
            <link href="https://fonts.googleapis.com/css2?family=Alegreya:ital,wght@0,400;0,500;0,700;0,800;1,400&family=Alegreya+SC:wght@500;700;800&display=swap" rel="stylesheet">
            <link rel="stylesheet" href="/assets/css/brand.css?v=20260726a">
      (б) класс на <body> (модификатор обязателен):
            minigames/amphora/index.html           pk-game pk-game--amphora
            minigames/analysis_lab/index.html      pk-game pk-game--analysis
            minigames/expert_table/index.html      pk-game pk-game--expert
            minigames/find_sorting/index.html      pk-game pk-game--sorting
            minigames/layer_story/index.html       pk-game pk-game--story
            minigames/layer_survivor/index.html    pk-game pk-game--survivor
            minigames/route_perekop/index.html     pk-game pk-game--route
            minigames/training_dig_web/index.html  pk-game pk-game--training
      В layer_story строка вида «</style></head>» одна — разбить на </style> +
      4 строки <link> + </head>; тело там начинается как <body><div id="app">.

   4. frontend/public/assets/css/brand.css, СТРОКИ 135-141 (prefers-reduced-motion
      в v2) — заменить: сейчас `*{transition-duration:.001ms!important}` глушит
      НАМЕРЕННЫЙ фейд тоста (museum.css:6123, opacity .2s) и любые фейды вообще.
      Рекомендуемая замена:
        @media (prefers-reduced-motion: reduce) {
          body[data-view] *, body[data-view] *::before, body[data-view] *::after,
          .pk-game *, .pk-game *::before, .pk-game *::after {
            animation-duration: .001ms !important;
            animation-iteration-count: 1 !important;
          }
          body[data-view] *, .pk-game * { transition-property: opacity !important; }
        }

   5. frontend/public/assets/css/brand.css, СТРОКИ 108-113 и 116-120 — глобальные
      `body{...}` и `h1,h2,h3{...}` из v2. Пока слой подключён только к
      index.html, они безвредны; ПОСЛЕ подключения к мини-играм (п.3) начнут
      действовать без скоупа — прямое нарушение §E. Заскоупить:
      `body[data-view], body.pk-game {…}` и
      `body[data-view] :is(h1,h2,h3), .pk-game :is(h1,h2,h3) {…}`.

   6. frontend/public/assets/css/brand.css, СТРОКА 197 — `.linkbtn{min-height:44px}`
      мёртвое (landing.css:345 выигрывает по специфичности). Рабочая замена уже
      в v3 (C9); строку можно удалить при следующей чистке.

   7. frontend/public/assets/js/auth.js (~строка 228, запись статуса) — без этого
      стили .pk-note--ok/--error/--busy из C12 никогда не сработают:
        el.className = 'status-note pk-note--error'; el.setAttribute('role','alert');
      (успех -> pk-note--ok, «Входим…» -> pk-note--busy, сброс -> 'status-note').
      Ширину кнопки при «Входим…» не менять.

   8. frontend/public/assets/js/museum/render.js — снять инлайновые стили, которые
      перебивают слой по определению: style="color:#e8c163" (~1230 и ~1321),
      "#8fbf9f" (~1270), font-size:21px/19px (~119-120).

   9. frontend/public/minigames/{expert_table,layer_survivor,route_perekop,
      training_dig_web,layer_story}/index.html, строка 5 (в layer_story — 3) —
      снять maximum-scale=1, user-scalable=no из meta viewport (доступность).

   10. Подписи кнопки выхода в мини-играх — 6 разных вариантов («← Назад к
       музею» в amphora и training_dig_web, «← В музей» в expert_table, «Назад к
       музею» в analysis_lab и find_sorting, «В музей» в итогах expert_table,
       «Выйти» в layer_story, «Вернуться в музей» на экранах итогов). Свести к
       одной — правка ТЕКСТА в HTML, CSS тут бессилен.

   11. ОПЦИОНАЛЬНО: если кнопки auth должны быть той же ТЕКСТУРОЙ, что на
       лендинге (сейчас градиент) — в C8 заменить background у .button-gold на
       url('/assets/ui_set/ui8_btn_gold.webp') center / 100% 100% no-repeat, у
       .button-ghost — на ui8_btn_sand.webp, предварительно сверив имена: в
       landing.css все плашки .webp, а не .png (ui8_login_panel.webp,
       ui8_btn_small.webp, ui8_input.webp, ui_login_frame.webp).

   12. ПРОВЕРИТЬ ГЛАЗАМИ после деплоя:
       · кабинет — панель стала изумрудной, а шапка .cabinet-head остаётся
         коричневой текстурой cab_header.png (§A запрещает её трогать). При
         клеше: либо вернуть .cabinet-modal коричневый фон, либо заменить арт
         шапки — правка в одну строку;
       · крестик закрытия теперь глиф в круге 44x44, картинка .cabinet-close-img
         скрыта (D3). Вернуть арт-крестик = удалить три правила про
         .cabinet-close-img и ::after;
       · ширины 375 / 768 / 800 / 820 / 1024 / 1440 и iPhone-ландшафт. 800px —
         самый важный: середина закрытой дыры 761-820, где «Раскоп -> Войти»
         был недостижим.
   ============================================================================ */