/* === ДИЗАЙН-СИСТЕМА + ЕДИНЫЙ ХЕДЕР/ФУТЕР + карточка заведения (из макетов allcafe/code) ===
   Единый кэшируемый файл (ТЗ §4б). Постраничный CSS — в {% block page_css %} (небольшой инлайн). */
/* SELF-HOSTED FONTS (Manrope body / Newsreader display) — woff2 в /public/fonts, без render-block Google.
   Variable (один файл на сабсет покрывает все веса), font-display:swap. Newsreader без кириллицы → сериф-фолбэк (как и раньше). */
@font-face{font-family:'Manrope';font-style:normal;font-weight:300 800;font-display:swap;src:url(/fonts/manrope-cyrillic-ext.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}
@font-face{font-family:'Manrope';font-style:normal;font-weight:300 800;font-display:swap;src:url(/fonts/manrope-cyrillic.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Manrope';font-style:normal;font-weight:300 800;font-display:swap;src:url(/fonts/manrope-greek.woff2) format('woff2');unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}
@font-face{font-family:'Manrope';font-style:normal;font-weight:300 800;font-display:swap;src:url(/fonts/manrope-vietnamese.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}
@font-face{font-family:'Manrope';font-style:normal;font-weight:300 800;font-display:swap;src:url(/fonts/manrope-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'Manrope';font-style:normal;font-weight:300 800;font-display:swap;src:url(/fonts/manrope-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Newsreader';font-style:normal;font-weight:300 700;font-display:swap;src:url(/fonts/newsreader-vietnamese.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}
@font-face{font-family:'Newsreader';font-style:normal;font-weight:300 700;font-display:swap;src:url(/fonts/newsreader-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'Newsreader';font-style:normal;font-weight:300 700;font-display:swap;src:url(/fonts/newsreader-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
:root{--bg:#fcfcfa;--bg-soft:#f5f3ee;--bg-card:#fff;--bg-dark:#1c1c1a;--text:#1c1c1a;--text-2:#5a5a55;--muted:#9c9c95;--border:#e8e5dd;--accent:#c84426;--accent-soft:#fbeee9;--ok:#3a7d3a;--gold:#e0b84a;--goldbg:#fdf8e7;--goldline:#e4cf8e;--star-empty:#8f8878;--star-fill:#c4a14a;--r-sm:8px;--r-md:12px;--r-lg:16px;--r-xl:20px}
[data-theme=dark]{--bg:#141413;--bg-soft:#1c1c1a;--bg-card:#1c1c1a;--text:#f0ede4;--text-2:#b8b3a5;--muted:#6e6a5e;--border:#2a2a25;--accent:#e85a3c;--accent-soft:#2a1a14;--ok:#7ad17a;--goldbg:#2a2415;--goldline:#5c4c1e;--star-empty:#8a8474;--star-fill:#d4ad52}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Manrope',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.5;-webkit-font-smoothing:antialiased}
input[type=checkbox]{accent-color:var(--accent)} /* №314.1: галки форм в цвет сайта (кухни-пилюли, «закрыто», согласия) */
a{text-decoration:none;color:inherit}
.container{max-width:1280px;margin:0 auto;padding:0 32px}
.header{border-bottom:1px solid var(--border);background:var(--bg);position:sticky;top:0;z-index:50}
.header-top{display:flex;justify-content:space-between;align-items:center;padding:14px 0;font-size:13px;color:var(--text-2)}
.header-top a{margin-right:18px;cursor:pointer}
.add-place-link{color:var(--accent)!important;font-weight:600}
.htr{display:flex;align-items:center;gap:14px}
.city-badge{font-size:13px;color:var(--text);font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border-radius:var(--r-sm);border:1px solid var(--border);background:var(--bg-card)}
.city-badge::before{content:"📍";font-size:11px}
.city-badge::after{content:"▾";font-size:9px;color:var(--muted)}
.theme-toggle{background:var(--bg-card);border:1px solid var(--border);border-radius:50%;width:34px;height:34px;display:inline-grid;place-items:center;cursor:pointer;font-size:14px;color:var(--text)}
.lang-switch{display:inline-flex;gap:2px;background:var(--bg-card);border:1px solid var(--border);border-radius:99px;padding:2px}
.lang-switch a{padding:4px 10px;border-radius:99px;font-size:12px;font-weight:600;color:var(--muted);margin:0;cursor:pointer}
.lang-switch a.active{background:var(--text);color:var(--bg)}
.header-main{display:flex;justify-content:space-between;align-items:center;padding:16px 0 20px;border-top:1px solid var(--border);gap:24px}
.logo-block{display:flex;flex-direction:column;line-height:1}
.logo{font-family:'Newsreader',serif;font-weight:600;font-size:30px;letter-spacing:-.03em;color:var(--text)}
.logo-tag{font-size:11px;font-weight:500;color:var(--muted);text-transform:uppercase;letter-spacing:.12em;line-height:1.5;margin-top:-3px} /* №275: подписи на 2px ниже (-5px→-3px) */
.logo-tag+.logo-tag{margin-top:-3px}
.header-nav{display:flex;gap:24px;font-size:15px;font-weight:500}
.header-nav a:hover{color:var(--accent)}
.header-right{display:flex;gap:10px;align-items:center}
.btn-icon{width:44px;height:44px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg-card);cursor:pointer;color:var(--text);font-size:20px}
.btn-icon.is-search{padding:0 16px;width:auto;gap:10px;font-size:14px;color:var(--muted);min-width:200px;justify-content:flex-start}
.btn-icon.is-search::before{content:"⌕";font-size:22px;color:var(--text)}
.btn-login{padding:11px 20px;border:1px solid var(--text);border-radius:var(--r-md);background:transparent;color:var(--text);font-weight:600;font-size:14px;cursor:pointer;font-family:inherit}
/* === №351.6: узкие экраны — шапка перестаёт распирать страницу. Замер при 375px: логотип 96
   + gap 24 + .header-right 245 (поиск 44 + ♡ 44 + «Войти» 83 + бургер 44, gap по 10) + поля 16/16
   → контенту нужно 382px, отсюда горизонтальный скролл: 375px даёт 9–16px переполнения,
   360px — 21px. Лечим ШИРИНУ, а не симптом: overflow-x:hidden на body/html запрещён — он прячет
   контент за краем и ломает position:sticky.
   Иконки 44→40, gap 10→6, «Войти» из шапки убираем: она уже есть в бургер-меню (.mnav-login),
   доступ к входу не теряется. Итог: .header-right = 40*3 + 6*2 = 132, строка = 16+96+24+132+16
   = 284 — влезает даже в 320px. === */
@media (max-width:400px){
 .header-right{gap:6px}
 .header-right .btn-icon,.header-right .nav-burger{width:40px;height:40px}
 .header-right .btn-login{display:none}
}
/* №354(А). Замер показал, что распирает НЕ .header-main (её ужали выше), а верхняя строка
   .header-top: слева «+ Добавить заведение» (161px, прочие ссылки скрыты с ≤600px), справа .htr
   (город + тема + RU/EN) — flex её не сжимает, содержимое неразрывное. Раньше перенос включался
   только с ≤400, поэтому оставалась полоса переполнения 601–803px (правый край держала .htr,
   упираясь в 804px). Порог поднят 400 → 830, с запасом за границу полосы. Ничего не прячем
   (CTA «Добавить заведение» и выбор города нужны оба) — .htr уходит на вторую строку и встаёт
   справа. overflow-x:hidden не используем: он прячет симптом, а не причину. */
@media (max-width:830px){
 .header-top{flex-wrap:wrap;row-gap:8px}
 .header-top>div:first-child{flex:1 1 auto}
 .htr{margin-left:auto}
}
/* №351.6: та же болезнь у заголовков секций — .section-link имеет white-space:nowrap, а строка
   space-between без переноса: на узком экране «Все рейтинги →» вылезала за край на 14px.
   Разрешаем перенос — ссылка уходит под заголовок. Стиль ссылки не трогаем. */
@media (max-width:700px){.section-head-row{flex-wrap:wrap}}
/* 26М: бургер-меню — раньше .header-nav на ≤900px просто скрывался без альтернативы */
.nav-burger{display:none;width:44px;height:44px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg-card);cursor:pointer;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:0;flex-shrink:0}
.nav-burger .nb-bar{display:block;width:18px;height:2px;background:var(--text);border-radius:2px;transition:transform .2s,opacity .2s}
.nav-burger[aria-expanded=true] .nb-bar:nth-child(1){transform:translateY(6px) rotate(45deg)}
.nav-burger[aria-expanded=true] .nb-bar:nth-child(2){opacity:0}
.nav-burger[aria-expanded=true] .nb-bar:nth-child(3){transform:translateY(-6px) rotate(-45deg)}
/* панель: fixed-оверлей под шапкой (top = --header-h из base.html.twig), НЕ в потоке — высоту шапки не меняет */
.mnav{position:fixed;top:var(--header-h,97px);left:0;right:0;bottom:0;z-index:90;background:rgba(20,20,18,.45);display:none}
.mnav.open{display:block}
.mnav-panel{background:var(--bg);border-bottom:1px solid var(--border);max-height:100%;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:14px 16px 22px;box-shadow:0 18px 30px rgba(0,0,0,.18)}
.mnav-city{display:flex;align-items:center;gap:8px;width:100%;padding:12px 14px;margin-bottom:8px;background:var(--bg-soft);border:1px solid var(--border);border-radius:var(--r-md);font-family:inherit;font-size:15px;font-weight:600;color:var(--text);cursor:pointer;text-align:left}
.mnav-city .mc-ch{margin-left:auto;font-size:12px;font-weight:600;color:var(--accent);white-space:nowrap}
.mnav-group{display:flex;flex-direction:column}
.mnav-group a{display:block;padding:13px 4px;font-size:16px;font-weight:600;color:var(--text);border-bottom:1px solid var(--border)}
.mnav-group a:hover,.mnav-group a:active{color:var(--accent)}
.mnav-sec{margin-top:8px}
.mnav-sec a{font-size:14px;font-weight:500;color:var(--text-2);padding:10px 4px;border-bottom:0}
.mnav-sec a.add-place-link{color:var(--accent);font-weight:600}
.mnav-login{display:block;width:100%;margin-top:12px;padding:13px 20px;border:1px solid var(--text);border-radius:var(--r-md);background:transparent;color:var(--text);font-weight:600;font-size:15px;cursor:pointer;font-family:inherit}
/* №354(Б2): парная граница к порогу бургера ниже — 1044/1045 без зазора. Выше 1045 меню в строку
   помещается, поэтому мобильную панель гасим. */
@media(min-width:1048px){.mnav{display:none!important}}
.footer{background:var(--bg-dark);color:#b8b3a5;padding:48px 0 28px}
.footer-grid{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:32px;margin-bottom:32px}
.footer h4{color:#fff;font-size:13px;text-transform:uppercase;letter-spacing:.08em;margin:0 0 14px;font-weight:600}
.footer ul{list-style:none}
.footer li{margin-bottom:9px;font-size:14px}
.footer li a:hover{color:#fff}
.footer-logo{font-family:'Newsreader',serif;font-size:26px;color:#fff;font-weight:600}
.footer-bottom{border-top:1px solid #2a2a25;padding-top:22px;font-size:12px;color:#6e6a5e;display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px}
.site-footer{background:var(--bg-dark);color:#c9c4b6;padding:34px 0 26px;font-size:13px;border-top:1px solid #2a2a25}
.site-footer a{color:#c9c4b6}.site-footer a:hover{color:#fff}
.sf-links{display:flex;flex-wrap:wrap;gap:8px 18px;margin-bottom:14px}
.sf-bottom{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;color:#8a857a;line-height:1.6}
.sf-age{border:1px solid #4a463d;border-radius:5px;padding:1px 6px;font-size:11px}
.cookie-bar{position:fixed;left:16px;right:16px;bottom:16px;z-index:9999;background:var(--bg-dark);color:#e8e4da;border:1px solid #3a352c;border-radius:14px;padding:16px 20px;display:none;align-items:center;gap:18px;box-shadow:0 12px 40px rgba(0,0,0,.35);max-width:920px;margin:0 auto}
.cookie-bar.show{display:flex}
.cookie-bar p{font-size:13.5px;line-height:1.55;color:#c9c4b6;margin:0;flex:1}
.cookie-bar button{flex:0 0 auto;background:var(--accent);color:#fff;border:none;border-radius:9px;padding:11px 22px;font-weight:700;font-size:14px;cursor:pointer;font-family:inherit}
/* №354(Б2). ВАЖНО: .footer-grid остаётся на пороге 900 — её ширина от шапки не зависит, переносить
   её вместе с шапочными селекторами нельзя (то же и для сеток карточек в блоках ≤900 ниже). */
@media(max-width:900px){.footer-grid{grid-template-columns:1fr 1fr}}
/* №354(Б2): порог бургера 900 → 1047 (в ТЗ было 1044, замер поправил: после сжатия
   кнопки поиска .header-right требует ровно 1048px, на 1045 меню уже показано, а места ещё нет). В полосе 901–1203px правый край держала .header-right,
   упираясь в 1204px (у залогиненного 1165) — меню в строку не помещалось. Парная граница —
   @media(min-width:1048px){.mnav…} выше, зазора между 1047 и 1048 нет. */
@media(max-width:1047px){.header-nav{display:none}.nav-burger{display:flex}}
/* №354(Б1): кнопка поиска сжимается до иконки во ВСЕЙ полосе переполнения, а не только с ≤600.
   Декларации те же, что в блоке ≤600 ниже (там оставлены — он перекрывает более узкий диапазон). */
@media(max-width:1204px){.btn-icon.is-search{min-width:0;width:44px;padding:0;justify-content:center;font-size:0}}
@media(max-width:600px){.container{padding:0 16px}.header-top a:not(.add-place-link){display:none}.logo-tag{display:none}.logo{font-size:24px}.btn-icon.is-search{min-width:0;width:44px;padding:0;justify-content:center;font-size:0}.footer-grid{grid-template-columns:1fr 1fr;gap:24px}.cookie-bar{flex-direction:column;align-items:stretch;text-align:left}.cookie-bar button{width:100%}}
/* === КОМПОНЕНТ: карточка заведения (каталог / главная города / рейтинги) === */
.places-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:22px}
.pcard{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;display:flex;flex-direction:column;transition:border-color .15s,transform .15s;position:relative}
.pcard:hover{border-color:var(--text);transform:translateY(-2px)}
.pcard-img{aspect-ratio:4/3;background:linear-gradient(135deg,#cdbfae,#8a7a64);position:relative;overflow:hidden}
.pcard:nth-child(3n) .pcard-img{background:linear-gradient(135deg,#a8b5b0,#5a6a64)}
.pcard:nth-child(3n+1) .pcard-img{background:linear-gradient(135deg,#c2a89a,#7a5a4a)}
.pcard-photo{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:1}
.pcard-rating{position:absolute;top:12px;left:12px;z-index:2;background:rgba(20,20,18,.78);color:#fff;font-family:'Newsreader',serif;font-size:14px;font-weight:500;padding:4px 10px;border-radius:99px;display:inline-flex;align-items:center;gap:4px}
.pcard-rating .star{color:var(--gold)}
.pcard-fav{position:absolute;top:10px;right:10px;z-index:3;width:34px;height:34px;border-radius:50%;background:rgba(255,255,255,.86);display:grid;place-items:center;cursor:pointer;font-size:17px;color:var(--text-2);transition:color .15s,background .15s}
.pcard-fav:hover{color:var(--accent);background:#fff}
.pcard-pkg{position:absolute;bottom:12px;left:12px;z-index:2;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:4px 9px;border-radius:99px}
.pcard-pkg.vip{background:linear-gradient(135deg,#e8c65e,#c79a2e);color:#3a2c00;box-shadow:0 1px 6px rgba(199,154,46,.45)}
.pcard-pkg.annual{background:rgba(20,20,18,.78);color:#fff}
.pcard-body{padding:16px 18px 18px;display:flex;flex-direction:column;gap:6px;flex:1}
.pcard-type{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--accent);font-weight:600;min-height:14px}
.pcard-name{font-family:'Newsreader',serif;font-size:21px;font-weight:500;letter-spacing:-.01em;line-height:1.1}
.pcard-cuis{font-size:13px;color:var(--text-2)}
.pcard-meta{margin-top:auto;padding-top:12px;display:flex;flex-direction:column;gap:5px;font-size:13px;color:var(--text-2)}
.pcard-meta .row{display:flex;align-items:center;gap:7px}
.pcard-meta .ic{color:var(--muted);width:15px;text-align:center;flex-shrink:0}
.pcard-bill{font-weight:600;color:var(--text)}
@media (max-width:1100px){.places-grid{grid-template-columns:repeat(3,1fr)}}
@media (max-width:900px){.places-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:600px){.places-grid{grid-template-columns:1fr 1fr;gap:14px}.pcard-name{font-size:18px}}
@media (max-width:420px){.places-grid{grid-template-columns:1fr}}

/* ===== Комментарии (обзор Бориса / новость) — общий компонент ===== */
.comments{border-top:1px solid var(--border);padding-top:30px;margin-top:36px}
.comments h2{font-family:'Newsreader',serif;font-weight:500;font-size:24px;letter-spacing:-.01em;margin:0 0 6px}
.comments .csub{font-size:13px;color:#5c5248;margin-bottom:22px}
[data-theme=dark] .comments .csub{color:#c9c4b6}
.cwrite{display:flex;gap:12px;margin-bottom:26px}
.cwrite .av{width:42px;height:42px;border-radius:50%;background:var(--bg-soft);display:grid;place-items:center;color:var(--muted);font-size:18px;flex-shrink:0}
.cwrite .cbox{flex:1}
.cwrite textarea{width:100%;border:1px solid var(--border);background:var(--bg-card);border-radius:var(--r-md);padding:12px 14px;font-family:inherit;font-size:14px;color:var(--text);resize:none;min-height:54px;outline:none}
.cwrite textarea:focus{border-color:var(--text)}
.cwrite .cnote{font-size:12px;color:#5c5248;margin-top:8px}
[data-theme=dark] .cwrite .cnote{color:#c9c4b6}
.cwrite .cnote a{color:var(--accent);font-weight:600;cursor:pointer}
/* №274.4: живая форма комментария — кнопка отправки (показывает whoami только авторизованным) + сообщение результата */
.cwrite .csend{margin-top:10px;background:var(--accent);color:#fff;border:0;border-radius:var(--r-md);padding:10px 20px;font-family:inherit;font-size:13px;font-weight:700;cursor:pointer}
.cwrite .csend:hover{filter:brightness(1.08)}
.cwrite .csend:disabled{opacity:.6;cursor:default}
.cwrite .cmsg{font-size:12.5px;margin-top:8px}
.cwrite .cmsg.ok{color:#2f7d32}
[data-theme=dark] .cwrite .cmsg.ok{color:#8fce7f}
.cwrite .cmsg.err{color:#c0392b}
[data-theme=dark] .cwrite .cmsg.err{color:#e8998d}
.clist{display:flex;flex-direction:column;gap:20px}
.cmt{display:flex;gap:12px}
.cmt.is-reply{margin-left:38px}
.cmt .av{width:42px;height:42px;border-radius:50%;display:grid;place-items:center;color:#fff;font-weight:700;font-size:15px;flex-shrink:0;background:linear-gradient(135deg,#7a5a8b,#3a2a4b)}
.cmt:nth-child(3n+2) .av{background:linear-gradient(135deg,#5a7a5a,#2a3a2a)}
.cmt:nth-child(3n) .av{background:linear-gradient(135deg,#5a7a8b,#2a3a4b)}
.cmt .cname{font-weight:600;font-size:14px}
.cmt .cdate{font-size:12px;color:#5c5248;margin-left:8px}
[data-theme=dark] .cmt .cdate{color:#c9c4b6}
.cmt .ctext{font-size:14px;color:#3d3731;line-height:1.55;margin-top:4px;white-space:pre-line}
[data-theme=dark] .cmt .ctext{color:#cfc9bd}
.cmt .cact{font-size:12px;color:#5c5248;margin-top:8px;display:flex;gap:16px}
[data-theme=dark] .cmt .cact{color:#c9c4b6}
.cmt .cact span{cursor:pointer}.cmt .cact span:hover{color:var(--accent)}
.cmore{margin-top:22px;text-align:center}
.cmore button{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--r-md);padding:11px 20px;font-family:inherit;font-size:14px;font-weight:600;color:var(--text);cursor:pointer}
.cmore button:hover{border-color:var(--text)}
.cempty{font-size:14px;color:var(--muted);padding:6px 0 10px}

/* ===== Рейтинги: подиум + ранг-карточки + плитки категорий (индекс и {slug}) ===== */
.rhero{padding:18px 0 6px}
.rhero .eyebrow{display:inline-flex;align-items:center;gap:8px;font-size:11px;text-transform:uppercase;letter-spacing:.16em;color:var(--accent);font-weight:600;margin-bottom:14px}
.rhero .yr{background:var(--accent);color:#fff;padding:3px 9px;border-radius:99px;font-size:11px;letter-spacing:.06em}
.rhero h1{font-family:'Newsreader',serif;font-weight:500;font-size:clamp(34px,5vw,58px);letter-spacing:-.01em;line-height:1.02;margin:0 0 14px}
.rhero .lead{font-size:17px;color:var(--text-2);max-width:780px;line-height:1.6}
.rhero .lead b{color:var(--text);font-weight:600}
.podium{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin:34px 0 12px;align-items:stretch}
.pod{position:relative;border-radius:var(--r-lg);overflow:hidden;background:var(--bg-card);border:1px solid var(--border);cursor:pointer;transition:transform .18s,box-shadow .18s;display:flex;flex-direction:column}
.pod.p1{border-color:var(--gold)}
.pod:hover{transform:translateY(-4px);box-shadow:0 14px 36px rgba(0,0,0,.12)}
.pod-img{aspect-ratio:16/10;position:relative}
.pod-img img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.pod1-img{background:linear-gradient(135deg,#c2a052,#8a6a1a)}
.pod2-img{background:linear-gradient(135deg,#b6bcc2,#7a8088)}
.pod3-img{background:linear-gradient(135deg,#c89a72,#8a5a32)}
.medal{position:absolute;top:14px;left:14px;width:44px;height:44px;border-radius:50%;display:grid;place-items:center;font-family:'Newsreader',serif;font-size:22px;font-weight:600;color:#fff;border:2px solid rgba(255,255,255,.7);box-shadow:0 3px 10px rgba(0,0,0,.25);z-index:2}
.m1{background:linear-gradient(135deg,#d4af37,#a8851f)}.m2{background:linear-gradient(135deg,#aeb4ba,#7c828a)}.m3{background:linear-gradient(135deg,#c8915f,#8a5a32)}
.pod-score{position:absolute;bottom:14px;right:14px;background:rgba(20,20,18,.82);color:#fff;font-family:'Newsreader',serif;font-size:18px;font-weight:500;padding:5px 12px;border-radius:99px;display:inline-flex;align-items:center;gap:5px;z-index:2}
.pod-score .star{color:var(--gold)}
.pod-body{padding:18px 20px 20px}
.pod-place{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--gold);font-weight:700;margin-bottom:6px}
.pod-name{font-family:'Newsreader',serif;font-size:25px;font-weight:500;letter-spacing:-.01em;line-height:1.05}
.pod-cuis{font-size:13px;color:var(--text-2);margin-top:5px}
.pod-bars{margin-top:14px;display:flex;flex-direction:column;gap:7px}
.pbar{display:grid;grid-template-columns:96px 1fr 30px;gap:8px;align-items:center;font-size:12px;color:var(--text-2)}
.pbar .track{height:6px;background:var(--bg-soft);border-radius:99px;overflow:hidden}
.pbar .fill{height:100%;background:var(--gold);border-radius:99px}
.pbar .v{text-align:right;font-weight:600;color:var(--text)}
.rt-sec-h{font-family:'Newsreader',serif;font-weight:500;font-size:28px;letter-spacing:-.008em;margin:40px 0 18px}
.rgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:20px}
.rcard{position:relative;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:transform .15s,border-color .15s}
.rcard:hover{transform:translateY(-3px);border-color:var(--text)}
.rcard.is-pro{border:2px solid var(--gold);box-shadow:0 8px 24px rgba(196,161,74,.16)}
.rcard.is-pro .rcard-img{background:linear-gradient(135deg,#b89a5a,#6a512a)}
.rcard .pro-tag{position:absolute;bottom:12px;right:12px;background:linear-gradient(135deg,var(--gold),#a8853a);color:#fff;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;padding:5px 11px;border-radius:99px;z-index:2}
.rcard .pro-tag::before{content:"✦ "}
.rcard-img{aspect-ratio:4/3;position:relative;background:linear-gradient(135deg,#cdbfae,#8a7a64)}
.rcard-img img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.rcard:nth-child(3n) .rcard-img{background:linear-gradient(135deg,#a8b5b0,#5a6a64)}
.rcard:nth-child(3n+1) .rcard-img{background:linear-gradient(135deg,#c2a89a,#7a5a4a)}
.rcard-rank{position:absolute;top:12px;left:12px;min-width:34px;height:34px;padding:0 8px;border-radius:99px;background:rgba(20,20,18,.82);color:#fff;font-family:'Newsreader',serif;font-size:17px;font-weight:600;display:inline-flex;align-items:center;justify-content:center;gap:3px;z-index:2}
.rcard-rank::before{content:"№";font-size:11px;opacity:.7;font-family:'Manrope',sans-serif;font-weight:700}
.rcard-score{position:absolute;bottom:12px;left:12px;background:rgba(20,20,18,.82);color:#fff;font-family:'Newsreader',serif;font-size:15px;font-weight:500;padding:4px 11px;border-radius:99px;display:inline-flex;align-items:center;gap:5px;z-index:2}
.rcard-score .star{color:var(--gold)}
.rcard-score .votes{font-family:'Manrope',sans-serif;font-size:11px;font-weight:400;opacity:.8;margin-left:2px}
.rcard-body{padding:15px 17px 17px;display:flex;flex-direction:column;gap:5px;flex:1}
.rcard-type{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--accent);font-weight:600}
.rcard-name{font-family:'Newsreader',serif;font-size:21px;font-weight:500;letter-spacing:-.01em;line-height:1.1}
.rcard-meta{font-size:13px;color:var(--text-2);margin-top:auto;padding-top:8px}
.rating-policy{font-size:12.5px;color:var(--muted);margin:14px 0 0;line-height:1.6}
.rcatgroup{font-size:11px;text-transform:uppercase;letter-spacing:.14em;color:var(--muted);font-weight:600;margin:30px 0 14px}
.rcards{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
.rc{position:relative;border-radius:var(--r-lg);overflow:hidden;min-height:130px;display:flex;flex-direction:column;justify-content:flex-end;padding:16px;color:#fff;cursor:pointer;transition:transform .15s}
.rc:hover{transform:translateY(-3px)}
.rc::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,.05),rgba(0,0,0,.45))}
.rc>*{position:relative;z-index:1}
.rc h3{font-family:'Newsreader',serif;font-weight:500;font-size:19px;line-height:1.1;margin:0 0 3px}
.rc .cnt{font-size:12px;opacity:.9}
.rc .crank{position:absolute;top:12px;left:14px;z-index:2;font-family:'Newsreader',serif;font-size:13px;font-weight:600;opacity:.9}
.rc.ga{background:linear-gradient(135deg,#7a5a8b,#3a2a4b)}.rc.gb{background:linear-gradient(135deg,#5a7a8b,#2a3a4b)}.rc.gc{background:linear-gradient(135deg,#5a7a5a,#2a3a2a)}
.rc.gd{background:linear-gradient(135deg,#8a6b5c,#4a3424)}.rc.ge{background:linear-gradient(135deg,#8b5a6a,#4b2a3a)}.rc.gf{background:linear-gradient(135deg,#6a6a8b,#2a2a4b)}
@media (max-width:1100px){.rgrid{grid-template-columns:repeat(3,1fr)}}
@media (max-width:900px){.rcards{grid-template-columns:repeat(2,1fr)}.rgrid{grid-template-columns:repeat(2,1fr)}.podium{grid-template-columns:1fr;gap:14px}.pod-img{aspect-ratio:16/9}.rcard-name{font-size:18px}.pbar{grid-template-columns:88px 1fr 28px}}
@media (max-width:420px){.rgrid{grid-template-columns:1fr}.rcards{grid-template-columns:1fr 1fr}}

/* === МОДАЛКИ (общий слой: вход / оценка / отзыв / неточность / избранное) — из макета restaurant-palkin-v3 === */
.modal-backdrop{position:fixed;inset:0;background:rgba(20,20,18,.65);backdrop-filter:blur(4px);z-index:200;display:none;align-items:flex-start;justify-content:center;padding:60px 24px;overflow-y:auto;animation:fadeIn .2s ease}
.modal-backdrop.active{display:flex}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
.modal{background:var(--bg);border:1px solid var(--border);max-width:760px;width:100%;border-radius:var(--r-lg);position:relative;overflow:hidden;animation:modalIn .2s ease}
.modal.wide{max-width:1120px}
@keyframes modalIn{from{transform:translateY(-12px);opacity:0}to{transform:translateY(0);opacity:1}}
.modal-head{display:flex;justify-content:space-between;align-items:center;padding:24px 32px;border-bottom:1px solid var(--border)}
.modal-head h3{font-family:'Newsreader',serif;font-weight:500;font-size:24px;margin:0;letter-spacing:-.01em}
.modal-close{width:36px;height:36px;border:1px solid var(--border);border-radius:50%;background:var(--bg-card);cursor:pointer;font-size:18px;display:grid;place-items:center;color:var(--text)}
.modal-body{padding:24px 32px 32px}
/* CITIES MODAL (глобальная, из шапки) */
.cities-modal-body{display:block;max-height:74vh;overflow-y:auto}
.cities-l{padding:24px 32px 20px;border-bottom:1px solid var(--border);background:var(--bg-soft)}
.cities-l h4{font-size:11px;text-transform:uppercase;letter-spacing:.12em;color:var(--muted);margin:0 0 14px;font-weight:600}
.cities-l h4.cities-sub{margin-top:24px}
.cities-top{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:4px}
.cities-top .city-top{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:16px 20px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg-card);cursor:pointer;font-family:'Newsreader',serif;font-size:22px;font-weight:500;color:var(--text);white-space:nowrap;transition:border-color .15s,color .15s}
.cities-top .city-top:hover{border-color:var(--accent);color:var(--accent)}
.cities-top .city-top.is-dubai{background:linear-gradient(135deg,var(--bg-card),var(--accent-soft))}
.cities-top .city-top.is-dubai .cnt{color:var(--accent);font-weight:600}
.cities-top .city-top .cnt{font-family:'Manrope',sans-serif;font-size:12px;color:var(--muted);font-weight:400}
.cities-l ul{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:2px 28px}
.cities-l ul li a{display:flex;justify-content:space-between;align-items:center;padding:9px 0;font-size:16px;font-weight:500;color:var(--text);cursor:pointer}
.cities-l ul li a:hover{color:var(--accent)}
.cities-l ul li a .cnt{font-size:11px;color:var(--muted);font-weight:400}
.cities-r{padding:24px 32px}
.cities-r .region-block{margin-bottom:24px}
.cities-r .region-block h4{font-size:11px;text-transform:uppercase;letter-spacing:.12em;color:var(--muted);margin:0 0 12px;font-weight:600;border:none;padding:0}
.cities-r .region-block .cities-line{font-size:14px;line-height:2;color:var(--text-2)}
.cities-r .region-block .cities-line a{display:inline-block;margin-right:14px;cursor:pointer;color:var(--text-2);border-bottom:1px dashed transparent;padding-bottom:1px}
.cities-r .region-block .cities-line a:hover{color:var(--accent);border-bottom-color:var(--accent)}
.cities-r .region-block .cities-line a .cnt{font-size:11px;color:var(--muted);margin-left:3px}
.cities-search{padding:18px 32px;border-bottom:1px solid var(--border)}
.cities-search input{width:100%;padding:12px 16px;border:1px solid var(--border);background:var(--bg-card);font-size:15px;font-family:inherit;color:var(--text);outline:none;border-radius:var(--r-sm)}
/* LOGIN MODAL */
.login-modal{max-width:440px}
.login-modal .modal-body{padding:32px}
.login-body{display:flex;flex-direction:column;gap:14px}
.login-soc{display:flex;flex-direction:column;gap:10px}
.login-soc a{display:flex;align-items:center;gap:12px;padding:14px 18px;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--r-md);font-weight:600;cursor:pointer;color:var(--text);font-size:14px;transition:all .15s}
.login-soc a:hover{border-color:var(--text)}
.login-soc .ic{width:24px;height:24px;border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:700;color:#fff;flex-shrink:0}
.login-soc .vk .ic{background:#0077FF}
.login-soc .tg .ic{background:#229ED9}
.login-soc .ya .ic{background:#FC3F1D}
.login-divider{display:flex;align-items:center;gap:12px;font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.1em;font-weight:600;margin:6px 0}
.login-divider::before,.login-divider::after{content:"";flex:1;height:1px;background:var(--border)}
.login-email input{width:100%;padding:14px 16px;border:1px solid var(--border);background:var(--bg);font-family:inherit;font-size:14px;color:var(--text);border-radius:var(--r-md);outline:none;margin-bottom:10px}
.login-email input:focus{border-color:var(--text)}
.login-email .btn-primary{width:100%}
.login-foot{font-size:11px;color:var(--muted);text-align:center;line-height:1.6;margin-top:18px}
.login-foot a{color:var(--text);text-decoration:underline}
.login-value{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:24px;padding-bottom:24px;border-bottom:1px solid var(--border)}
.login-value div{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-2);line-height:1.3}
.login-value div::before{content:attr(data-ic);font-size:16px;color:var(--accent);flex-shrink:0;width:22px;text-align:center}
.login-value div b{color:var(--text);font-weight:600;margin-right:4px}
.login-soc a{position:relative}
.soc-soon{margin-left:auto;font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);border:1px solid var(--border);border-radius:99px;padding:2px 8px}
.login-codenote{font-size:13px;color:var(--text-2);margin:0 0 10px}
.login-codenote a{color:var(--accent);cursor:pointer;font-weight:600}
.login-err{font-size:13px;color:#c0392b;margin:8px 0 0;line-height:1.4}
/* 24Б-в2: ввод кода по 6 ячейкам (макет 06.07) */
.login-cells{display:flex;gap:8px;justify-content:center;margin:2px 0 10px}
.login-cells input{width:46px;height:58px;padding:0;text-align:center;font-size:26px;font-weight:700;margin-bottom:0;border-radius:var(--r-md);caret-color:var(--accent);flex:0 1 46px}
.login-cells input:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(200,68,38,.12)}
.login-cells input.err{border-color:#c0392b;background:var(--accent-soft);animation:cellshake .3s}
@keyframes cellshake{25%{transform:translateX(-3px)}75%{transform:translateX(3px)}}
/* ISSUE MODAL */
.issue-form .if-row{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:10px}
.issue-form input,.issue-form select,.issue-form textarea{width:100%;padding:12px 14px;border:1px solid var(--border);background:var(--bg);font-family:inherit;font-size:14px;color:var(--text);border-radius:var(--r-sm);outline:none;resize:none}
.issue-form input:focus,.issue-form select:focus,.issue-form textarea:focus{border-color:var(--text)}
.issue-form textarea{min-height:100px;margin-bottom:14px}
.issue-form .if-foot{font-size:11px;color:var(--muted);text-align:center;margin-top:14px;line-height:1.5}
/* 26Д: попап «Нашли неточность» — успех «Спасибо, передали редакции» внутри попапа */
.issue-form .inacc-success{display:none;text-align:center;padding:18px 0 8px}
.issue-form.done .inacc-fields{display:none}
.issue-form.done .inacc-success{display:block}
.issue-form .inacc-success .ic{width:56px;height:56px;border-radius:50%;background:var(--accent-soft);color:var(--accent);font-size:26px;display:grid;place-items:center;margin:0 auto 14px}
.issue-form .inacc-success h4{font-family:'Newsreader',serif;font-size:24px;font-weight:500;letter-spacing:-.01em;margin:0 0 8px}
.issue-form .inacc-success p{font-size:14px;color:var(--text-2);line-height:1.6;margin:0 0 18px}
/* VOTE MODAL */
.vote-form .vf-overall{display:flex;justify-content:center;gap:6px;padding:22px 0;border:1px solid var(--border);border-radius:var(--r-md);margin-bottom:8px;background:var(--bg-soft)}
/* 26Г: пустые звёзды голосования были #d8d4c8 — почти невидимы на светлом фоне; контраст через переменные дизайн-системы (--star-empty/--star-fill, есть тёмная тема) */
.vote-form .vf-overall span{font-size:40px;color:var(--star-empty);cursor:pointer;line-height:1;transition:color .15s}
.vote-form .vf-overall span.hover-on,.vote-form .vf-overall span.set{color:var(--star-fill)}
.vote-form .vf-overall-label{text-align:center;font-size:13px;color:var(--muted);margin-bottom:24px}
.vote-form .vf-overall-label b{color:var(--text);font-weight:700}
.vote-form .vf-sub{display:flex;flex-direction:column;gap:14px;margin-bottom:18px;padding-top:18px;border-top:1px solid var(--border)}
.vote-form .vf-sub-row{display:grid;grid-template-columns:140px 1fr 40px;gap:14px;align-items:center}
.vote-form .vf-sub-row label{font-size:14px;font-weight:500;color:var(--text)}
.vote-form .vf-sub-stars{display:flex;gap:3px;justify-content:flex-end}
.vote-form .vf-sub-stars span{font-size:18px;color:var(--star-empty);cursor:pointer;line-height:1}
.vote-form .vf-sub-stars span.set,.vote-form .vf-sub-stars span.hover-on{color:var(--star-fill)}
.vote-form .vf-sub-row .vf-val{font-family:'Newsreader',serif;font-weight:600;font-size:18px;color:var(--text);text-align:right}
.vote-form .btn-primary{width:100%}
.vote-form .vf-foot{font-size:11px;color:var(--muted);text-align:center;line-height:1.5;margin-top:14px}
.vote-form.done .vote-fields{display:none}
.vote-form .vote-success{display:none;text-align:center;padding:24px 0}
.vote-form.done .vote-success{display:block}
.vote-form .vote-success .ic{font-size:48px;color:#c4a14a;line-height:1;margin-bottom:14px}
.vote-form .vote-success h4{font-family:'Newsreader',serif;font-size:26px;font-weight:500;letter-spacing:-.01em;margin:0 0 10px}
.vote-form .vote-success p{font-size:14px;color:var(--text-2);line-height:1.6;margin:0 0 22px;max-width:380px;margin-left:auto;margin-right:auto}
.vote-form .vote-success .btns{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
/* REVIEW MODAL */
.review-form .rf-anon{padding:14px 16px;background:var(--bg-soft);border:1px solid var(--border);border-radius:var(--r-md);font-size:12px;color:var(--text-2);line-height:1.5;margin-bottom:18px;display:flex;justify-content:space-between;align-items:center;gap:12px}
.review-form .rf-anon b{color:var(--text);font-weight:600}
.review-form .rf-anon a{color:var(--accent);font-weight:600;cursor:pointer;white-space:nowrap}
.review-form .rf-name{margin-bottom:14px}
.review-form .rf-name input{width:100%;padding:12px 14px;border:1px solid var(--border);background:var(--bg);font-family:inherit;font-size:14px;color:var(--text);border-radius:var(--r-sm);outline:none}
.review-form .rf-stars{display:flex;justify-content:center;gap:6px;padding:18px 0;border:1px solid var(--border);border-radius:var(--r-md);margin-bottom:18px;background:var(--bg-soft)}
.review-form .rf-stars span{font-size:36px;color:var(--star-empty);cursor:pointer;line-height:1;transition:color .15s}
.review-form .rf-stars span.hover-on,.review-form .rf-stars span.set{color:var(--star-fill)}
.review-form .rf-stars-label{text-align:center;font-size:13px;color:var(--muted);margin-top:-12px;margin-bottom:18px}
.review-form textarea{width:100%;padding:14px 16px;border:1px solid var(--border);background:var(--bg);font-family:inherit;font-size:14px;color:var(--text);border-radius:var(--r-sm);outline:none;resize:none;min-height:130px;margin-bottom:14px}
.review-form .rf-photos{display:flex;gap:8px;padding:14px;border:1px dashed var(--border);border-radius:var(--r-md);margin-bottom:18px;color:var(--muted);font-size:13px;align-items:center;cursor:pointer}
.review-form .rf-photos:hover{border-color:var(--text);color:var(--text)}
.review-form .rf-photos::before{content:"📷";font-size:18px}
.review-form .btn-primary{width:100%}
.review-form .rf-foot{font-size:11px;color:var(--muted);margin-top:14px;text-align:center;line-height:1.5}
/* FAV MODAL */
.fav-modal{max-width:480px}
.fav-modal .modal-body{padding:32px}
.fav-modal .fav-state-added{display:none}
.fav-modal.added .fav-state-empty{display:none}
.fav-modal.added .fav-state-added{display:block}
.fav-empty{text-align:center;padding:8px 0 22px}
.fav-empty .ic{font-size:46px;color:var(--accent);line-height:1;margin-bottom:12px}
.fav-empty h4{font-family:'Newsreader',serif;font-size:22px;font-weight:500;margin:0 0 8px}
.fav-empty p{font-size:14px;color:var(--text-2);line-height:1.6;margin:0}
.fav-added-hero{text-align:center;padding:4px 0 20px}
.fav-added-hero .ic-circle{width:64px;height:64px;border-radius:50%;background:var(--accent-soft);color:var(--accent);font-size:30px;display:grid;place-items:center;margin:0 auto 14px}
.fav-added-hero h4{font-family:'Newsreader',serif;font-size:22px;font-weight:500;margin:0 0 8px}
.fav-added-hero p{font-size:14px;color:var(--text-2);line-height:1.6;margin:0}
.fav-upsell{background:var(--bg-soft);border:1px solid var(--border);border-radius:var(--r-md);padding:20px}
.fav-upsell h5{font-size:14px;font-weight:700;margin:0 0 12px}
.fav-upsell ul{list-style:none;padding:0;margin:0 0 16px;display:flex;flex-direction:column;gap:8px;font-size:13px;color:var(--text-2)}
.fav-upsell .btn-primary{width:100%}
.fav-login-quick{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-bottom:10px}
.login-soc-quick{display:flex;flex-direction:column;align-items:center;gap:4px;padding:10px 6px;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--r-sm);cursor:pointer;font-size:12px;font-weight:600;color:var(--text);font-family:inherit}
.login-soc-quick .ic{width:26px;height:26px;border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:700;color:#fff}
.login-soc-quick.vk .ic{background:#0077FF}.login-soc-quick.tg .ic{background:#229ED9}.login-soc-quick.ya .ic{background:#FC3F1D}
.fav-login-email{display:flex;gap:8px}
.fav-login-email input{flex:1;padding:12px 14px;border:1px solid var(--border);background:var(--bg);font-family:inherit;font-size:14px;color:var(--text);border-radius:var(--r-sm);outline:none}
.fav-skip{text-align:center;font-size:12px;color:var(--muted);margin-top:14px}
.fav-skip a{color:var(--text);cursor:pointer;text-decoration:underline}
/* BTN PRIMARY/SECONDARY (используются модалками; на карточке уже есть, но дублируем для глобальной доступности) */
.modal .btn-primary{padding:14px 26px;background:var(--accent);color:#fff;border:none;font-weight:600;font-size:14px;cursor:pointer;font-family:inherit;border-radius:var(--r-md)}
.modal .btn-secondary{padding:14px 22px;background:var(--bg-card);color:var(--text);border:1px solid var(--text);font-weight:600;font-size:14px;cursor:pointer;font-family:inherit;border-radius:var(--r-md)}
/* FORM ERRORS */
.err-msg{color:#c0392b;font-size:12px;margin:-8px 0 10px}
.has-error{border-color:#c0392b!important}
/* TOAST */
.toast{position:fixed;left:50%;bottom:28px;transform:translateX(-50%) translateY(40px);background:var(--bg-dark);color:#f0ede4;padding:14px 20px;border-radius:var(--r-md);font-size:14px;display:flex;align-items:center;gap:10px;box-shadow:0 12px 40px rgba(0,0,0,.3);z-index:300;opacity:0;pointer-events:none;transition:all .25s;max-width:90vw}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0);pointer-events:auto}
.toast .t-ic{color:var(--accent)}
.toast a{color:var(--gold);font-weight:600;cursor:pointer;margin-left:6px}
/* ПОИСК: оверлей (Обычный / Умный AI «скоро») — глобально из шапки */
.search-overlay{position:fixed;inset:0;background:rgba(20,20,18,.85);backdrop-filter:blur(8px);z-index:210;display:none;flex-direction:column;align-items:center;padding:80px 24px 40px;overflow-y:auto}
.search-overlay.active{display:flex}
.search-overlay-inner{width:100%;max-width:720px}
.search-overlay-close{position:absolute;top:24px;right:24px;width:44px;height:44px;border:1px solid rgba(255,255,255,.3);border-radius:50%;background:transparent;cursor:pointer;font-size:20px;color:#fff;display:grid;place-items:center}
.search-box{position:relative}
.search-box input{width:100%;padding:24px 60px 24px 28px;background:#fff;color:#000;border:none;outline:none;font-family:inherit;font-size:22px;font-weight:500;border-radius:var(--r-lg)}
.search-box::before{content:"⌕";position:absolute;right:22px;top:50%;transform:translateY(-50%);font-size:28px;color:#666;pointer-events:none}
.search-quick{margin-top:32px;color:#fff}
.search-quick h5{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:rgba(255,255,255,.5);margin:0 0 14px}
.search-quick-chips{display:flex;flex-wrap:wrap;gap:8px}
.search-quick-chips a{padding:8px 14px;background:rgba(255,255,255,.1);border-radius:99px;font-size:14px;color:#fff;cursor:pointer}
.search-mode-tabs{display:inline-flex;background:rgba(255,255,255,.08);padding:4px;border-radius:99px;margin-bottom:18px;border:1px solid rgba(255,255,255,.1)}
.search-mode-tabs a{padding:8px 18px;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:rgba(255,255,255,.6);cursor:pointer;border-radius:99px;transition:all .15s}
.search-mode-tabs a.on{background:#fff;color:#000}
.search-mode-tabs a .ai-badge{display:inline-block;margin-left:6px;padding:2px 6px;background:linear-gradient(135deg,#c84426,#8a3018);color:#fff;font-size:9px;font-weight:700;border-radius:99px;letter-spacing:.04em}
.ai-search-box{position:relative;display:none}
.ai-search-box.on{display:block}
.ai-search-box textarea{width:100%;padding:24px 28px;background:#fff;color:#000;border:none;outline:none;font-family:inherit;font-size:18px;font-weight:500;border-radius:var(--r-lg);min-height:140px;resize:none;line-height:1.5}
.ai-search-submit{margin-top:14px;display:flex;justify-content:space-between;align-items:center;gap:14px}
.ai-search-submit .ai-hint{font-size:12px;color:rgba(255,255,255,.6)}
.ai-search-submit button{padding:14px 28px;background:linear-gradient(135deg,#c84426,#a8351c);color:#fff;border:none;font-weight:700;font-size:14px;cursor:pointer;border-radius:var(--r-md);text-transform:uppercase;letter-spacing:.06em}
.ai-examples{margin-top:24px}
.ai-examples h5{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:rgba(255,255,255,.5);margin:0 0 14px}
.ai-examples-list{display:flex;flex-direction:column;gap:8px}
.ai-examples-list a{padding:14px 18px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.1);border-radius:var(--r-md);color:#fff;cursor:pointer;font-size:14px;line-height:1.5}
.ai-examples-list a:hover{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.2)}
.simple-search-box.off{display:none}
@media(max-width:600px){.search-box input{font-size:18px;padding:18px 50px 18px 20px}.search-overlay{padding:64px 16px 24px}}
@media(max-width:600px){.modal{margin:0;border-radius:var(--r-md)}.modal-backdrop{padding:24px 12px}.modal-head{padding:18px 20px}.modal-body{padding:20px}.modal-head h3{font-size:18px}.vote-form .vf-sub-row{grid-template-columns:90px 1fr 30px;gap:8px}.cities-top{grid-template-columns:1fr}.cities-l ul{grid-template-columns:1fr 1fr}.cities-l,.cities-r,.cities-search{padding-left:20px;padding-right:20px}}
.rev-item-reply{margin-top:10px;padding:10px 14px;background:var(--bg-soft);border-left:3px solid var(--accent);border-radius:8px}
.rev-item-reply .rev-reply-label{font-size:12px;font-weight:700;color:var(--accent);text-transform:uppercase;letter-spacing:.04em}
.rev-item-reply p{margin:4px 0 0;font-size:14px;color:var(--text-2);white-space:pre-line}

/* Избранное + шапка/ЛК (15В-Г-Д) */
.pcard-fav{border:0;padding:0;font-family:inherit}
.pcard-fav.faved{color:var(--accent);background:#fff}
.btn-fav.faved,.btn-fav.on{color:var(--accent);border-color:var(--accent)}
.btn-fav.faved .heart,.btn-fav.on .heart{color:var(--accent)}
.sticky-fav{display:none;color:var(--text-2)}
.sticky-fav.faved{color:var(--accent);border-color:var(--accent)}
@media(max-width:600px){.sticky-fav{display:inline-flex}}
.fav-head{position:relative}
.fav-head.has{color:var(--accent)}
.fav-badge{position:absolute;top:-5px;right:-5px;background:var(--accent);color:#fff;font-size:10px;font-weight:800;line-height:1;min-width:16px;height:16px;border-radius:99px;display:flex;align-items:center;justify-content:center;padding:0 4px}
.hdr-ava{width:44px;height:44px;border-radius:var(--r-md);background:linear-gradient(135deg,var(--accent),#d98a52);color:#fff;display:inline-flex;align-items:center;justify-content:center;font-weight:800;font-size:16px;text-decoration:none;flex-shrink:0}
.cab-logout{display:inline-block;margin-top:24px;font-size:13px;color:var(--muted);text-decoration:underline;cursor:pointer}
.cab-logout:hover{color:var(--accent)}
.fc-rm{color:var(--accent);font-size:16px;line-height:1}

/* 16А: компактный попап «Добавлено в избранное» (МАКЕТ-ПОПАП-ИЗБРАННОЕ) */
.fav-modal.added{max-width:400px}
.fav-modal.added .modal-head{display:none}
.fav-modal.added .modal-body{padding:0}
.fm-head{display:flex;align-items:center;gap:12px;padding:18px 20px 0}
.fm-hh{width:42px;height:42px;border-radius:99px;background:var(--accent-soft);display:flex;align-items:center;justify-content:center;font-size:20px;color:var(--accent);flex:0 0 auto}
.fm-head b{font-family:'Newsreader',serif;font-size:20px;font-weight:500;letter-spacing:-.025em;line-height:1.2}
.fm-x{margin-left:auto;width:32px;height:32px;border-radius:99px;border:1px solid var(--border);background:transparent;font-size:14px;cursor:pointer;color:var(--muted);flex:0 0 auto}
.fm-sub{padding:8px 20px 16px;font-size:14px;color:var(--muted)}
.fm-auth{background:var(--bg-soft);margin:0 20px 20px;border-radius:14px;padding:16px}
.fm-auth>b{display:block;font-size:13.5px;margin-bottom:10px}
.fm-socs{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:10px}
.fm-socs a,.fm-socs button{display:flex;align-items:center;justify-content:center;gap:8px;background:var(--bg-card);border:1px solid var(--border);border-radius:10px;padding:10px;font-weight:700;font-size:13.5px;color:var(--text);cursor:pointer;font-family:inherit}
.fm-socs a:hover,.fm-socs button:hover{border-color:var(--accent)}
.fm-socs .ic{width:20px;height:20px;border-radius:99px;color:#fff;font-size:10.5px;font-weight:800;display:flex;align-items:center;justify-content:center}
.fm-socs .ya{background:#fc3f1d}
.fm-socs .vk{background:#0077ff}
.fm-mail{display:flex;gap:8px}
.fm-mail input{flex:1;border:1px solid var(--border);border-radius:10px;padding:10px 12px;font:inherit;font-size:13.5px;background:var(--bg-card);color:var(--text);min-width:0}
.fm-mail button{background:var(--accent);color:#fff;border:0;border-radius:10px;padding:10px 16px;font-weight:700;font-size:13.5px;cursor:pointer;font-family:inherit;white-space:nowrap}
.fm-later{display:block;text-align:center;padding:0 0 18px;font-size:13px;color:var(--muted);text-decoration:underline;cursor:pointer}
.fm-later:hover{color:var(--text)}
@media(max-width:480px){
 .modal-backdrop:has(.fav-modal.added){align-items:flex-end;padding:0}
 .fav-modal.added{border-radius:18px 18px 0 0;max-width:none}
 .fm-socs{grid-template-columns:1fr}
}

/* 17Ж: чипы и строки избранного в ЛК */
.favf{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:18px}
.favf a{padding:7px 14px;border:1px solid var(--border);border-radius:99px;font-size:13px;font-weight:600;color:var(--text-2);cursor:pointer}
.favf a.on{background:var(--text);color:var(--bg);border-color:var(--text)}
.favh{font-family:'Newsreader',serif;font-weight:500;font-size:20px;margin:22px 0 10px}
.fav-list{display:flex;flex-direction:column;gap:10px}
.fav-row{display:flex;gap:14px;align-items:center;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--r-md);padding:12px 16px}
.fav-row:hover{border-color:var(--accent)}
.fav-row .fr-t{font-weight:600}
.fav-row .fr-m{font-size:13px;color:var(--text-2);margin-left:auto}
.fav-row .fc-rm{border:0;background:none;cursor:pointer}
/* 19Б: согласия ПД в формах */
.rf-consent{display:flex;gap:8px;align-items:flex-start;font-size:12.5px;color:var(--text-2);margin:10px 0 4px}
.rf-consent input{margin-top:2px}
.rf-consent a{color:var(--accent)}
.login-consent{font-size:11.5px;color:var(--muted);margin-top:8px;line-height:1.5}
.login-consent a{color:var(--accent)}
.fm-consent{font-size:11px;color:var(--muted);margin-top:8px;line-height:1.4}
.fm-consent a{color:var(--accent)}
/* 74: избранное-списки (МАКЕТ-ИЗБРАННОЕ-СПИСКИ): события с плиткой даты, акции строками */
.evlist,.aklist{display:flex;flex-direction:column;gap:10px}
.evrow,.akrow{display:flex;gap:16px;align-items:center;background:var(--bg-card);border:1px solid var(--border);border-radius:14px;padding:14px 16px;color:var(--text)}
.evrow:hover,.akrow:hover{border-color:var(--accent)}
.evrow .dt{flex:0 0 62px;text-align:center;background:var(--bg-soft);border-radius:12px;padding:9px 4px}
.evrow .dt b{display:block;font-family:'Newsreader',serif;font-size:24px;font-weight:600;line-height:1}
.evrow .dt span{display:block;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--accent);font-weight:700;margin-top:3px}
.ev-in,.ak-in{flex:1;min-width:0}
.ev-in b,.ak-in b{font-family:'Newsreader',serif;font-size:17.5px;font-weight:600;display:block}
.ev-in .meta,.ak-in .meta{font-size:13px;color:#5c5248;margin-top:3px;display:block}
[data-theme=dark] .ev-in .meta,[data-theme=dark] .ak-in .meta{color:#c9c4b6}
.ev-in .meta em,.ak-in .meta em{color:var(--accent);font-style:normal;font-weight:600}
.ev-time{flex:0 0 auto;font-size:13.5px;font-weight:700;background:var(--accent-soft);color:var(--accent);border-radius:999px;padding:6px 12px}
.evheart{flex:0 0 auto;border:0;background:none;color:#e0362a;font-size:17px;cursor:pointer}
.ak-ic{flex:0 0 44px;height:44px;border-radius:12px;background:var(--bg-soft);display:flex;align-items:center;justify-content:center;font-size:19px}
.ak-due{flex:0 0 auto;font-size:12.5px;font-weight:700;background:#eaf3e6;color:#2f5e26;border:1px solid #cfe3c5;border-radius:999px;padding:6px 12px}
[data-theme=dark] .ak-due{background:#1d2a1a;color:#b9dcb0;border-color:#2f4a2c}
@media(max-width:700px){.evrow{flex-wrap:wrap}.ev-time{order:5}}
/* Задача 2 (Волна 10): согласие в форме комментария */
.c-consent{display:flex;gap:8px;align-items:flex-start;font-size:12px;color:var(--text-2);margin-top:8px}
.c-consent input{margin-top:2px}
.c-consent a{color:var(--accent)}
/* 24Ж: VIP-выделение витрин (золотая подложка + пульс ★ каждые ~3с + блик на каждый 2-й пульс). Финальный вариант vipGold из макета 05.07.2026, применяется ко всем VIP-карточкам: заведения, акции, события. */
/* Карточки-плитки: заведения (.pcard, .rcard, .nearby-card, .sel), акции (.dc — карточка-строка акции на главной/{city}/discounts; .dsc — legacy-алиас), события (.ecard, .event-feature).
   №208.7: раньше в списке был только .dsc, а реальная карточка акции — .dc → у VIP-акции .star не позиционировался (падал в грид .dc:160px 1fr первым элементом, фото уезжало вправо). Добавлен .dc.vipGold во все правила (фон/рамка/position:relative + абсолютная ★ + shimmer). */
.pcard.vipGold,.dsc.vipGold,.dc.vipGold,.ecard.vipGold,.sel.vipGold,.nearby-card.vipGold,.event-feature.vipGold,.rcard.vipGold{background:var(--goldbg);border:1.5px solid var(--goldline);box-shadow:0 6px 22px rgba(184,134,11,.16);overflow:hidden;position:relative}
[data-theme=dark] .pcard.vipGold,[data-theme=dark] .dsc.vipGold,[data-theme=dark] .dc.vipGold,[data-theme=dark] .ecard.vipGold,[data-theme=dark] .sel.vipGold,[data-theme=dark] .nearby-card.vipGold,[data-theme=dark] .event-feature.vipGold,[data-theme=dark] .rcard.vipGold{background:var(--goldbg)}
.pcard.vipGold>.star,.dsc.vipGold>.star,.dc.vipGold>.star,.ecard.vipGold>.star,.sel.vipGold>.star,.nearby-card.vipGold>.star,.event-feature.vipGold>.star,.rcard.vipGold>.star{position:absolute;top:8px;left:8px;z-index:4;width:26px;height:26px;border-radius:999px;background:var(--gold);color:#fff;display:flex;align-items:center;justify-content:center;font-size:13px;box-shadow:0 2px 8px rgba(0,0,0,.2);animation:starFast 3s ease-in-out infinite;pointer-events:none}
@keyframes starFast{0%,100%{transform:scale(1);box-shadow:0 2px 8px rgba(0,0,0,.2)}12%{transform:scale(1.35);box-shadow:0 0 16px 4px rgba(212,167,44,.6)}26%{transform:scale(1)}}
.pcard.vipGold::after,.dsc.vipGold::after,.dc.vipGold::after,.ecard.vipGold::after,.sel.vipGold::after,.nearby-card.vipGold::after,.event-feature.vipGold::after,.rcard.vipGold::after{content:'';position:absolute;top:-20%;bottom:-20%;width:36%;left:-50%;transform:skewX(-18deg);background:linear-gradient(90deg,transparent,rgba(228,207,142,.5),rgba(255,244,205,.7),rgba(228,207,142,.5),transparent);animation:shimmerSync 6s ease-in-out infinite;pointer-events:none;z-index:3}
@keyframes shimmerSync{0%,56%{left:-50%}74%,100%{left:120%}}
/* Строки-списки: события на главной (.es-row), избранное-строки (.evrow) */
.es-row.vipGold,.evrow.vipGold{background:var(--goldbg);border:1.5px solid var(--goldline)!important;box-shadow:0 5px 18px rgba(184,134,11,.15);overflow:hidden;position:relative}
[data-theme=dark] .es-row.vipGold,[data-theme=dark] .evrow.vipGold{background:var(--goldbg)}
.es-row.vipGold::before,.evrow.vipGold::before{content:'★';position:absolute;top:-9px;left:14px;background:var(--gold);color:#fff;border-radius:999px;width:20px;height:20px;font-size:11px;display:flex;align-items:center;justify-content:center;z-index:4;animation:starFast 3s ease-in-out infinite}
.es-row.vipGold::after,.evrow.vipGold::after{content:'';position:absolute;top:-30%;bottom:-30%;width:26%;left:-40%;transform:skewX(-18deg);background:linear-gradient(90deg,transparent,rgba(228,207,142,.45),rgba(255,244,205,.6),rgba(228,207,142,.45),transparent);animation:shimmerSync 6s ease-in-out infinite;pointer-events:none;z-index:3}
@media (prefers-reduced-motion:reduce){.pcard.vipGold>.star,.dsc.vipGold>.star,.dc.vipGold>.star,.ecard.vipGold>.star,.sel.vipGold>.star,.nearby-card.vipGold>.star,.event-feature.vipGold>.star,.rcard.vipGold>.star,.pcard.vipGold::after,.dsc.vipGold::after,.dc.vipGold::after,.ecard.vipGold::after,.sel.vipGold::after,.nearby-card.vipGold::after,.event-feature.vipGold::after,.rcard.vipGold::after,.es-row.vipGold::before,.evrow.vipGold::before,.es-row.vipGold::after,.evrow.vipGold::after{animation:none!important}}

/* === 27Б: шапка — центрирование лупы в кнопке поиска (base.html.twig).
   Было: глиф "⌕" в ::before + gap:10px до текстового флекс-итема шириной 0 (font-size:0 на ≤600px)
   → иконка уезжала на ~5px влево от центра кнопки 44×44 + вертикаль зависела от метрик шрифта.
   Стало: инлайн-SVG 20×20 (флекс-центр даёт ровно центр кнопки), gap:0 на мобиле. === */
.btn-icon.is-search::before{content:none}
.btn-icon.is-search .is-search-ic{width:20px;height:20px;flex-shrink:0;display:block;color:var(--text)}
@media(max-width:600px){.btn-icon.is-search{gap:0}}

/* === 27Е: списки в статейном теле. Глобальный reset *{margin:0;padding:0} обнулял отступ ul/ol,
   и маркеры (list-style-position:outside) рисовались левее контентного бокса — прижимались к левому
   краю контейнера (на 375px — к краю экрана, визуально «вне текста»).
   Возвращаем отступ + типографику спискам во всех статейных вертикалях:
   .art-body /articles/ · .n-body городские /{city}/news/ · .fn-body /freshnews/ и /foodnews/ ·
   .ev-body афиша (событие) · .d-body акция. Цвета через var() — работает в обеих темах. === */
.art-body ul,.art-body ol,.n-body ul,.n-body ol,.fn-body ul,.fn-body ol,.ev-body ul,.ev-body ol,.d-body ul,.d-body ol{padding-left:26px;margin:0 0 22px}
.art-body li,.n-body li,.fn-body li,.ev-body li,.d-body li{font-family:'Newsreader',serif;font-size:19px;line-height:1.6;margin:0 0 10px;color:var(--text)}
.fn-body li,.ev-body li{font-size:18px}
/* вложенные ul/ol внутри li: без нижнего отступа родительского блока, небольшой отступ сверху */
.art-body li ul,.art-body li ol,.n-body li ul,.n-body li ol,.fn-body li ul,.fn-body li ol,.ev-body li ul,.ev-body li ol,.d-body li ul,.d-body li ol{margin:8px 0 0}
/* мобильные размеры — в ногу с уменьшением p в page_css соответствующих шаблонов */
@media(max-width:700px){.art-body li{font-size:18px}}
@media(max-width:600px){.n-body li{font-size:18px}}

/* === №272.3: подписи к фото редакторного контента — заметнее и прижаты к своему фото (CSS владельца 1:1).
   Было: 13px, цвет muted, после figure зазора не было — подпись «прилипала» к следующему абзацу.
   Стало: у figure нижний отступ 34px (подпись отбита от следующего текста), figcaption 15px/var(--text-2).
   ОБЩЕЕ место (прежние дубли в page_css обзоров/новостей удалены — page_css грузится ПОСЛЕ app.css и
   перекрывал бы эти значения): все редакционные вертикали, тот же набор классов, что у списков 27Е —
   .art-body обзоры Бориса и /articles/ · .n-body городские /{city}/news/ · .fn-body /freshnews/ и
   /foodnews/ · .ev-body афиша · .d-body акция. Цвет через var() — работает в обеих темах. === */
.art-body figure.image,.n-body figure.image,.fn-body figure.image,.ev-body figure.image,.d-body figure.image{margin:18px auto 34px;text-align:center}
.art-body figcaption,.n-body figcaption,.fn-body figcaption,.ev-body figcaption,.d-body figcaption{font-size:15px;color:var(--text-2);margin-top:8px;line-height:1.4}
/* №348: правило выше написано на figure.image — это разметка НОВОГО редактора. Легаси-фотографии
   обзоров Бориса лежат как <figure class="visualEditorInsertion_captionedImage">, селектор мимо них,
   у фигуры margin:0 — подпись оказывалась прижата к следующему абзацу (0 px), а не к своему фото
   (22 px). Здесь селектор по ГОЛОМУ figure — ловит обе разметки. text-align:center сознательно НЕ
   распространяем на легаси: у Бориса подписи слева, под левым краем фото, центрирование разъехало бы
   все старые обзоры. Размер/цвет подписи (15px/var(--text-2)) тоже не трогаем — они выше и общие. */
.art-body figure,.n-body figure,.fn-body figure,.ev-body figure,.d-body figure{margin-bottom:34px}
/* №349.3: с включённым GHS редактор оборачивает картинку внутри легаси-фигуры в <p>, и прямой
   потомок figure — уже не img. Селектор figure>img переставал попадать, расстояние картинка→подпись
   уезжало с 8px на 42px. Берём любой img внутри figure и обнуляем поля у абзаца-обёртки. */
.art-body figure img,.n-body figure img,.fn-body figure img,.ev-body figure img,.d-body figure img{margin-bottom:0;vertical-align:bottom}
.art-body figure p,.n-body figure p,.fn-body figure p,.ev-body figure p,.d-body figure p{margin:0}
/* Внутри карусели (№241.4) отступ обнуляем — там фигуры стоят рядом, а не в потоке текста. */
.art-body .img-carousel figure,.n-body .img-carousel figure,.fn-body .img-carousel figure,.ev-body .img-carousel figure,.d-body .img-carousel figure{margin:0}

/* === №208.6 / №207.2: единый компонент «Рецепты и лайфхаки» — сетка (корневая + города).
   Раньше правила сетки жили только в city/home page_css (после №207.2); выносим их ГЛОБАЛЬНО,
   чтобы partial _partials/recipes_grid.html.twig (Lane B) одинаково работал и на /, и на /{city}/
   (у корневой раньше был только карусель .fw-track — .fw-grid там отсутствовал).
   Значения .nw-card/.fw-grid — точь-в-точь как в page_css (не меняем), поэтому это безопасный
   фолбэк: page_css грузится ПОСЛЕ app.css и при равной специфичности перекрывает эти правила —
   на существующих страницах вид не меняется, а partial становится самодостаточным.
   Обе темы — через существующие --токены (--bg-card/--border/--text/--muted/--accent).
   .fw-block/.fw-head НЕ глобалим (постраничный ритм секции; «не ломаем другие .fw-*»). === */
.nw-card{flex:0 0 calc((100% - 72px)/4);scroll-snap-align:start;cursor:pointer;display:flex;flex-direction:column;gap:10px}
.nw-card .nw-img{aspect-ratio:16/10;background:linear-gradient(135deg,#7a8a5c 0%,#3a4a2c 100%);margin-bottom:6px;border-radius:var(--r-lg);position:relative;overflow:hidden}
.nw-card:nth-child(2) .nw-img{background:linear-gradient(135deg,#8b6b4a 0%,#3a2a1a 100%)}
.nw-card:nth-child(3) .nw-img{background:linear-gradient(135deg,#5a6a8b 0%,#2a3a5b 100%)}
.nw-card:nth-child(4) .nw-img{background:linear-gradient(135deg,#a07a4a 0%,#5a3a1a 100%)}
.nw-card:nth-child(5) .nw-img{background:linear-gradient(135deg,#6a8a7b 0%,#2a4a3b 100%)}
.nw-card:nth-child(6) .nw-img{background:linear-gradient(135deg,#9b7a4a 0%,#5b3a1a 100%)}
.nw-card:nth-child(7) .nw-img{background:linear-gradient(135deg,#7a5a8b 0%,#3a2a5b 100%)}
.nw-card:nth-child(8) .nw-img{background:linear-gradient(135deg,#5a8a5a 0%,#2a5a2a 100%)}
.nw-card .nw-img img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.nw-title{font-family:'Newsreader',serif;font-weight:500;font-size:18px;line-height:1.2;letter-spacing:-.01em;margin:0}
.nw-meta{font-size:12px;color:var(--muted)}
/* сетка рецептов: 4 в ряд (десктоп) → 3 (≤1100) → 2 (≤800) → 1 (≤520); старт 12 карточек, добор кнопкой */
.fw-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:24px;max-width:1280px;margin:0 auto;padding:0 32px}
.fw-grid .nw-card{flex:none;scroll-snap-align:none}
.fw-grid .nw-card:nth-child(n+13){display:none}
.fw-grid.show-all .nw-card{display:flex}
.fw-more-wrap{max-width:1280px;margin:24px auto 0;padding:0 32px;text-align:center}
.fw-more{display:inline-flex;align-items:center;justify-content:center;padding:13px 28px;border:1px solid var(--border);background:var(--bg-card);color:var(--text);border-radius:var(--r-md);font-family:inherit;font-size:14px;font-weight:600;cursor:pointer;transition:border-color .15s,color .15s;text-decoration:none}
.fw-more:hover{border-color:var(--text);color:var(--accent)}
/* Фидбек 16.07: [hidden] проигрывал display:inline-flex — кнопка «Показать ещё» не скрывалась после раскрытия. */
.fw-more[hidden]{display:none}
@media(max-width:1100px){.fw-grid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:1000px){.nw-card{flex-basis:calc((100% - 24px)/2)}}
@media(max-width:800px){.fw-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:600px){.nw-card{flex-basis:70%}}
@media(max-width:520px){.fw-grid{grid-template-columns:1fr}}
/* №239: контейнер баннера Advertronic (.ad-box). Нейтральный фон в обеих темах. */
.ad-box{margin:34px 0;padding:10px 0 12px;text-align:center;background:var(--bg-soft);border-radius:var(--r-md,12px);min-height:274px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px}
.ad-box .ad-cap{font-size:11px;line-height:1;color:var(--muted);letter-spacing:.06em;text-transform:uppercase}
.ad-box .rtb-slot{display:block;width:100%;max-width:100%}
.ad-box .rtb-slot *{max-width:100%}
@media(max-width:768px){.ad-box{min-height:124px;margin:24px 0}}
/* №243.6→№247.1 (дофикс №239.1.1): пустой слот СХЛОПНУТ display:none прямо из CSS — height:0-вариант
   в grid-сетках занимал ячейку и оставлял дыру (/spb/discounts/); display:none ячейку не создаёт.
   Замер пришедшего креатива — двухшаговый скрипт в base.html.twig (приоткрыл — замерил — закрыл).
   Плюс: слот, оказавшийся ЯЧЕЙКОЙ сетки, всегда растягивается полосой на всю ширину (grid-column
   действует только на grid-элементы, в обычном потоке безвреден) — пришедший баннер не встаёт
   «карточкой» в сетку ни в одном шаблоне. */
.ad-box{grid-column:1/-1}
.ad-box[data-adbox]:not(.has-ad){display:none}
/* №248.3: диагональная золотая лента «VIP» в левом верхнем углу обложки карточки (сетки).
   Включается параметром vipRibbon в place_card (пока только каталог — вид на утверждении).
   Фикс-цвета #c8930a/#fff — одинаково в светлой и тёмной темах (по ТЗ). */
.pcard-img{overflow:hidden}
.pcard-img .vip-ribbon{position:absolute;top:16px;left:-30px;z-index:2;transform:rotate(-45deg);background:#c8930a;color:#fff;font-size:10.5px;font-weight:800;letter-spacing:.14em;text-align:center;padding:4px 34px;box-shadow:0 1px 4px rgba(0,0,0,.28);pointer-events:none}

/* №282/№284 — федеративная выдача поиска: блоки «Из афиши»/«Материалы по теме» (общий источник
   стилей для обычного поиска и ИИ; раньше стили были инлайн под .ai-results в _ai_events/_ai_articles).
   Всё через CSS-переменные → обе темы; мобайл 375 попадает в ≤600/≤560 брейкпоинты. */
.fed .fed-h{display:flex;align-items:center;gap:10px;margin:30px 0 14px}
.fed .fed-h .t{font-family:'Newsreader',serif;font-weight:500;font-size:22px;letter-spacing:-.01em}
.fed .fed-h .tag{font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--accent);background:var(--accent-soft);padding:3px 9px;border-radius:99px}
.fed .fed-h .fed-more{margin-left:auto;font-size:13px;color:var(--accent);font-weight:600;white-space:nowrap}
/* карточка события .ecard (1:1 из афиши) */
.fed .ev-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:22px 20px}
.fed .ecard{display:flex;flex-direction:column;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;transition:border-color .15s,transform .15s}
.fed .ecard:hover{border-color:var(--text);transform:translateY(-2px)}
.fed .ecard-img{aspect-ratio:16/10;background:linear-gradient(135deg,#3a3a44,#1a1a22);position:relative;overflow:hidden}
.fed .ecard-img img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.fed .ecard-body{padding:12px 14px 15px;display:flex;flex-direction:column;gap:5px;flex:1}
.fed .ecard-cat{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--accent);font-weight:600;min-height:12px}
.fed .ecard-title{font-family:'Newsreader',serif;font-size:17px;font-weight:500;line-height:1.16;letter-spacing:-.01em;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.fed .ecard-when{font-size:12px;color:var(--text-2);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.fed .ecard-when b{color:var(--accent);font-weight:600}
.fed .ecard-rep{display:inline-block;font-size:9.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;background:var(--accent-soft);color:var(--accent);border-radius:99px;padding:2px 8px}
.fed .ecard-place{margin-top:auto;padding-top:6px;font-size:12.5px;color:var(--text-2)}
@media (max-width:1080px){.fed .ev-grid{grid-template-columns:repeat(3,1fr)}}
@media (max-width:900px){.fed .ev-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:600px){.fed .ev-grid{grid-template-columns:1fr;gap:14px}}
/* строка материала .fn-row (1:1 из freshnews) */
.fed .fn-row{display:grid;grid-template-columns:210px 1fr;gap:18px;padding:20px 0;border-bottom:1px solid var(--border)}
.fed .fn-row .fn-thumb{aspect-ratio:210/120;border-radius:12px;overflow:hidden;background:linear-gradient(135deg,#cdbfae,#8a7a64)}
.fed .fn-row .fn-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.fed .fn-row .fn-bd{display:flex;flex-direction:column;gap:6px;min-width:0}
.fed .fn-row .fn-hd{display:flex;gap:14px;align-items:baseline}
.fed .fn-row h3{font-family:'Newsreader',serif;font-size:21px;font-weight:500;line-height:1.25;flex:1;margin:0}
.fed .fn-row a:hover h3{color:var(--accent)}
.fed .fn-row .fn-dt{font-size:12px;color:var(--muted);white-space:nowrap}
.fed .fn-row .fn-ld{font-size:13.5px;color:var(--text-2)}
.fed .fn-row .fn-more{font-size:12.5px;color:var(--accent);font-weight:700;margin-top:auto}
@media(max-width:560px){.fed .fn-row{grid-template-columns:1fr}}
/* №284.2: город заведения в карточке (режим «все города») */
.pcard-city{font-size:11.5px;color:var(--text-2);display:flex;align-items:center;gap:4px;margin-top:1px}
/* №296: раскладка «контент + правая колонка Популярное» — эталон freshnews, единый экземпляр
   для freshnews/foodnews/Бориса/новостей ресторанов (инлайн-копии из freshnews убраны). */
.fn-layout{display:grid;grid-template-columns:1fr 300px;gap:28px;align-items:start}
.fn-pop{position:sticky;top:calc(var(--header-h,64px) + 16px);max-height:calc(100vh - var(--header-h,64px) - 32px);overflow-y:auto}
.fn-pop .fn-ph{font-family:'Newsreader',serif;font-size:20px;font-weight:500;padding-bottom:10px;border-bottom:2px solid var(--text);margin-bottom:14px}
.fn-pop a{display:block;padding:0 0 18px;color:var(--text);font-size:14px;line-height:1.35;font-weight:700}
.fn-pop a:hover{color:var(--accent)}
.fn-pop .fn-pim{display:block;width:100%;aspect-ratio:16/10;border-radius:12px;overflow:hidden;background:linear-gradient(135deg,#7d6a5e,#4a3d35);margin-bottom:8px}
.fn-pop .fn-pim img{width:100%;height:100%;object-fit:cover;display:block}
.fn-pop .fn-all{display:block;text-align:center;border:1px solid var(--border);border-radius:9px;padding:9px;font-size:12.5px;font-weight:800;margin-top:4px}
/* сетки карточек в суженной левой колонке — 2 в ряд (иначе 3-в-ряд жмётся). Только ≥861px:
   ниже колонка уходит в поток, и сетки следуют СВОИМ брейкпоинтам страницы (иначе высокая
   специфичность .fn-layout .grid перебила бы мобильное 1-в-ряд самой страницы). */
@media(min-width:861px){.fn-layout .rev-grid,.fn-layout .news-grid,.fn-layout .n-grid,.fn-layout .nw-list{grid-template-columns:repeat(2,1fr)}}
@media(max-width:860px){.fn-layout{grid-template-columns:1fr}.fn-pop{position:static;max-height:none;overflow:visible}}
/* №302.A/№304.1: навигатор каталога .cnav — большие карточки (как медиа-разделы), 1:1 по макету
   НАВИГАТОР-КАТАЛОГА. Вынесен из page_css каталога: партиал _partials/catalog_nav.html.twig
   используется на /restorany/, /rating/, /podborki/, /gruppy/ (+EN). */
.cnav{display:grid;grid-template-columns:repeat(5,1fr);gap:14px;margin:14px 0 30px}
.cnav .cn{position:relative;display:flex;flex-direction:column;gap:6px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg-card);padding:16px 16px 15px;text-decoration:none;color:var(--text);transition:border-color .15s,box-shadow .15s}
.cnav .cn:hover{border-color:var(--accent);box-shadow:0 4px 16px rgba(0,0,0,.06)}
.cnav .cn.on{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent) inset}
.cnav .cn .ic{font-size:24px;line-height:1}
.cnav .cn .t{font-family:'Newsreader',serif;font-size:17px;font-weight:500}
.cnav .cn .d{font-size:12px;color:var(--text-2);line-height:1.35}
.cnav .cn .here{position:absolute;top:-9px;left:14px;background:var(--accent);color:#fff;font-size:9.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;padding:3px 8px;border-radius:99px}
@media(max-width:900px){.cnav{grid-template-columns:repeat(3,1fr)}}
@media(max-width:560px){.cnav{grid-template-columns:1fr 1fr;gap:10px}}
/* №288.1/№304.2: двухколонник .feat2 («Подборки/Подборка недели» слева + «Ресторан дня» справа).
   Перенесён 1:1 из инлайна _partials/feat2.html.twig: теперь нужен и /podborki/ («Подборка недели»
   + rod_card). Скоуп .feat2 обязателен — на /rating/ класс .pod занят подиумом. */
.feat2{display:grid;grid-template-columns:1fr 1.05fr;gap:22px;margin:0 0 30px;align-items:stretch}
.feat2 .pods{border:1px solid var(--border);border-radius:var(--r-lg);background:var(--bg-card);padding:20px 22px;display:flex;flex-direction:column}
.feat2 .pods h3{font-family:'Newsreader',serif;font-size:20px;margin:0 0 3px}
.feat2 .pods .sub{font-size:13px;color:var(--text-2);margin-bottom:14px}
.feat2 .pods-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.feat2 .pod{display:flex;align-items:center;gap:10px;border:1px solid var(--border);border-radius:var(--r-md);padding:10px 12px;background:var(--bg);transition:border-color .15s}
.feat2 .pod:hover{border-color:var(--accent)}
.feat2 .pod .ic{font-size:20px;flex:none}
.feat2 .pod .nm{font-size:13.5px;font-weight:600;line-height:1.15}
.feat2 .pod .cnt{font-size:11.5px;color:var(--muted)}
.feat2 .pods-all{margin-top:auto;padding-top:14px;font-size:13px;color:var(--accent);font-weight:600}
.feat2 .rodwrap{position:relative;padding:6px}
.feat2 .rod{display:block;position:relative;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;box-shadow:0 0 0 2px rgba(200,147,10,.35),0 10px 30px rgba(200,147,10,.12);height:100%}
[data-theme=dark] .feat2 .rod{box-shadow:0 0 0 2px rgba(232,185,60,.4),0 10px 30px rgba(0,0,0,.5)}
.feat2 .rod-img{aspect-ratio:16/9;background:linear-gradient(135deg,#b79b86,#7a6552);position:relative;overflow:hidden}
.feat2 .rod-img img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.feat2 .rod-tag{position:absolute;top:12px;left:12px;background:var(--gold);color:#2a2410;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;padding:4px 11px;border-radius:99px}
.feat2 .rod-b{padding:14px 18px 18px}
.feat2 .rod-name{font-family:'Newsreader',serif;font-size:22px;margin-bottom:3px}
.feat2 .rod-meta{font-size:13px;color:var(--text-2)}
.feat2 .rod-rating{margin-top:8px;font-size:14px;font-weight:600}
.feat2 .rod-rating .star{color:var(--star-fill)}
.feat2 .rod-how{text-align:center;margin-top:8px;font-size:12.5px;color:var(--text-2)}
.feat2 .rod-how a{color:var(--text-2)}
.feat2 .rod-how a:hover{color:var(--accent)}
.feat2 .spark{position:absolute;color:#e8b93c;pointer-events:none;z-index:3;font-size:14px;text-shadow:0 0 6px rgba(232,185,60,.7);animation:rodpop 2.6s ease-in-out infinite}
.feat2 .spark.s2{font-size:10px;animation-delay:.6s}
.feat2 .spark.s3{font-size:17px;animation-delay:1.2s}
.feat2 .spark.s4{font-size:11px;animation-delay:1.8s}
@keyframes rodpop{0%,100%{transform:scale(.4) translateY(4px);opacity:0}18%{opacity:1;transform:scale(1.15) translateY(-2px)}45%{opacity:.85;transform:scale(1) translateY(-6px)}75%{opacity:0;transform:scale(.5) translateY(-12px)}}
@media(max-width:820px){.feat2{grid-template-columns:1fr}.feat2 .pods-grid{grid-template-columns:1fr 1fr}.feat2 .rodwrap{order:-1}}
@media(max-width:520px){.feat2 .pods-grid{grid-template-columns:1fr 1fr}}
/* №304.2: «Подборка недели» — левая колонка .feat2 на /{city}/podborki/ (одна выделенная подборка
   крупно: фото 16/9, название, счётчик, кнопка). .feat2.solo — подборок нет, остался один ROD. */
.feat2 .wk{display:flex;flex-direction:column;min-width:0}
.feat2 .wk h3{font-family:'Newsreader',serif;font-size:20px;margin:0 0 10px}
.feat2 .wk-card{flex:1;display:block;border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;background:var(--bg-card);text-decoration:none;color:var(--text);transition:border-color .15s,box-shadow .15s}
.feat2 .wk-card:hover{border-color:var(--accent);box-shadow:0 4px 16px rgba(0,0,0,.06)}
.feat2 .wk-img{aspect-ratio:16/9;background:linear-gradient(135deg,#cdbfae,#8a7a64);position:relative;overflow:hidden}
.feat2 .wk-img img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.feat2 .wk-b{padding:14px 18px 18px}
.feat2 .wk-name{font-family:'Newsreader',serif;font-size:22px;margin-bottom:3px}
.feat2 .wk-cnt{font-size:13px;color:var(--text-2)}
.feat2 .wk-btn{display:inline-block;margin-top:12px;font-size:13.5px;font-weight:600;color:var(--accent)}
.feat2.solo{grid-template-columns:minmax(0,640px)}

/* №307.2: «Как выбирается ресторан дня» — кнопка + всплывашка (были инлайном главной №250.2) */
.rod-how{display:flex;justify-content:center;margin-top:12px}
.rod-how button{background:none;border:none;color:#5f574c;font-size:12.5px;cursor:pointer;border-bottom:1px dashed #8a8177;padding:0 0 1px;font-family:inherit}
[data-theme=dark] .rod-how button{color:#b8afa2;border-color:#8a8177}
.rod-how button:hover{color:var(--accent);border-color:var(--accent)}
.rod-pop-overlay{position:fixed;inset:0;background:rgba(32,32,30,.45);display:none;align-items:center;justify-content:center;padding:20px;z-index:50}
.rod-pop-overlay.on{display:flex}
.rod-pop{background:var(--bg-card);border-radius:16px;max-width:440px;width:100%;padding:26px 26px 22px;position:relative;box-shadow:0 20px 60px rgba(0,0,0,.25);font-size:14.5px;line-height:1.65;outline:none}
.rod-pop .x{position:absolute;top:12px;right:14px;background:none;border:none;font-size:20px;color:var(--muted);cursor:pointer}
.rod-pop h3{font-family:'Newsreader',serif;font-size:19px;margin-bottom:12px;padding-right:24px}
.rod-pop p{margin-bottom:12px}
.rod-pop .fine{color:#5f574c;font-size:12.5px;border-top:1px solid var(--border);padding-top:12px;margin-bottom:0}
[data-theme=dark] .rod-pop .fine{color:#b8afa2}
.rod-pop .hl{background:#fdf6e3;border-radius:8px;padding:10px 12px;font-size:13.5px;margin-bottom:12px}
[data-theme=dark] .rod-pop .hl{background:#2e2a22}
