/* V24: merchant slot choice, compact comparison, on-board rent and aligned quick messages. */
html.np-game-animation-locked :is(.board-center button,.game-sidebar button:not(.communication-toggle),.sector-buildings,.board-sector){pointer-events:none!important}

@media(min-width:901px){
  .game-sidebar{min-width:0!important;grid-template-rows:auto minmax(0,1fr)!important;overflow:hidden!important}
  .game-sidebar>.table-communication.embedded{display:flex!important;width:100%!important;min-width:0!important;min-height:0!important;height:100%!important;box-sizing:border-box!important;overflow:hidden!important}
  .game-sidebar .communication-panel{display:grid!important;width:100%!important;min-width:0!important;min-height:0!important;height:100%!important;max-height:none!important;box-sizing:border-box!important;overflow:hidden!important;grid-template-rows:auto auto minmax(210px,1fr) auto auto!important}
  .game-sidebar .table-chat-log{min-height:210px!important;max-height:none!important;height:auto!important;overflow:auto!important}
}
.communication-panel>*{min-width:0!important;max-width:100%!important;box-sizing:border-box!important}.communication-panel>form{width:100%!important;grid-template-columns:minmax(0,1fr) 42px!important}.communication-panel>form input{width:100%!important;box-sizing:border-box!important}
.table-chat-log{width:100%!important;padding:8px!important;box-sizing:border-box!important;overflow-x:hidden!important}
.quick-chat-phrases{display:grid!important;width:100%!important;grid-template-columns:repeat(3,minmax(0,1fr))!important;gap:5px!important;padding:6px!important;max-height:150px!important;box-sizing:border-box!important;overflow-x:hidden!important;overflow-y:auto!important}.quick-chat-phrases button{min-width:0!important;max-width:100%!important;overflow:hidden!important;text-overflow:ellipsis!important}

/* The collectible belongs to the brief on-board phrase, not to the permanent chat history. */
.np-quick-message-stack{position:fixed;z-index:1750;top:clamp(72px,9vh,112px);left:50%;display:flex;width:min(720px,calc(100vw - 24px));flex-direction:column;align-items:center;gap:8px;transform:translateX(-50%);pointer-events:none}
.np-quick-message-toast{display:flex;width:min(690px,100%);min-height:0;aspect-ratio:3/1;padding:44px calc(var(--np-chat-pad,36px) + 76px) 68px;box-sizing:border-box;flex-direction:column;justify-content:center;align-items:center;text-align:center;background-color:transparent;background-image:var(--np-chat-frame);background-repeat:no-repeat;background-position:center;background-size:contain;color:var(--np-chat-text);filter:drop-shadow(0 12px 18px #000c);opacity:0;transform:translateY(-18px) scale(.94);transition:opacity .22s ease,transform .28s cubic-bezier(.2,.8,.2,1)}
.np-quick-message-toast.show{opacity:1;transform:none}.np-quick-message-toast b,.np-quick-message-toast span{display:block;width:100%;text-align:center}.np-quick-message-toast b{color:var(--np-chat-name);font:800 13px/1.1 Literata,Georgia,"Times New Roman",serif;letter-spacing:.07em;text-transform:uppercase}.np-quick-message-toast span{margin-top:4px;color:var(--np-chat-text);font:700 18px/1.22 Literata,Georgia,"Times New Roman",serif;text-shadow:0 1px 1px #fff4}

/* Buildings stay inside their sector and above the card artwork. */
.board-sector{overflow:hidden!important;isolation:isolate}.sector-buildings.np-sector-building-art{position:absolute!important;z-index:62!important;right:4%!important;bottom:4%!important;display:flex!important;width:40%!important;height:38%!important;max-width:none!important;align-items:flex-end!important;justify-content:center!important;gap:3%!important;background:none!important;color:transparent!important;pointer-events:none!important;filter:drop-shadow(0 3px 3px #000)}
.sector-buildings.np-sector-building-art img{display:block!important;width:100%!important;height:100%!important;min-width:0!important;max-width:none!important;object-fit:contain!important;margin:0!important}.sector-buildings.np-sector-building-art[data-np-building-level^="2:"]{width:68%!important}.sector-buildings.np-sector-building-art[data-np-building-level^="2:"] img{width:48%!important}.sector-buildings.np-sector-building-art[data-np-building-level^="3:"]{right:2%!important;width:96%!important}.sector-buildings.np-sector-building-art[data-np-building-level^="3:"] img{width:31%!important}.sector-buildings.np-sector-building-art[data-np-building-level^="4:"]{right:4%!important;width:72%!important;height:52%!important}.sector-buildings.np-sector-building-art[data-np-building-level^="4:"] img{width:100%!important}
.sector-buildings.np-sector-building-art:before{content:"";position:absolute;z-index:-1;inset:-12%;border-radius:50%;background:radial-gradient(circle,#f5c35c70 0,#d6822638 40%,transparent 72%);filter:blur(2px)}.sector-buildings .np-building-count{position:absolute;right:-5px;bottom:-4px;display:block!important;padding:2px 4px;border:1px solid #e4b45b;background:#190d08e8;color:#ffe5a9!important;font:900 8px/1 Literata,Georgia,serif!important;letter-spacing:.03em;white-space:nowrap}
.game-log-panel.np-visible-chronicle{display:flex!important;min-height:150px!important;visibility:visible!important;opacity:1!important;overflow:hidden!important}.game-log-panel.np-visible-chronicle .game-panel-heading{display:flex!important;visibility:visible!important;opacity:1!important}.game-log-panel.np-visible-chronicle .game-event-list{display:flex!important;min-height:90px!important;visibility:visible!important;opacity:1!important;color:#ead4aa!important}.game-log-panel.np-visible-chronicle .game-event{display:flex!important;visibility:visible!important;opacity:1!important}
.board-sector>.sector-owner.np-native-sector-rent{position:relative!important;z-index:64!important;display:flex!important;align-items:center!important;justify-content:center!important;gap:3px!important;width:86%!important;max-width:86%!important;min-height:14px!important;box-sizing:border-box!important;margin:3px 7% 0!important;padding:2px 4px!important;overflow:hidden!important;text-overflow:clip!important;border:1px solid #9d6a2f!important;border-inline-color:#6f431e!important;background:linear-gradient(180deg,#2b1b10f2,#120b07f4)!important;color:#e7c78c!important;box-shadow:0 2px 5px #000b,inset 0 1px #d3a15b35!important;font:800 clamp(11px,.43vw,12px)/1 Literata,Georgia,"Times New Roman",serif!important;letter-spacing:.025em!important;text-align:center!important;text-transform:uppercase!important;white-space:nowrap!important;pointer-events:none!important}.board-sector>.sector-owner.np-native-sector-rent>span,.board-sector>.sector-owner.np-native-sector-rent>b{display:block!important;min-width:0!important;overflow:hidden!important;text-overflow:clip!important;white-space:nowrap!important}.board-sector>.sector-owner.np-native-sector-rent>span{opacity:.78!important;font-size:.86em!important}.board-sector>.sector-owner.np-native-sector-rent>b{color:#ffe3a8!important;font-size:1.08em!important}

/* Full-size decisions without the extra beige plate or a full-screen black dimmer. */
.board-center>.merchant-full-card,.board-center>.surrender-choice{position:fixed!important;z-index:1450!important;inset:50% auto auto 50%!important;width:min(1320px,calc(100vw - 28px))!important;max-height:min(920px,calc(100dvh - 28px))!important;margin:0!important;padding:12px!important;box-sizing:border-box;overflow:auto!important;transform:translate(-50%,-50%)!important;border:0!important;background:transparent!important;box-shadow:none!important}
.board-center>.merchant-full-card .artifact-choice-card{width:min(1040px,100%)!important;max-width:none!important;min-height:390px!important;margin:auto!important}.board-center>.surrender-choice .surrender-grid{display:grid!important;width:min(1320px,100%)!important;margin:auto!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:16px!important;max-height:none!important;overflow:visible!important}.board-center>.surrender-choice .artifact-choice-card{position:relative!important;width:100%!important;min-height:286px!important;max-width:none!important;aspect-ratio:2.15/1!important;padding:2.8rem 3.4rem!important;grid-template-columns:minmax(190px,43%) minmax(0,1fr)!important}
.artifact-choice-card .artifact-choice-copy strong{font-size:clamp(22px,2vw,32px)!important;line-height:1.05!important}.artifact-choice-card .artifact-choice-copy p{font-size:15px!important;line-height:1.35!important}.artifact-choice-card .artifact-choice-visual,.artifact-inspector .inspector-art,.artifact-reward-inspector .inspector-art{background:transparent!important;box-shadow:none!important}
.np-artifact-origin-badge{position:absolute;z-index:4;top:27px;left:50%;padding:7px 13px;border:1px solid #ba8a48;background:#26150de8;color:#efd9af;font:900 13px/1 Literata,Georgia,"Times New Roman",serif;letter-spacing:.13em;transform:translateX(-50%);box-shadow:0 3px 12px #0009}.np-artifact-origin-badge.is-new{border-color:#f0c761;background:#684018;color:#fff2c5;box-shadow:0 0 18px #e9a93366}
.np-merchant-slot-warning{display:flex;width:min(1040px,100%);box-sizing:border-box;align-items:center;justify-content:center;gap:10px;margin:8px auto 6px;padding:8px 14px;border:1px solid #d59c46;background:linear-gradient(90deg,#4d2b12e8,#1b0e08e8);box-shadow:0 0 18px #d88d2c44;text-align:center}.np-merchant-slot-warning strong{color:#ffd77b!important;font:900 11px/1.2 Literata,Georgia,"Times New Roman",serif!important;text-transform:uppercase}.np-merchant-slot-warning span{color:#f3dfbb;font:700 12px/1.3 Literata,Georgia,"Times New Roman",serif}
.np-merchant-buy-error{width:min(760px,calc(100% - 28px));box-sizing:border-box;margin:8px auto;padding:10px 14px;border:1px solid #d34e37;background:#38130ee8;color:#ffd7c9;font:800 12px/1.35 Literata,Georgia,"Times New Roman",serif;text-align:center;box-shadow:0 0 16px #b42f2144}
.trade-launcher{position:fixed!important;z-index:960!important;right:clamp(18px,3vw,52px)!important;bottom:74px!important;display:flex!important;visibility:visible!important;opacity:1!important}

/* Economy actions also live on the large card opened from the bottom bar. */
.np-inspector-economy-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px;padding-top:14px;border-top:1px solid #8f642d88}.np-inspector-economy-actions button{min-height:42px;padding:10px 18px;border:1px solid #bf873d;background:linear-gradient(#664424,#392014);color:#ffe8b9;font:800 11px Literata,Georgia,"Times New Roman",serif;letter-spacing:.06em}.np-inspector-economy-actions button:hover{filter:brightness(1.22)}.np-inspector-economy-actions button.danger{border-color:#a54234;background:#5b201b;color:#ffd5c8}

@media(max-width:900px){
  .table-communication.open{position:fixed!important;z-index:1200!important;inset:0!important;display:block!important;width:100vw!important;height:100dvh!important;max-width:none!important;margin:0!important;padding:0!important;background:#080504f7!important;backdrop-filter:blur(7px)!important}
  .table-communication .communication-panel{display:grid!important;width:100%!important;height:100%!important;max-height:none!important;border-radius:0!important;grid-template-rows:auto auto minmax(0,1fr) auto auto!important}.table-communication .table-chat-log{min-height:0!important;max-height:none!important;height:auto!important;overflow:auto!important;padding:10px!important}.table-communication .communication-panel>header{padding-top:max(12px,env(safe-area-inset-top))!important}.table-communication .communication-panel>form{padding-bottom:max(10px,env(safe-area-inset-bottom))!important}.quick-chat-phrases{grid-template-columns:repeat(2,minmax(0,1fr))!important;max-height:180px!important}
  .np-quick-message-stack{top:max(56px,env(safe-area-inset-top));width:calc(100vw - 10px)}.np-quick-message-toast{width:100%;min-height:0;aspect-ratio:3/1;padding:22px calc(var(--np-chat-pad,22px) + 34px) 34px}.np-quick-message-toast b{font-size:13px}.np-quick-message-toast span{margin-top:2px;font-size:14px}
  .sector-buildings.np-sector-building-art{height:34%!important}
  .board-center>.merchant-full-card,.board-center>.surrender-choice{inset:0!important;width:100vw!important;max-height:100dvh!important;height:100dvh!important;border-radius:0!important;transform:none!important;padding:max(10px,env(safe-area-inset-top)) 8px max(18px,env(safe-area-inset-bottom))!important}.board-center>.surrender-choice .surrender-grid{grid-template-columns:1fr!important;gap:12px!important}.board-center>.surrender-choice .artifact-choice-card,.board-center>.merchant-full-card .artifact-choice-card{min-height:300px!important;aspect-ratio:auto!important;padding:2.8rem 3.4rem!important;grid-template-columns:1fr!important}.trade-launcher{right:12px!important;bottom:max(66px,calc(env(safe-area-inset-bottom) + 58px))!important}
}

/* === НАДСТРОЙКА: patches.mjs === */

/*
 * 1. Плавающая кнопка «Обмены» убрана — но ТОЛЬКО на десктопе.
 *
 * Нижняя панель действий скрыта правилом
 *     .game-action-dock { display:none } @media (max-width:1180px)
 * то есть на планшете и телефоне её нет вовсе. Там плавающая кнопка —
 * единственный путь к обменам, и безусловное её скрытие отрезало бы
 * обмены на всех экранах уже 1180px.
 *
 * Поэтому убираем её там, где есть нижняя панель. Её кнопка «Обмен»
 * шлёт событие napoleya:open-trade и открывает то же окно — слушатель
 * есть в бандле. Теряется только счётчик предложений на плавающей
 * кнопке; всплывающее уведомление о новом предложении остаётся.
 */
@media (min-width: 1181px) {
  .trade-launcher { display: none !important; }
}

/*
 * 2. Сначала кубики останавливаются, потом едет фишка.
 *
 * У .moving-board-token не было transition вообще: в исходнике движение
 * делала framer-motion, а в собранном бандле остались голые inline-стили
 * left/top. Из-за этого фишка телепортировалась в момент ответа сервера —
 * пока кубики ещё крутились.
 *
 * Бюджет задан сервером: lockAnimation('travel_roll', 2200) блокирует
 * действия на 2200 мс. Укладываемся с запасом:
 *   0 → ~1100 мс  кубики крутятся и доводятся (npDiceSkinSettleV4 .66s)
 *   1150 мс       трогается фишка
 *   1150 + 800 = 1950 мс  фишка на месте
 *   2200 мс       блокировка снимается
 *
 * Позицию фишки не трогает ни один JS-аддон: token-war-v1.js только
 * переключает классы прыжка и полёта, поэтому конфликта нет — эти
 * анимации теперь играют во время движения, а не до него.
 */
.moving-board-token:not(.np-3d-token) {
  transition:
    left .72s cubic-bezier(.22, 1, .36, 1),
    top  .72s cubic-bezier(.22, 1, .36, 1) !important;
}

/* Уважаем системную настройку «меньше движения»: без задержки и анимации. */
@media (prefers-reduced-motion: reduce) {
  .moving-board-token { transition: none !important; }
}

/*
 * 3. Телефон: доска перестаёт быть кривой.
 *
 * Замерено на стенде при 375×812: доска выходила 353×490 вместо квадрата,
 * средняя клетка — 21×73. Причина не в сетке, а в содержимом: у клетки
 * есть название и цена, они задают минимальную высоту строки, строки
 * распирают сетку, и объявленный aspect-ratio:1/1 перестаёт работать.
 *
 * Разрешаем строкам сжиматься и убираем подписи, которые на клетке
 * шириной 21px всё равно нечитаемы. Остаются цветная полоса группы,
 * номер и арт — их достаточно, чтобы ориентироваться; подробности
 * открываются нажатием на клетку, это уже работает в бандле.
 *
 * После правки: доска 353×353, угловая клетка 50×50, боковая 21×50
 * (узкая и глубокая — так и должно быть у доски такого типа).
 *
 * Планшет не трогаем: при 768px доска уже квадратная, 630×630, клетка
 * 41×96, подписи 11.2px не обрезаются.
 */
@media (max-width: 760px) {
  .game-board { min-height: 0 !important; }

  .board-sector {
    min-height: 0 !important;
    overflow: hidden !important;
    padding: 0 !important;
  }

  .board-sector > strong,
  .board-sector > small { display: none !important; }

  .sector-number {
    top: 1px !important;
    left: 2px !important;
    opacity: .85 !important;
    font-size: 9px !important;
  }

  .sector-group-band { height: 22% !important; }
}

/*
 * 4. Окно обмена: содержимое считало высоту от экрана, а не от окна.
 *
 * Корень проблемы:
 *     .trade-modal        { max-height: min(820px, 94vh); overflow: hidden }
 *     .trade-modal-content{ max-height: calc(94vh - 82px); overflow: auto }
 *
 * Внутренняя высота бралась от окна браузера, внешняя — ограничена 820px.
 * На высоком экране содержимое оказывалось выше самого окна, и низ срезался
 * навсегда: никакой прокруткой его было не достать, потому что прокручивалась
 * внутренняя область, а обрезало внешнее окно.
 *
 * Чем выше экран, тем хуже — поэтому на ноутбуках дефект не замечали:
 *
 *     высота экрана 1400 → срезалось 499px
 *                   1099 → срезалось 216px
 *                    950 → срезалось  76px
 *                    820 → срезалось   3px
 *
 * Замерено на стенде при 1453×1099: содержимое 951px внутри окна 820px,
 * кнопка «Предложить обмен» на 77px ниже дна окна. После правки содержимое
 * 735px — ровно по месту в окне, кнопка внутри, списки прокручиваются
 * (1575px против 735px), то есть всё имущество доступно.
 *
 * Решение: окно становится колонкой, содержимое занимает оставшуюся высоту.
 * min-height:0 обязателен, иначе flex-элемент не даст себя сжать и всё
 * вернётся к переполнению.
 */
.trade-modal {
  display: flex;
  flex-direction: column;
}

.trade-modal-content {
  max-height: none !important;
  flex: 1 1 auto;
  min-height: 0;
}

/*
 * И кнопку закрепляем внизу области прокрутки, чтобы при длинных списках
 * до неё не приходилось доскроллить. Подложка-градиент нужна, чтобы под
 * кнопкой не просвечивал список.
 */
.trade-submit {
  position: sticky;
  bottom: 0;
  z-index: 3;
  margin-top: .6rem;
  padding: .5rem 0;
  background: linear-gradient(180deg, transparent, #d8b880 28%, #d8b880);
}

/*
 * 5. Телефон в портретной ориентации: просим повернуть. На всём сайте.
 *
 * На доску 11×11 в портрете приходится 353px ширины — боковая клетка
 * выходит 21px. В альбомной ориентации доска считается от высоты экрана
 * и получается почти вдвое крупнее (692px против 367px), поэтому поворот
 * решает большую часть проблем сам по себе.
 *
 * Открыть игру сразу в горизонте нельзя: блокировка ориентации
 * (screen.orientation.lock) работает только в полноэкранном режиме и не
 * поддерживается Safari на iPhone. Поэтому просим повернуть.
 *
 * Висит на body::before — свободен, ни одно правило проекта его не
 * занимает, и React в псевдоэлементы не вмешивается.
 *
 * Только телефоны: планшет в портрете (768px) уже нормален — доска
 * 630×630, подписи не обрезаются.
 *
 * ВАЖНО: экран нельзя закрыть. У игрока с включённой блокировкой
 * поворота сайт окажется недоступен целиком. Если это риск — нужна
 * кнопка «всё равно продолжить», а это уже JavaScript.
 */
@media (orientation: portrait) and (max-width: 760px) {
  body::before {
    content: "⟳\A Поверните телефон горизонтально —\A так игра поместится на экран";
    position: fixed;
    inset: 0;
    z-index: 2000;
    display: grid;
    place-items: center;
    padding: 2rem;
    color: #f0d9ad;
    background: #17120f;
    text-align: center;
    white-space: pre-line;
    line-height: 1.7;
    font: 700 1.05rem Literata, Georgia, "Times New Roman", serif;
  }
}

/*
 * 7. Альбомная ориентация: доска считается от ВЫСОТЫ, колонка встаёт сбоку.
 *
 * Корень проблемы: до 1180px макет одноколоночный, а ширина доски берётся
 * от ширины экрана — min(82vw, 800px). В альбомной ориентации ширины много,
 * а высоты мало, и доска вылезала далеко за экран:
 *
 *     телефон  844×390  → доска 692×713, страница 1317px
 *     планшет 1024×768  → доска 800×800, вылезала на 121px
 *
 * Летопись и чат при этом уезжали ПОД доску, хотя справа было пусто.
 *
 * Считаем доску от доступной высоты (за вычетом верхней панели 82px и
 * зазоров) и ставим колонку рядом. Замерено после правки:
 *
 *     телефон  844×390  → доска 286×286, колонка 308×294, прокрутки нет
 *     планшет 1024×768  → доска 595×595, колонка 365×94,  прокрутки нет
 *
 * Десктоп не затронут: правило действует только до 1180px, где раньше
 * работала одноколоночная схема.
 */
@media (orientation: landscape) and (max-width: 1180px) {
  .game-layout {
    display: grid !important;
    grid-template-columns: minmax(0, 1fr) minmax(232px, .6fr) !important;
    height: auto !important;
    align-items: start !important;
    gap: 10px !important;
  }

  .board-shell { flex-direction: row !important; }

  .game-board {
    width: min(100%, calc(100dvh - 104px)) !important;
    max-width: none !important;
    height: auto !important;
  }

  .game-sidebar {
    grid-template-columns: 1fr !important;
    max-height: calc(100dvh - 96px) !important;
    overflow: auto !important;
  }
}

/*
 * Телефон в альбомной: доска выходит 286px, боковая клетка — 16px.
 * Подписи там нечитаемы, как и в портрете, поэтому убираем их и здесь.
 * Ориентируемся по цветной полосе группы и номеру; подробности —
 * нажатием на клетку.
 *
 * Отдельный запрос по ВЫСОТЕ, а не по ширине: альбомный телефон это
 * 844px ширины, под правило max-width:760px он не попадает.
 */
@media (orientation: landscape) and (max-height: 520px) {
  .game-board { min-height: 0 !important; }

  .board-sector {
    min-height: 0 !important;
    overflow: hidden !important;
    padding: 0 !important;
  }

  .board-sector > strong,
  .board-sector > small { display: none !important; }

  .sector-number {
    top: 1px !important;
    left: 2px !important;
    font-size: 9px !important;
  }
}

/*
 * 9. Десктоп: поле ввода чата срезалось при длинной летописи.
 *
 * Замер с живой партии (спасибо за консоль):
 *     колонка   строки грида: 49px / 674px / 340px
 *     панель    330x390, нужно 388 — внутри себя помещается
 *     дети      HEADER 72, voice 38, chat-log 212, FORM 40
 *
 * То есть режет не панель, а колонка. Летопись в строке auto разрослась
 * до 674px (у игрока десятки записей «Ход пропущен»), чату осталось 340,
 * а панель по содержимому занимает 390. Лишние 50px уходят под
 * overflow:hidden колонки — и это ровно последний ребёнок, форма ввода.
 *
 * Лечим так, чтобы поле ввода не резалось НИКОГДА: панель садится точно
 * в свою строку (height:100% + min-height:0), а разницу забирает лог
 * сообщений — он и должен сжиматься, у него своя прокрутка.
 *
 * min-height:56px оставляет логу читаемый минимум: даже в самой тесной
 * колонке видно последнее сообщение.
 */
@media (min-width: 1181px) {
  .game-sidebar .communication-panel {
    display: flex !important;
    flex-direction: column !important;
    height: 100% !important;
    min-height: 0 !important;
    max-height: 100% !important;
  }

  /* Шапка, голос, быстрые фразы и форма держат свою высоту. */
  .game-sidebar .communication-panel > * { flex: 0 0 auto !important; }

  /* Сжимается только лог сообщений. */
  .game-sidebar .communication-panel > .table-chat-log {
    flex: 1 1 auto !important;
    min-height: 56px !important;
    height: auto !important;
    max-height: none !important;
    overflow: auto !important;
  }
}

/*
 * 8. Цели нажатия на узких экранах.
 *
 * Ползунки громкости в настройках были 309×16 — шестнадцать пикселей
 * высоты, пальцем не ухватить. Кнопки «Назад» и «Главное меню» — 42px,
 * на два меньше рекомендованных.
 *
 * Условие по ширине, а не по (pointer: coarse): ширину видно и можно
 * проверить замером, а более высокий ползунок мышке не мешает.
 *
 * Замерено: ползунки 309×44, кнопки 44px, elementFromPoint попадает
 * в сам ползунок — ничем не перекрыт.
 */
@media (max-width: 1180px) {
  input[type="range"] { min-height: 44px !important; }
  .np-static-topbar button { min-height: 44px !important; }
}

/*
 * 6. Телефон: чат на весь экран невозможно было закрыть.
 *
 * На ширине до 900px .table-communication.open разворачивается во весь
 * экран (position:fixed; inset:0). Но правило не сбрасывает позиционирование
 * самой панели, оставшееся от десктопной всплывашки, и панель уезжает вверх.
 *
 * Замерено на стенде при 390×844:
 *     панель   top: -66   (начинается выше экрана)
 *     крестик  top: -40, bottom: -7   — целиком за верхней границей
 *
 * Кнопку закрытия физически нельзя было нажать: она находилась над экраном.
 *
 * Панель ставим в поток контейнера, кнопку-конверт при открытом чате прячем
 * (во весь экран она бессмысленна и занимала 52px сверху, сдвигая панель).
 *
 * После правки: панель 390×844 от top:0, крестик в экране, elementFromPoint
 * попадает именно в него — ничем не перекрыт.
 */
@media (max-width: 900px) {
  .table-communication.open {
    display: grid !important;
    grid-template-rows: 100% !important;
    align-items: stretch !important;
    justify-items: stretch !important;
  }

  .table-communication.open > .communication-toggle { display: none !important; }

  .table-communication.open .communication-panel {
    position: static !important;
    inset: auto !important;
    top: auto !important;
    right: auto !important;
    bottom: auto !important;
    left: auto !important;
    transform: none !important;
    margin: 0 !important;
    width: 100% !important;
    height: 100% !important;
    max-height: none !important;
  }

  /* Крестик был 13×34 — меньше рекомендованных 44px для пальца. */
  .table-communication.open .communication-panel > header > button {
    display: grid !important;
    place-items: center !important;
    min-width: 44px !important;
    min-height: 44px !important;
    margin: -6px -6px -6px 0 !important;
    font-size: 1.35rem !important;
  }
}
.np-live-table-player-card{position:relative!important;isolation:isolate;overflow:hidden!important}
.np-game-player-card-art{position:absolute!important;inset:0!important;z-index:-2!important;width:100%!important;height:100%!important;object-fit:cover!important;opacity:.34!important;filter:saturate(.75) brightness(.58)!important;pointer-events:none}
.np-live-table-player-card:has(>.np-game-player-card-art):after{position:absolute;inset:0;z-index:-1;content:"";background:linear-gradient(90deg,#100905d9,#1009058c 55%,#100905c9);pointer-events:none}
.np-live-table-player-card .table-player-token{position:relative;overflow:visible!important}
.np-game-player-avatar{position:absolute!important;inset:2px!important;z-index:1!important;width:calc(100% - 4px)!important;height:calc(100% - 4px)!important;max-width:none!important;border-radius:50%!important;object-fit:cover!important;pointer-events:none}
.np-game-player-frame{position:absolute!important;top:50%!important;left:50%!important;z-index:2!important;width:170%!important;height:170%!important;max-width:none!important;object-fit:contain!important;transform:translate(-50%,-50%)!important;pointer-events:none}
.np-game-name-style{position:relative;z-index:1;min-width:82px;padding:.22rem .65rem!important;text-align:center;text-shadow:0 1px 3px #000}
.np-game-name-style:before{position:absolute;inset:-.25rem -.45rem;z-index:-1;content:"";background-image:var(--np-name-art);background-size:100% 100%;background-repeat:no-repeat;pointer-events:none}
.np-game-player-title{display:block!important;max-width:110px;margin-left:auto;color:#d5a755!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;font-size:.42rem!important}

/* === НАДСТРОЙКА: party-fix.mjs === */

/*
 * Свои подписи лежат отдельным слоем поверх родных узлов React: удалять их
 * нельзя, иначе React падает при закрытии экрана партии. Родные прячем.
 */
.board-sector > .sector-owner.np-native-sector-rent {
  color: transparent !important;
}

.board-sector > .sector-owner.np-native-sector-rent > .np-rent-copy {
  position: absolute !important;
  inset: 0 !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  gap: 3px !important;
  overflow: hidden !important;
  color: #e7c78c !important;
  font-style: normal !important;
}

.board-sector > .sector-owner.np-native-sector-rent > .np-rent-copy > span {
  display: block !important;
  overflow: hidden !important;
  opacity: .78 !important;
  font-size: .86em !important;
  white-space: nowrap !important;
}

.board-sector > .sector-owner.np-native-sector-rent > .np-rent-copy > b {
  display: block !important;
  overflow: hidden !important;
  color: #ffe3a8 !important;
  font-size: 1.08em !important;
  white-space: nowrap !important;
}

.inspector-art.np-reward-art {
  position: relative !important;
}

/* Родная картинка остаётся в дереве — её место занимает наш слой. */
.inspector-art.np-reward-art > :not(.np-reward-media) {
  visibility: hidden !important;
}

.inspector-art.np-reward-art > .np-reward-media {
  position: absolute !important;
  inset: 0 !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
}

/*
 * Летопись и имущество наезжали друг на друга при открытой панели песочницы.
 *
 * У сайта на этот случай своя раскладка сайдбара:
 *   .game-sidebar:has(.test-console) { grid-template-rows: auto auto auto minmax(0,1fr) }
 * а надстройка (12) задаёт всего два ряда и с !important:
 *   @media (min-width:901px) .game-sidebar { grid-template-rows: auto minmax(0,1fr) !important }
 *
 * Четыре блока в сетке на два ряда — панели и налезали. Замерено стендом:
 * имущество и летопись перекрывались на 15px, без песочницы наложений нет.
 *
 * Возвращаем четыре ряда, но остаток делим между летописью и чатом: если
 * отдать летописи auto, она съедает всё и чат схлопывается в ноль.
 */
@media (min-width: 901px) {
  .game-sidebar:has(.test-console) {
    grid-template-rows: auto auto minmax(140px, 1fr) minmax(140px, 1fr) !important;
    overflow: auto !important;
  }
}

/*
 * Запись летописи сайт рисует сеткой из двух колонок — значок и текст:
 *   .game-event { display: grid; grid-template-columns: 24px 1fr }
 * Надстройка (12) переводила её в flex, и значок с текстом слипались.
 */
.game-log-panel.np-visible-chronicle .game-event {
  display: grid !important;
  grid-template-columns: 24px 1fr !important;
  align-items: start !important;
  gap: .35rem !important;
  min-width: 0 !important;
  padding-left: .35rem !important;
}

.game-log-panel.np-visible-chronicle .game-event > * {
  min-width: 0 !important;
}

.game-log-panel.np-visible-chronicle .game-event > :not(.event-icon):not(.game-event-icon) {
  grid-column: 2 !important;
  overflow-wrap: anywhere !important;
}

.game-log-panel.np-visible-chronicle .game-event .event-player-name {
  position: static !important;
  display: block !important;
  width: auto !important;
  margin: 0 0 .12rem !important;
  padding: 0 !important;
  line-height: 1.1 !important;
}

.game-log-panel.np-visible-chronicle .game-event .event-icon,
.game-log-panel.np-visible-chronicle .game-event .game-event-icon {
  position: relative !important;
  grid-column: 1 !important;
  grid-row: 1 / span 8 !important;
  width: 24px !important;
  height: 24px !important;
  min-width: 24px !important;
  margin: 0 !important;
  overflow: visible !important;
}

/*
 * Карточка игрока: слоты артефактов не помещались в жёсткие 82px и вылезали
 * за нижний край. Высоту отпускаем, ширину даём больше на широких экранах —
 * дорожки и так ограничены шириной шапки, на узких ничего не изменится.
 */
.game-player-header.table-player-ring {
  grid-template-columns: repeat(3, minmax(150px, 240px)) 158px repeat(3, minmax(150px, 240px)) !important;
}

.game-player-header .table-player-card,
.game-player-header .table-player-card:nth-child(n) {
  height: auto !important;
  min-height: 82px !important;
}

.inspector-art.np-reward-art > .np-reward-media > img {
  width: 100% !important;
  height: 100% !important;
  object-fit: cover !important;
}

/* Сезонные знаки и медали внутри карточек участников партии. */
.np-game-season-marks {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  gap: 2px !important;
  margin-left: 3px !important;
  vertical-align: middle !important;
}

.np-game-season-mark {
  display: grid !important;
  width: 16px !important;
  height: 16px !important;
  place-items: center !important;
  object-fit: contain !important;
  color: #e7b957 !important;
  font-size: 10px !important;
  filter: drop-shadow(0 1px 2px #000) !important;
}

/* Аура активного игрока остаётся внутри карточки и не ловит клики. */
.np-live-table-player-card.np-current-turn-aura {
  box-shadow: inset 0 0 0 1px var(--np-turn-aura-accent,#d7aa51),0 0 14px color-mix(in srgb,var(--np-turn-aura-accent,#d7aa51) 58%,transparent) !important;
}

.np-game-turn-aura-art {
  position: absolute !important;
  inset: 0 !important;
  z-index: 3 !important;
  width: 100% !important;
  height: 100% !important;
  object-fit: fill !important;
  opacity: .8 !important;
  pointer-events: none !important;
}

/* Оформление карточек артефактов: только декоративная рамка, без подложки. */
.np-artifact-cosmetic {
  position: relative !important;
  isolation: isolate !important;
  outline: 1px solid color-mix(in srgb,var(--np-artifact-style-accent,#b67b31) 72%,transparent) !important;
  outline-offset: -4px !important;
}

.np-artifact-cosmetic:before {
  position: absolute !important;
  inset: 0 !important;
  z-index: 8 !important;
  content: "" !important;
  background-image: var(--np-artifact-style-art) !important;
  background-position: center !important;
  background-size: 100% 100% !important;
  background-repeat: no-repeat !important;
  pointer-events: none !important;
}

/* След фишки работает и с картинкой, и только с выбранным цветом. */
.np-movement-trail {
  filter: drop-shadow(0 0 5px var(--np-movement-trail-accent,#d7aa51)) !important;
}

.np-movement-trail:after {
  position: absolute !important;
  inset: 58% 8% -30% !important;
  z-index: -1 !important;
  content: "" !important;
  background-image: var(--np-movement-trail-art) !important;
  background-position: center !important;
  background-size: contain !important;
  background-repeat: no-repeat !important;
  opacity: .78 !important;
  pointer-events: none !important;
}

/* Короткие игровые эффекты: загрузка, покупка, победа и поражение. */
.np-game-cosmetic-overlay {
  position: fixed !important;
  top: 50% !important;
  left: 50% !important;
  z-index: 10080 !important;
  display: grid !important;
  grid-template-columns: minmax(72px,132px) minmax(180px,340px) !important;
  align-items: center !important;
  gap: clamp(12px,2vw,28px) !important;
  width: min(620px,calc(100vw - 32px)) !important;
  min-height: 142px !important;
  padding: clamp(18px,3vw,34px) !important;
  border: 1px solid var(--np-effect-accent,#bd843c) !important;
  background: linear-gradient(115deg,rgba(15,8,5,.97),rgba(42,22,12,.95)) !important;
  box-shadow: 0 22px 80px #000, inset 0 0 35px color-mix(in srgb,var(--np-effect-accent,#bd843c) 20%,transparent) !important;
  color: #f2ddb7 !important;
  opacity: 0 !important;
  transform: translate(-50%,-44%) scale(.96) !important;
  transition: opacity .35s ease,transform .35s ease !important;
  pointer-events: none !important;
}

.np-game-cosmetic-overlay.show {
  opacity: 1 !important;
  transform: translate(-50%,-50%) scale(1) !important;
}

.np-game-cosmetic-overlay img {
  width: 100% !important;
  max-height: 132px !important;
  object-fit: contain !important;
  filter: drop-shadow(0 5px 12px #000) !important;
}

.np-game-cosmetic-overlay div {
  display: grid !important;
  gap: 6px !important;
  min-width: 0 !important;
}

.np-game-cosmetic-overlay small {
  color: var(--np-effect-accent,#d7aa51) !important;
  font-size: .7rem !important;
  font-weight: 800 !important;
  letter-spacing: .16em !important;
}

.np-game-cosmetic-overlay strong {
  overflow-wrap: anywhere !important;
  font-family: Georgia,serif !important;
  font-size: clamp(1.45rem,3vw,2.3rem) !important;
  line-height: 1.05 !important;
}

.np-game-cosmetic-overlay.is-victory { --np-effect-accent:#f0c34f; }
.np-game-cosmetic-overlay.is-defeat { filter: grayscale(.38); }

@media (max-width: 600px) {
  .np-game-cosmetic-overlay {
    grid-template-columns: 76px minmax(0,1fr) !important;
    min-height: 108px !important;
    padding: 16px !important;
  }
  .np-game-cosmetic-overlay img { max-height: 82px !important; }
}
