/* == base == */
/* ==========================================================================
   Справочник /firms, этап 9: основа вида (спецификация 2026-10-02, раздел 4,
   с доводкой по разделу 12). Классы tp-f-, значения из tokens.css,
   mobile-first, брейкпоинты 640, 768 и 1024 px. Файл разбит на блоки с
   маркерами base, row, card, listing, hub, pages, balloon: задача этапа 9
   переписывает свой блок целиком, от его маркера до следующего. Фон страниц
   серый (--tp-surface-tint), содержимое в белых карточках-контейнерах
   .tp-f-box (стопка .tp-f-boxes), внутри разделы через линии; кнопки 52 px
   (48 на телефоне): главная желтая, мягкая серая без рамки; иконки только у
   действий; в блоке не больше одной главной кнопки; статус цветным текстом
   без плашки. Крошки страницы справочника внутри ее шапки (.tp-f-crumbs),
   строка крошек сайта на такой странице скрыта.
   ========================================================================== */
[hidden] { display: none !important; }
body.bg-light:has(.tp-f) { background-color: var(--tp-surface-tint) !important; }
.tp-f { color: var(--tp-ink); font-size: var(--tp-fs-md); line-height: 1.5;
    --tp-f-fbar-h: calc(var(--tp-7) + var(--tp-3));
    --tp-f-pop-w: calc(var(--tp-8) * 5);
    --tp-f-balloon-w: calc(var(--tp-8) * 4 + var(--tp-5));
    --tp-f-check-w: calc(var(--tp-8) * 3 - var(--tp-2));
    --tp-f-label-w: calc(var(--tp-8) * 2 + var(--tp-6));
    --tp-f-box-pad: calc(var(--tp-4) + var(--tp-1));
    --tp-f-btn-h: var(--tp-7);
    --tp-f-cta-w: calc(var(--tp-8) * 4 + var(--tp-5)); }
/* Слои: полоса разделов 20, меню и списки 20, список офисов шапки 21, нижняя полоса и
   панель фильтров 30, кнопка карты 1040, карта на весь экран 1050 (над шапкой сайта и
   ниже окон ввода). */
.tp-f a:not([class]) { color: var(--tp-link); text-underline-offset: .15em; }
.tp-f-container { box-sizing: border-box; width: 100%; max-width: calc(1200px + 2 * var(--tp-4));
    margin-inline: auto; padding-inline: var(--tp-4); }
/* Крошки сайта (board/_base.html, .container Bootstrap) на линии контента справочника:
   те же ширина и поля, что у .tp-f-container; селектор специфичнее правил .container.
   На странице с крошками в шапке (.tp-f-crumbs) строка крошек сайта скрыта. */
main:has(.tp-f) > .container:first-child { box-sizing: border-box; max-width: calc(1200px + 2 * var(--tp-4));
    padding-inline: var(--tp-4); }
main:has(.tp-f-crumbs) > .container:first-child:has(> nav[aria-label="breadcrumb"]) { display: none; }
.tp-f .tp-f-stack > * + * { margin-top: var(--tp-6); }
.tp-f-sr { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden;
    clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }

/* Карточки-контейнеры (12.1): белые, скругление 20 px на телефоне и 24 px от 640 px,
   мягкая тень без рамки, отступ 20/32/40 px; стопка карточек с промежутком 24 px,
   на телефоне поля контейнера 12 px. */
.tp-f-box { box-sizing: border-box; min-width: 0; padding: var(--tp-f-box-pad); background: var(--tp-surface);
    border-radius: var(--tp-r-lg2); box-shadow: var(--tp-shadow-card); }
.tp-f-boxes { display: grid; gap: var(--tp-5); padding-top: var(--tp-5); padding-bottom: var(--tp-7); }
.tp-f-boxes > * { min-width: 0; }

/* Крошки внутри шапки страницы (_ui/crumbs.html в nav.tp-f-crumbs): 14 px серым,
   текущая страница цветом текста, разделитель «/» в конце пункта (при переносе на
   телефоне остается в конце строки, а не в начале следующей). Пункты li приходят из тегов
   крошек сайта с классами Bootstrap, их вид здесь задан полностью. */
.tp-f-crumbs { margin: 0 0 var(--tp-5); font-size: var(--tp-fs-sm); line-height: 1.5; }
.tp-f-crumbs__list { display: flex; flex-wrap: wrap; align-items: center; margin: 0; padding: 0; list-style: none; }
.tp-f-crumbs .breadcrumb-item { display: inline-flex; align-items: center; min-width: 0; padding: 0;
    color: var(--tp-ink-muted); overflow-wrap: anywhere; }
.tp-f-crumbs .breadcrumb-item + .breadcrumb-item { padding-left: 0; }
.tp-f-crumbs .breadcrumb-item + .breadcrumb-item::before { content: none; }
.tp-f-crumbs .breadcrumb-item:not(:last-child)::after { content: "/"; padding: 0 var(--tp-2); color: var(--tp-ink-faint); }
.tp-f-crumbs .breadcrumb-item > a { display: inline-flex; align-items: center; min-height: 24px;
    color: var(--tp-ink-muted); text-decoration: none; }
.tp-f-crumbs .breadcrumb-item > a:hover { color: var(--tp-link); text-decoration: underline; }
.tp-f-crumbs .breadcrumb-item.active { color: var(--tp-ink); }

/* Шапка страницы без плитки логотипа (листинг, сеть, хаб, служебные; _ui/page_head.html):
   та же карточка-контейнер и те же строки, что у шапки карточки (.tp-f-card-head__title,
   __type, __meta, __item, __actions, __soft блока card), строки идут потоком без сетки с
   плиткой; отступы между строками задают правила строк шапки карточки. */
.tp-f-phead { display: block; }
.tp-f-phead__link { display: inline-flex; align-items: center; min-height: 24px; color: var(--tp-link);
    text-decoration: none; }
.tp-f-phead__link:hover { text-decoration: underline; text-underline-offset: .15em; }
/* Страницы экскурсий и достопримечательностей города сайта под строкой с числом (firms/crosslinks.py) */
/* Две классовые части: иначе margin: 0 у .tp-f-chips ниже по файлу снимает отступ */
.tp-f-chips.tp-f-phead__site { margin-top: var(--tp-4); }

/* Разделы внутри карточки: без рамки, фона и тени; соседние разделены линией, отступ
   32 px до линии дает промежуток родителя (gap или .tp-f-stack), после линии padding. */
.tp-f-section { margin: 0; padding: 0; background: none; border: 0; border-radius: 0; box-shadow: none; }
.tp-f-section + .tp-f-section { padding-top: var(--tp-6); border-top: 1px solid var(--tp-border); }
.tp-f h1, .tp-f h2 { padding: 0; }
.tp-f-section__title, .tp-f-section > h2 { margin: 0 0 var(--tp-4); color: var(--tp-ink); font-size: var(--tp-fs-xl2);
    font-weight: 700; line-height: 1.25; }

.tp-f-icon { display: inline-block; flex: none; width: 20px; height: 20px; vertical-align: middle; fill: none; }
.tp-f-icon--16 { width: 16px; height: 16px; }
.tp-f-icon--24 { width: 24px; height: 24px; }

/* Кнопки (12.2): 48 px на телефоне, 52 px от 640 px, скругление 12 px, текст 16 px 600,
   иконка 20 px. Главная (одна в блоке): желтая. Мягкая (вместо обведенной второго
   уровня): серый фон без рамки; .tp-f-btn без модификатора выглядит так же. */
.tp-f-btn { box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center;
    gap: var(--tp-2); min-height: var(--tp-f-btn-h); margin: 0; padding: var(--tp-2) var(--tp-4);
    background: var(--tp-btn-soft); color: var(--tp-ink); border: 0; border-radius: var(--tp-r-md);
    font: inherit; font-size: var(--tp-fs-md); font-weight: 600; line-height: 1.25; text-align: center;
    text-decoration: none; cursor: pointer; transition: background-color .15s; }
.tp-f-btn:hover { background: var(--tp-btn-soft-hover); color: var(--tp-ink); }
.tp-f-btn--soft { background: var(--tp-btn-soft); color: var(--tp-ink); }
.tp-f-btn--soft:hover { background: var(--tp-btn-soft-hover); color: var(--tp-ink); }
.tp-f-btn[aria-busy="true"] { cursor: progress; }
.tp-f-btn--primary { background: var(--tp-cta); color: var(--tp-cta-ink); }
.tp-f-btn--primary:hover { background: var(--tp-cta-hover); color: var(--tp-cta-ink); }
.tp-f-btn--block { display: flex; width: 100%; }
/* С рамкой (13.2): белая, рамка --tp-border-strong; кнопка номера полной строки листинга и
   «Показать еще» на сером фоне листинга. */
.tp-f-btn--outline { background: var(--tp-surface); color: var(--tp-ink); border: 1px solid var(--tp-border-strong); }
.tp-f-btn--outline:hover { background: var(--tp-surface); color: var(--tp-ink); border-color: var(--tp-ink-faint); }
.tp-f-btn--icon { width: var(--tp-f-btn-h); padding: 0; }

/* Текстовое действие: только внутри строк данных и подвалов разделов; ссылка или
   кнопка цвета ссылки, иконка 16 px слева, цель не меньше 24 px. */
.tp-f-act { box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--tp-2); min-height: 24px;
    margin: 0; padding: 0; background: none; border: 0; color: var(--tp-link); font: inherit;
    font-size: var(--tp-fs-md); font-weight: 500; line-height: 1.25; text-align: left; text-decoration: none;
    cursor: pointer; }
.tp-f-act:hover { color: var(--tp-link); text-decoration: underline; text-underline-offset: .15em; }
.tp-f-act .tp-f-icon { width: 16px; height: 16px; }

/* Подписи данных вместо иконок: подпись 14 px серым, значение 16 px;
   от 640 px подпись колонкой 160 px слева, ниже над значением. */
.tp-f-dl { display: grid; gap: var(--tp-3); margin: 0; }
.tp-f-dl__row { display: grid; gap: var(--tp-1); min-width: 0; }
.tp-f-dl__row > dt { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); font-weight: 400;
    line-height: 1.5; }
.tp-f-dl__row > dd { margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-md); line-height: 1.5;
    overflow-wrap: anywhere; }

/* Строка фактов текстом через « · » (_ui/facts.html, вместо пилюль). */
p.tp-f-facts { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); line-height: 1.5;
    overflow-wrap: anywhere; }

/* Буква вместо логотипа: нейтральный фон, 48 px или 40 px (строка). */
.tp-f-avatar { box-sizing: border-box; display: inline-flex; flex: none; align-items: center; justify-content: center;
    width: 48px; height: 48px; border-radius: var(--tp-r-md); background: var(--tp-surface-accent);
    color: var(--tp-ink-muted); font-size: var(--tp-fs-xl); font-weight: 600; line-height: 1; }
.tp-f-avatar--48 { width: 48px; height: 48px; }
.tp-f-avatar--40 { width: 40px; height: 40px; border-radius: var(--tp-r-sm); font-size: var(--tp-fs-lg); }
.tp-f-avatar--logo { padding: var(--tp-1); background: var(--tp-surface); border: 1px solid var(--tp-border);
    object-fit: contain; }

/* Статус часов: цветной текст без плашки и точки; классы ставит hours.js,
   место под строку зарезервировано (min-height). */
.tp-f-status { display: inline-block; min-height: 1.5em; margin: 0; color: var(--tp-ink-muted);
    font-size: var(--tp-fs-sm); font-weight: 500; line-height: 1.5; }
.tp-f-status.is-open { color: var(--tp-open); }
.tp-f-status.is-soon { color: var(--tp-amber-ink); }
.tp-f-status.is-closed { color: var(--tp-closed); }

/* Номер в кнопке (12.3): до нажатия начало номера 600 и «Показать» 400, подписи-маски
   под кнопкой нет. После показа phones.js ставит на место кнопки ссылку tel: с ее
   классами (tp-f-phone__link) и шириной не меньше прежней; факс текстом. Строка ошибки
   открывается только после отказа и встает под кнопкой, кнопка не смещается. Если
   номер и «Показать» не помещаются в строку, «Показать» переносится внутри кнопки.
   Номер на всю ширину (--block): ссылка после показа занимает место кнопки по flex
   (без своей ширины), кнопка «Скопировать» встает рядом, а если места нет, переносится
   на следующую строку; номер в ссылке переносится, за пределы карточки ничего не выходит. */
.tp-f-phone { display: inline-grid; justify-items: start; gap: var(--tp-1); max-width: 100%; vertical-align: top; }
.tp-f-phone__main { display: inline-flex; flex-wrap: wrap; align-items: center; max-width: 100%; }
.tp-f-phone__main > .tp-f-btn--icon, .tp-f-phone__main > .tp-f-phone__note:not(:empty) { margin-left: var(--tp-2); }
.tp-f-phone__show, .tp-f-phone__link { flex-wrap: wrap; row-gap: 0; max-width: 100%; }
.tp-f-phone__num { font-weight: 600; white-space: nowrap; font-variant-numeric: tabular-nums; }
.tp-f-phone__hint { font-weight: 400; white-space: nowrap; }
.tp-f-phone__label { display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--tp-2); min-width: 0; }
.tp-f-btn--outline .tp-f-phone__num { color: var(--tp-ink); font-size: var(--tp-fs-lg); }
.tp-f-btn--outline .tp-f-phone__hint { color: var(--tp-link); font-weight: 600; }
.tp-f-phone__fax { box-sizing: border-box; display: inline-flex; align-items: center; min-height: var(--tp-f-btn-h);
    color: var(--tp-ink); font-weight: 600; white-space: nowrap; }
.tp-f-phone__note { color: var(--tp-ink-muted); font-size: var(--tp-fs-xs); }
.tp-f-phone__error { color: var(--tp-closed); font-size: var(--tp-fs-xs); line-height: 1.4; }
.tp-f-phone__card { display: inline-flex; align-items: center; min-height: 44px; }
.tp-f-phone--block { display: grid; justify-self: stretch; width: 100%; }
.tp-f-phone--block .tp-f-phone__main { display: flex; flex-wrap: wrap; row-gap: var(--tp-2); width: 100%; }
.tp-f-phone--block .tp-f-phone__show, .tp-f-phone--block .tp-f-phone__link,
.tp-f-phone--block .tp-f-phone__fax { flex: 1 1 auto; min-width: 0; }
.tp-f-phone--block .tp-f-phone__link .tp-f-phone__num, .tp-f-phone--block .tp-f-phone__fax .tp-f-phone__num {
    min-width: 0; white-space: normal; overflow-wrap: anywhere; }

.tp-f-rating { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--tp-2); margin: 0;
    font-size: var(--tp-fs-sm); }
.tp-f-stars { display: inline-flex; color: var(--tp-star); }
.tp-f-star { display: inline-flex; }
.tp-f-star.is-on .tp-f-icon { fill: currentColor; }
.tp-f-rating__link { display: inline-flex; align-items: center; gap: var(--tp-2); min-height: 24px;
    color: var(--tp-ink); text-decoration: none; }
.tp-f-rating__link:hover .tp-f-rating__count { text-decoration: underline; }
.tp-f-rating__avg { font-weight: 700; }
.tp-f-rating__count { color: var(--tp-ink-muted); }
.tp-f-rating__first { display: inline-flex; align-items: center; min-height: 24px; color: var(--tp-link); }

.tp-f-chips { display: flex; flex-wrap: wrap; gap: var(--tp-2); margin: 0; padding: 0; list-style: none; }
.tp-f-chip { box-sizing: border-box; display: inline-flex; align-items: center; min-height: 32px;
    padding: var(--tp-1) var(--tp-3); background: var(--tp-surface); color: var(--tp-ink);
    border: 1px solid var(--tp-border-strong); border-radius: var(--tp-r-pill); font-size: var(--tp-fs-sm);
    line-height: 1.3; text-decoration: none; }
a.tp-f-chip:hover { border-color: var(--tp-link); color: var(--tp-link); }
.tp-f-chip--more { color: var(--tp-ink-muted); border-style: dashed; }

.tp-f :focus-visible, .tp-f-btn:focus-visible, .tp-f-act:focus-visible, .tp-f-chip:focus-visible,
.tp-f-rating a:focus-visible, .tp-f-phone__link:focus-visible {
    outline: 2px solid var(--tp-link); outline-offset: 2px; }

@media (max-width: 639.98px) {
    .tp-f-container.tp-f-boxes { padding-top: var(--tp-3); padding-inline: var(--tp-3); }
}
@media (min-width: 640px) {
    .tp-f { --tp-f-box-pad: var(--tp-6); --tp-f-btn-h: calc(var(--tp-7) + var(--tp-1)); }
    .tp-f-box { border-radius: var(--tp-r-xl); }
    .tp-f-btn { padding-inline: var(--tp-5); }
    .tp-f-btn--icon { padding: 0; }
    .tp-f-dl__row { grid-template-columns: var(--tp-f-label-w) minmax(0, 1fr); column-gap: var(--tp-4);
        align-items: baseline; }
}
@media (min-width: 768px) {
    .tp-f-container { max-width: calc(1200px + 2 * var(--tp-5)); padding-inline: var(--tp-5); }
    main:has(.tp-f) > .container:first-child { max-width: calc(1200px + 2 * var(--tp-5)); padding-inline: var(--tp-5); }
}
@media (min-width: 1024px) {
    .tp-f { --tp-f-box-pad: calc(var(--tp-6) + var(--tp-2)); }
}
@media (prefers-reduced-motion: no-preference) {
    html:has(.tp-f) { scroll-behavior: smooth; }
}
@media (prefers-reduced-motion: reduce) {
    .tp-f *, .tp-f *::before, .tp-f *::after { animation-duration: .01ms !important;
        animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
}

/* == row == */
/* Строка организации firms/_ui/row.html. Полная строка (переработка 05.10.2026, владелец разрешил
   менять структуру): листинг, страница сети, поиск хаба. Белая карточка (рамка, радиус 20, тень
   карточки); название и сведения одной колонкой, связь справа колонкой 360 px, когда строка шире
   600 px (container query по article), уже - связь под сведениями; вертикальных линий нет. Вся
   строка ведет на карточку (растянутая ссылка названия), чипы, оценка и кнопка номера поверх нее.
   Название цветом текста 18 px 600, на телефоне до двух строк, шире 600 px в одну строку с
   многоточием (полное в title); при наведении на
   строку цветом ссылки и рамка темнее (и у строки, чья метка под курсором, .is-active). Факты
   (реестр, год) строкой с иконками 16 px без плашек; адрес 16 px, сайт 14 px серым; чипы разделов
   мягкими плашками; статус цветным текстом с точкой, как в карточке. На странице сети
   (tp-f-row--plain) название строки - адрес офиса, без плитки и чипов. Части с data-balloon-part
   копируются в балун карты (.tp-f-balloon, listing_map.js). Ссылок наружу и «Маршрута» в строке и
   балуне нет: только ссылки на карточку и чипы разделов.
   Компактная строка (tp-f-row--compact, 6.1): разделы карточки и туроператоры хаба; без рамки и
   фона, линия снизу по краю содержимого, фон наведения с выступом 12 px; ссылок наружу и
   «Маршрута» в ней тоже нет (правило владельца 02.10.2026). */
.tp-f { --tp-f-row-logo: var(--tp-7);
    --tp-f-row-side: calc(var(--tp-8) * 5 + var(--tp-6) + var(--tp-2)); }
.tp-f-rows { display: flex; flex-direction: column; min-width: 0; }
.tp-f-row { box-sizing: border-box; position: relative; min-width: 0; }
.tp-f-row:not(.tp-f-row--compact) { container-type: inline-size; }

/* Полная строка: одна колонка */
.tp-f-row__card { box-sizing: border-box; display: grid; gap: var(--tp-4); min-width: 0;
    padding: calc(var(--tp-4) + var(--tp-1)); background: var(--tp-surface); border: 1px solid var(--tp-border);
    border-radius: var(--tp-r-lg2); box-shadow: var(--tp-shadow-card); transition: border-color .15s; }
.tp-f-row.is-active .tp-f-row__card { border-color: var(--tp-border-strong); }
.tp-f-row__card > * { min-width: 0; }
.tp-f-row__org { display: grid; justify-items: start; gap: var(--tp-2); }
.tp-f-row__id { display: flex; align-items: center; gap: var(--tp-3); width: 100%; min-width: 0; }
.tp-f-row__logo { box-sizing: border-box; display: flex; flex: none; align-items: center; justify-content: center;
    width: var(--tp-f-row-logo); height: var(--tp-f-row-logo); overflow: hidden; border-radius: var(--tp-r-md);
    background: var(--tp-logo-bg); color: var(--tp-amber-ink); font-size: var(--tp-fs-xl); font-weight: 700;
    line-height: 1; }
.tp-f-row__logo--img { background: var(--tp-surface); border: 1px solid var(--tp-border); }
.tp-f-row__logo img { display: block; width: 100%; height: 100%; object-fit: contain; }
.tp-f-row__titles { display: grid; gap: 2px; min-width: 0; }
.tp-f-row__title { display: -webkit-box; margin: 0; overflow: hidden; color: var(--tp-ink); font-size: var(--tp-fs-lg);
    font-weight: 600; line-height: 1.3; overflow-wrap: anywhere; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
    line-clamp: 2; }
.tp-f .tp-f-row__title a { color: inherit; text-decoration: none; }
.tp-f-row__title a::before { content: ""; position: absolute; inset: 0; border-radius: var(--tp-r-lg2); }
.tp-f-row__kind { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); line-height: 1.45;
    overflow-wrap: anywhere; }
/* Оценка в строке строкой текста, без плашки: звезды 16 px, балл 14 px 600, черта и число
   отзывов 14 px серым; от 600 px на линии текста (отступ на ширину плитки). */
.tp-f-row .tp-f-hrating { flex-wrap: nowrap; gap: var(--tp-2); max-width: 100%; min-height: 24px; margin: 0; padding: 0;
    background: none; border-radius: 0; }
.tp-f-row .tp-f-hstar, .tp-f-row .tp-f-hstar .tp-f-icon { width: 16px; height: 16px; }
.tp-f-row .tp-f-hrating__avg { font-size: var(--tp-fs-sm); font-weight: 600; line-height: 1.45; }
.tp-f-row .tp-f-hrating__count { gap: var(--tp-2); color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); white-space: nowrap; }
.tp-f-row .tp-f-hrating__count::before { height: var(--tp-3); }
.tp-f-row .tp-f-hrating, .tp-f-row .tp-f-chip, .tp-f-row__contact { position: relative; z-index: 1; }

.tp-f-row__info { display: grid; justify-items: start; gap: var(--tp-2); }
.tp-f-row__pills { display: flex; flex-wrap: wrap; gap: var(--tp-1) var(--tp-4); margin: 0; padding: 0; list-style: none; }
.tp-f-row__pill { display: inline-flex; align-items: center; gap: var(--tp-1); max-width: 100%; color: var(--tp-ink-muted);
    font-size: var(--tp-fs-sm); line-height: 1.45; }
.tp-f-row__pill .tp-f-icon { width: 16px; height: 16px; color: var(--tp-ink-muted); }
.tp-f-row__pill--registry .tp-f-icon { color: var(--tp-open); }
.tp-f-row__line { display: flex; align-items: flex-start; gap: var(--tp-2); min-width: 0; margin: 0; color: var(--tp-ink);
    font-size: var(--tp-fs-md); line-height: 1.5; }
.tp-f-row__line > .tp-f-icon { width: 18px; height: 18px; margin-top: 3px; color: var(--tp-ink-muted); }
.tp-f-row__text { display: grid; min-width: 0; overflow-wrap: anywhere; }
.tp-f-row__addr { color: var(--tp-ink); }
.tp-f-row__host { color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-row .tp-f-chips { margin-top: var(--tp-1); }
.tp-f-row .tp-f-chip { min-height: var(--tp-6); padding: 0 var(--tp-3); border: 0; border-radius: var(--tp-r-sm);
    background: var(--tp-btn-soft); color: var(--tp-ink); font-size: var(--tp-fs-sm); }
.tp-f-row a.tp-f-chip { color: var(--tp-link); }
.tp-f-row a.tp-f-chip:hover { background: var(--tp-btn-soft-hover); color: var(--tp-link); }
.tp-f-row .tp-f-chip--more { background: none; color: var(--tp-ink-muted); }

.tp-f-row__contact { display: grid; align-content: start; gap: var(--tp-3); }
.tp-f-row__call { min-width: 0; }
.tp-f-row__call .tp-f-phone__show, .tp-f-row__call .tp-f-phone__link { flex-wrap: nowrap; justify-content: flex-start;
    gap: var(--tp-3); padding-inline: var(--tp-4); text-align: left; }
.tp-f-row__call .tp-f-phone__label { flex: 1 1 auto; flex-wrap: wrap; justify-content: space-between; }
.tp-f-row__today { display: flex; flex-wrap: wrap; align-items: center; gap: var(--tp-1) var(--tp-3); }
.tp-f-row__hours { display: inline-flex; align-items: center; gap: var(--tp-1); margin: 0; color: var(--tp-ink-muted);
    font-size: var(--tp-fs-sm); line-height: 1.45; white-space: nowrap; }
.tp-f-row__hours .tp-f-icon { width: 16px; height: 16px; color: var(--tp-ink-muted); }
.tp-f-row__today .tp-f-status { order: -1; display: inline-flex; align-items: center; gap: var(--tp-2); min-height: 0;
    margin: 0; font-size: var(--tp-fs-sm); font-weight: 600; line-height: 1.45; white-space: nowrap; }
.tp-f-row__today .tp-f-status::before { content: ""; flex: none; width: var(--tp-2); height: var(--tp-2);
    border-radius: 50%; background: currentColor; }
.tp-f-row__today .tp-f-status:empty { display: none; }
.tp-f-row--plain .tp-f-row__logo { display: none; }

/* Шире 600 px: название и сведения слева одной колонкой (сведения под названием, с отступом
   на ширину плитки), связь справа колонкой 360 px (кнопка номера в одну строку) */
@container (min-width: 600px) {
    .tp-f-row__card { grid-template-columns: minmax(0, 1fr) var(--tp-f-row-side);
        grid-template-areas: "org contact" "info contact"; align-items: start; gap: var(--tp-3) var(--tp-6);
        padding: var(--tp-5); }
    .tp-f-row__org { grid-area: org; }
    .tp-f-row__title { display: block; text-overflow: ellipsis; white-space: nowrap; }
    .tp-f-row--plain .tp-f-row__card { align-items: center; }
    .tp-f-row__info, .tp-f-row__org > .tp-f-hrating { padding-left: calc(var(--tp-f-row-logo) + var(--tp-3)); }
    .tp-f-row__info { grid-area: info; }
    .tp-f-row--plain .tp-f-row__info, .tp-f-row--plain .tp-f-row__org > .tp-f-hrating { padding-left: 0; }
    .tp-f-row__contact { grid-area: contact; }
}

/* Компактная строка */
.tp-f-row--compact { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--tp-3);
    margin-inline: calc(-1 * var(--tp-3)); padding: var(--tp-3); transition: background-color .15s; }
.tp-f-row--compact::after { content: ""; position: absolute; right: var(--tp-3); bottom: 0; left: var(--tp-3);
    border-bottom: 1px solid var(--tp-border); pointer-events: none; }
.tp-f-row--compact.is-active { background: var(--tp-surface-tint); }
.tp-f-row__body { display: grid; gap: var(--tp-1); min-width: 0; }
.tp-f-row__head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between;
    gap: var(--tp-1) var(--tp-3); }
.tp-f-row__name { flex: 1 1 auto; min-width: 0; margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-lg);
    font-weight: 600; line-height: 1.3; overflow-wrap: anywhere; }
.tp-f-row__rating { display: inline-flex; flex: none; align-items: center; gap: var(--tp-1); min-height: 24px;
    color: var(--tp-ink); font-size: var(--tp-fs-sm); line-height: 1.45; text-decoration: none; }
.tp-f-row__rating .tp-f-icon { color: var(--tp-star); fill: var(--tp-star); }
.tp-f-row__score { font-weight: 600; }
.tp-f-row__count { color: var(--tp-ink-muted); }
.tp-f-row__rating:hover .tp-f-row__count { color: var(--tp-link); text-decoration: underline; }
.tp-f-row__meta { display: flex; flex-wrap: wrap; align-items: center; gap: 0 var(--tp-2); margin: 0;
    color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); line-height: 1.45; }
.tp-f-row__meta > * + *::before { content: "·"; display: inline-block; margin-right: var(--tp-2);
    color: var(--tp-ink-muted); }
.tp-f-row__chain { display: inline-flex; align-items: center; min-height: 24px; }
a.tp-f-row__chain { color: var(--tp-link); text-decoration: none; }
a.tp-f-row__chain:hover { text-decoration: underline; text-underline-offset: .15em; }
.tp-f-row__place { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--tp-2); margin: 0;
    color: var(--tp-ink); font-size: var(--tp-fs-md); line-height: 1.5; }
.tp-f-row__address { min-width: 0; overflow-wrap: anywhere; }
.tp-f-row__metro { color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-row__state { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--tp-2);
    font-size: var(--tp-fs-sm); line-height: 1.45; }
.tp-f-row__status .tp-f-status { margin: 0; font-size: var(--tp-fs-sm); }
.tp-f-row__facts { color: var(--tp-ink-muted); }
.tp-f-row__facts .tp-f-facts { display: inline; margin: 0; color: inherit; font-size: inherit; }
.tp-f-row__status + .tp-f-row__facts::before { content: "·"; display: inline-block; margin-right: var(--tp-2); }
.tp-f-row__status:has(.tp-f-status:empty) + .tp-f-row__facts::before { content: none; }

.tp-f-row a:focus-visible, .tp-f-row button:focus-visible { outline: 2px solid var(--tp-link); outline-offset: 2px; }

/* Копия частей полной строки в балуне карты: название 16 px, номер мягкой кнопкой на всю ширину
   балуна под статусом */
.tp-f-balloon .tp-f-row__title { font-size: var(--tp-fs-md); white-space: normal; }
.tp-f-balloon .tp-f-row__kind, .tp-f-balloon .tp-f-row__line, .tp-f-balloon .tp-f-row__hours,
.tp-f-balloon .tp-f-row__today .tp-f-status { font-size: var(--tp-fs-sm); }
.tp-f-balloon .tp-f-row__line > .tp-f-icon, .tp-f-balloon .tp-f-row__hours .tp-f-icon { display: none; }
.tp-f-balloon .tp-f-row__today { min-height: 0; justify-content: flex-start; padding-top: 0; border-top: 0; }
.tp-f-balloon .tp-f-row__call { order: 1; }
.tp-f-balloon .tp-f-balloon__more { order: 2; }
.tp-f-balloon .tp-f-row__call .tp-f-btn { width: 100%; min-height: 44px; background: var(--tp-btn-soft); border-color: transparent;
    font-size: var(--tp-fs-sm); }
.tp-f-balloon .tp-f-row__call .tp-f-phone__num { font-size: var(--tp-fs-sm); }

@media (hover: hover) {
    .tp-f-row:hover .tp-f-row__card { border-color: var(--tp-border-strong); }
    .tp-f-row:hover .tp-f-row__title a { color: var(--tp-link); text-decoration: underline; text-underline-offset: .15em; }
    .tp-f-row--compact:hover { background: var(--tp-surface-tint); }
}
@media (prefers-reduced-motion: reduce) {
    .tp-f-row--compact, .tp-f-row__card { transition: none; }
}

/* == card == */
/* Карточка организации, этап 9 (спецификация доводки, разделы 5 и 12). Серый фон
   страницы, белые карточки-контейнеры (.tp-f-box, base): шапка с крошками, плиткой
   логотипа, значком реестра, мета-строкой с иконками и переключателем офисов сети,
   плашкой рейтинга и рядом кнопок; ниже две колонки от 1024 px: слева одна карточка
   со всеми разделами (навигатор липкой полосой по ее верху), справа панель контактов
   отдельной липкой карточкой 360 px; на телефоне контакты первой карточкой после
   шапки. Здесь же классы, общие со страницей отзывов: .tp-f-cp*, .tp-f-rsum*,
   .tp-f-dist*, .tp-f-review*, .tp-f-note, .tp-f-owner, .tp-f-reveal.
   Именованные размеры выведены из токенов: 48, 360, 200, 40, 6, 240, 320, 8, 88, 64, 20. */
.tp-f { --tp-f-nav-h: var(--tp-7);
    --tp-f-panel-w: calc(var(--tp-8) * 5 + var(--tp-6) + var(--tp-2));
    --tp-f-dt-w: calc(var(--tp-8) * 3 + var(--tp-2));
    --tp-f-avatar-sm: calc(var(--tp-6) + var(--tp-2));
    --tp-f-dist-h: calc(var(--tp-1) * 1.5);
    --tp-f-map-h: calc(var(--tp-8) * 3 + var(--tp-7));
    --tp-f-map-h-lg: calc(var(--tp-8) * 5);
    --tp-f-chevron: var(--tp-2);
    --tp-f-logo: calc(var(--tp-8) + var(--tp-5));
    --tp-f-logo-sm: var(--tp-7);
    --tp-f-line-h: calc(var(--tp-4) + var(--tp-1));
    --tp-f-h1: var(--tp-fs-xl2); }

/* Шапка (12.4): сетка из плитки логотипа и текстовой колонки через 24 px; на телефоне
   рейтинг, примечание и мета-строка на всю ширину под плиткой, от 1024 px рейтинг
   справа вверху. Обертка __main раскладывает свои строки прямо в сетку (contents);
   промежутки между строками задают отступы строк, пустые строки сетки места не берут. */
.tp-f-card-head { display: grid; }
.tp-f-card-head__top { display: grid; grid-template-columns: var(--tp-f-logo-sm) minmax(0, 1fr);
    grid-template-areas: "logo title" "logo type" "note note" "side side" "meta meta"; column-gap: var(--tp-5);
    align-items: start; }
.tp-f-card-head__main { display: contents; }
.tp-f-card-head__logo { box-sizing: border-box; grid-area: logo; display: flex; align-items: center;
    justify-content: center; width: var(--tp-f-logo-sm); height: var(--tp-f-logo-sm); overflow: hidden;
    border-radius: var(--tp-r-lg2); background: var(--tp-logo-bg); color: var(--tp-amber-ink);
    font-size: var(--tp-fs-xl2); font-weight: 700; line-height: 1; }
.tp-f-card-head__logo--img { background: var(--tp-surface); border: 1px solid var(--tp-border); }
.tp-f-card-head__logo img { display: block; width: 100%; height: 100%; object-fit: contain; }
.tp-f-card-head__titleline { grid-area: title; min-width: 0; color: var(--tp-ink); font-size: var(--tp-f-h1); font-weight: 700;
    line-height: 1.15; }
.tp-f-card-head__title { display: inline; margin: 0; font: inherit; color: inherit; overflow-wrap: anywhere; }
.tp-f-card-head__badge { display: inline-flex; align-items: center; height: 1.15em; margin-left: var(--tp-2);
    vertical-align: top; color: var(--tp-link); }
/* Строка типа текстом: точка-разделитель держится за предыдущим словом, перенос
   после нее (пробел нулевой ширины), поэтому строка не начинается с точки. */
.tp-f-card-head__type { grid-area: type; min-width: 0; margin: var(--tp-1) 0 0; color: var(--tp-ink-muted);
    font-size: var(--tp-fs-lg); line-height: 1.45; overflow-wrap: anywhere; }
.tp-f-card-head__type > :not(:last-child)::after { content: "·\200b"; margin-left: var(--tp-2);
    padding-right: var(--tp-2); color: var(--tp-ink-muted); }
a.tp-f-card-head__chain { color: var(--tp-link); text-decoration: underline; text-underline-offset: .15em; }
a.tp-f-card-head__chain:hover { text-decoration-thickness: 2px; }
.tp-f-card-head__note { grid-area: note; margin: var(--tp-3) 0 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }

/* Рейтинг: плашка с пятью звездами (дробная заливка последней по баллу: вторая
   иконка звезды поверх первой обрезана справа по классу tp-f-hstar--N, N десятых),
   балл, черта и число отзывов ссылкой; без отзывов ссылка «Оставить первый отзыв»;
   просмотры 14 px под плашкой. От 1024 px плашка (40 px) и ссылка по центру первой
   строки H1 (строка 46 px: 40 x 1.15). */
.tp-f-card-head__side { grid-area: side; display: grid; justify-items: start; gap: var(--tp-2); margin-top: var(--tp-4); }
.tp-f-hrating { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--tp-2) var(--tp-3); margin: 0;
    padding: var(--tp-2) var(--tp-4); background: var(--tp-rating-bg); border-radius: var(--tp-r-pill); }
.tp-f-hrating__stars { display: inline-flex; }
.tp-f-hstar { --tp-f-fill: 0%; position: relative; display: inline-flex; width: var(--tp-f-line-h);
    height: var(--tp-f-line-h); }
.tp-f-hstar .tp-f-icon { color: var(--tp-border-strong); fill: var(--tp-border-strong); }
.tp-f-hstar .tp-f-icon + .tp-f-icon { position: absolute; inset: 0; color: var(--tp-star); fill: var(--tp-star);
    clip-path: inset(0 calc(100% - var(--tp-f-fill)) 0 0); }
.tp-f-hstar--1 { --tp-f-fill: 10%; }
.tp-f-hstar--2 { --tp-f-fill: 20%; }
.tp-f-hstar--3 { --tp-f-fill: 30%; }
.tp-f-hstar--4 { --tp-f-fill: 40%; }
.tp-f-hstar--5 { --tp-f-fill: 50%; }
.tp-f-hstar--6 { --tp-f-fill: 60%; }
.tp-f-hstar--7 { --tp-f-fill: 70%; }
.tp-f-hstar--8 { --tp-f-fill: 80%; }
.tp-f-hstar--9 { --tp-f-fill: 90%; }
.tp-f-hstar--10 { --tp-f-fill: 100%; }
.tp-f-hrating__avg { color: var(--tp-ink); font-size: var(--tp-fs-lg); font-weight: 700; line-height: 1; }
.tp-f-hrating__count { display: inline-flex; align-items: center; gap: var(--tp-3); min-height: 24px;
    color: var(--tp-ink-muted); font-size: var(--tp-fs-md); text-decoration: none; }
.tp-f-hrating__count::before { content: ""; flex: none; width: 1px; height: var(--tp-f-line-h);
    background: var(--tp-border-strong); }
.tp-f-hrating__count:hover { color: var(--tp-link); text-decoration: underline; text-underline-offset: .15em; }
/* Без отзывов в шапке кнопка с рамкой 44 px (вторичная к ряду действий), 14 px 600 с иконкой. */
.tp-f-hrating__first { min-height: 44px; padding: var(--tp-2) var(--tp-4); font-size: var(--tp-fs-sm); }
.tp-f-card-head__views { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }

/* Мета-строка: пункты 16 px с иконкой 20 px серым; от 640 px в строку с вертикальной
   чертой 1x20 px и промежутком 24 px, на телефоне столбиком без черт. */
.tp-f-card-head__meta { grid-area: meta; display: grid; gap: var(--tp-2); margin: var(--tp-4) 0 0; padding: 0;
    list-style: none; font-size: var(--tp-fs-md); line-height: 1.5; }
.tp-f-card-head__item { display: flex; align-items: center; gap: var(--tp-2); min-width: 0; min-height: 24px;
    color: var(--tp-ink); }
.tp-f-card-head__item > .tp-f-icon { color: var(--tp-ink-muted); }
.tp-f-card-head__item > .tp-f-status { min-height: 0; font-size: var(--tp-fs-md); }
.tp-f-card-head__address { min-width: 0; overflow-wrap: anywhere; }

/* Переключатель офисов сети: без JS ссылка на страницу сети, с JS кнопка; список
   всплывающим слоем под кнопкой (рамка, радиус 12, тень), текущий офис без ссылки. */
.tp-f-offices { position: relative; }
.tp-f-offices__toggle { display: inline-flex; align-items: center; gap: var(--tp-2); min-height: 24px; margin: 0;
    padding: 0; background: none; border: 0; color: var(--tp-ink); font: inherit; text-align: left;
    text-decoration: none; cursor: pointer; }
.tp-f-offices__toggle > .tp-f-icon { color: var(--tp-ink-muted); }
.tp-f-offices__toggle:hover { color: var(--tp-link); }
.tp-f-offices__toggle > .tp-f-icon--16 { transition: transform .15s; }
.tp-f-offices__toggle[aria-expanded="true"] > .tp-f-icon--16 { transform: rotate(180deg); }
.tp-f-offices__pop { box-sizing: border-box; position: absolute; top: calc(100% + var(--tp-2)); left: 0; z-index: 21;
    width: min(var(--tp-f-panel-w), calc(100vw - var(--tp-8))); max-height: calc(var(--tp-8) * 7); overflow-y: auto;
    padding: var(--tp-1) 0 0; background: var(--tp-surface); border: 1px solid var(--tp-border);
    border-radius: var(--tp-r-md); box-shadow: var(--tp-shadow-md); }
.tp-f-offices__list { margin: 0; padding: 0; list-style: none; }
.tp-f-offices__item { display: grid; justify-items: start; padding: var(--tp-2) var(--tp-4); }
.tp-f-offices__item + .tp-f-offices__item { border-top: 1px solid var(--tp-border); }
.tp-f-offices__item.is-current { background: var(--tp-surface-tint); }
.tp-f-offices__name { display: inline-flex; align-items: center; min-height: 24px; color: var(--tp-ink);
    font-weight: 600; text-decoration: none; overflow-wrap: anywhere; }
a.tp-f-offices__name { color: var(--tp-link); }
a.tp-f-offices__name:hover { text-decoration: underline; text-underline-offset: .15em; }
.tp-f-offices__here { color: var(--tp-ink-muted); font-size: var(--tp-fs-xs); }
.tp-f-offices__address { color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-offices__item > .tp-f-status { font-size: var(--tp-fs-sm); }
.tp-f-offices__all { display: flex; align-items: center; min-height: 44px; padding: var(--tp-2) var(--tp-4);
    border-top: 1px solid var(--tp-border); color: var(--tp-link); font-weight: 600; text-decoration: none; }
.tp-f-offices__all:hover { text-decoration: underline; text-underline-offset: .15em; }

/* Ряд действий (отступ 32 px): главная кнопка с номером, мягкие «Маршрут», «Сайт»,
   «Поделиться». На телефоне главная на всю ширину, мягкие в ряд равной ширины; при
   трех кнопках уже 480 px иконка над подписью, уже 360 px иконки скрыты. */
.tp-f-card-head__actions { display: grid; gap: var(--tp-3); margin-top: var(--tp-6); }
.tp-f-card-head__soft { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: var(--tp-3); }
.tp-f-card-head__soft > .tp-f-btn { min-width: 0; padding-inline: var(--tp-2); }

/* Навигатор разделов: липкая полоса по верху карточки разделов (на всю ее ширину,
   белая, линия снизу); на телефоне прокрутка без полосы и затухание справа (класс
   is-end ставит card.js у правого края). */
.tp-f-sectnav { position: sticky; top: 0; z-index: 20; margin: calc(-1 * var(--tp-f-box-pad))
    calc(-1 * var(--tp-f-box-pad)) 0; padding-inline: var(--tp-f-box-pad); background: var(--tp-surface);
    border-bottom: 1px solid var(--tp-border); border-radius: var(--tp-r-lg2) var(--tp-r-lg2) 0 0; }
.tp-f-sectnav__list { display: flex; gap: var(--tp-5); height: var(--tp-f-nav-h); margin: 0; padding: 0; list-style: none;
    overflow-x: auto; scrollbar-width: none;
    -webkit-mask-image: linear-gradient(to right, var(--tp-ink) calc(100% - var(--tp-6)), transparent);
    mask-image: linear-gradient(to right, var(--tp-ink) calc(100% - var(--tp-6)), transparent); }
.tp-f-sectnav__list.is-end { -webkit-mask-image: none; mask-image: none; }
.tp-f-sectnav__list::-webkit-scrollbar { display: none; }
.tp-f-sectnav__list > li { display: flex; flex: none; }
.tp-f-sectnav__link { box-sizing: border-box; display: inline-flex; align-items: center; height: 100%;
    border-top: 2px solid transparent; border-bottom: 2px solid transparent; color: var(--tp-ink-muted);
    font-size: var(--tp-fs-sm); font-weight: 500; text-decoration: none; white-space: nowrap; }
.tp-f-sectnav__link:hover { color: var(--tp-ink); }
.tp-f-sectnav__link[aria-current="true"] { color: var(--tp-link); border-bottom-color: var(--tp-link); }

/* Тело: на телефоне панель контактов первой карточкой, затем карточка разделов */
.tp-f-card-body { display: grid; gap: var(--tp-5); }
.tp-f-card-body__aside { min-width: 0; scroll-margin-top: var(--tp-4); }
.tp-f-card-body__main, .tp-f-card-body__main > * { min-width: 0; }
.tp-f-card .tp-f-section { scroll-margin-top: calc(var(--tp-f-nav-h) + var(--tp-4)); }
.tp-f-card .tp-f-section:focus { outline: none; }
.tp-f-section__more { margin: var(--tp-4) 0 0; }
.tp-f-note { max-width: 72ch; margin: var(--tp-3) 0 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-xs); line-height: 1.5; }
.tp-f-about { margin: 0; overflow-wrap: anywhere; }
.tp-f-owner { display: block; margin-top: var(--tp-1); color: var(--tp-ink-muted); font-size: var(--tp-fs-xs); }

/* Панель контактов: карточка (.tp-f-box), статус с иконкой часов, строки с подписями,
   кнопки номеров мягкие на всю ширину, ряд мягких «Маршрут» и «Скопировать адрес»
   (кнопка, которой не хватает места, переносится на свою строку во всю ширину). */
.tp-f-cp { display: grid; gap: var(--tp-4); }
.tp-f-cp__title { margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-xl2); font-weight: 700; line-height: 1.25; }
.tp-f-cp__status { display: flex; align-items: center; gap: var(--tp-2); margin: 0; }
.tp-f-cp__status > .tp-f-icon { color: var(--tp-ink-muted); }
.tp-f-cp__status > .tp-f-status { min-height: 0; font-size: var(--tp-fs-md); }
.tp-f-cp__list { display: grid; gap: var(--tp-4); margin: 0; }
.tp-f-cp__row { display: grid; gap: var(--tp-1); min-width: 0; }
.tp-f-cp__term { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); font-weight: 400; line-height: 1.5; }
.tp-f-cp__value { display: grid; gap: var(--tp-1); justify-items: start; min-width: 0; margin: 0; overflow-wrap: anywhere; }
.tp-f-cp__value a:not([class]) { display: inline-flex; align-items: center; min-height: var(--tp-5); }
.tp-f-cp__phones, .tp-f-cp__socials { display: grid; margin: 0; padding: 0; list-style: none; }
.tp-f-cp__phones { gap: var(--tp-3); justify-self: stretch; }
.tp-f-cp__socials { gap: var(--tp-1); }
.tp-f-cp__phone { display: grid; gap: var(--tp-1); justify-items: start; }
.tp-f-cp__note { color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-cp__acts { display: flex; flex-wrap: wrap; gap: var(--tp-3); }
.tp-f-cp__acts > .tp-f-btn { flex: 1 1 auto; }
.tp-f-reveal { display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--tp-2); min-height: var(--tp-5);
    margin: 0; padding: 0; border: 0; background: none; color: var(--tp-ink); font: inherit; text-align: left; cursor: pointer; }
.tp-f-reveal__hint { color: var(--tp-link); font-size: var(--tp-fs-sm); }
.tp-f-reveal:hover .tp-f-reveal__hint { text-decoration: underline; }

/* Проверка, часы, услуги */
.tp-f-verify { display: grid; gap: var(--tp-4); margin: 0; padding: 0; list-style: none; }
.tp-f-verify__item { display: grid; gap: var(--tp-1); }
.tp-f-verify__text { margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-md); }
.tp-f-verify__note { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-xs); }
.tp-f-week { width: 100%; margin-top: var(--tp-3); border-collapse: collapse; font-variant-numeric: tabular-nums; }
.tp-f-week th, .tp-f-week td { padding: var(--tp-1) 0; color: var(--tp-ink); font-weight: 400; text-align: left;
    vertical-align: baseline; }
.tp-f-week th { width: 50%; padding-right: var(--tp-4); color: var(--tp-ink-muted); }
.tp-f-week tr.is-today th, .tp-f-week tr.is-today td { color: var(--tp-ink); font-weight: 600; }
.tp-f-week__today { margin-left: var(--tp-1); color: var(--tp-ink-muted); font-size: var(--tp-fs-xs); font-weight: 400; }
.tp-f-holidays { display: grid; gap: var(--tp-1); margin: var(--tp-3) 0 0; padding: 0; list-style: none;
    color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
/* Списки разделов плашками 32 px (44 px на сенсорных экранах): мягкий фон, скругление 8 px,
   пункт со ссылкой цветом ссылки; «+ N» (остаток списка, card.js) белой плашкой с рамкой. */
.tp-f-terms { display: flex; flex-wrap: wrap; gap: var(--tp-2); margin: 0; padding: 0; list-style: none;
    font-size: var(--tp-fs-sm); }
.tp-f-terms > li { display: flex; }
.tp-f-terms a, .tp-f-terms span, .tp-f-terms__more { box-sizing: border-box; display: inline-flex; align-items: center;
    min-height: var(--tp-6); padding: 0 var(--tp-3); border-radius: var(--tp-r-sm); background: var(--tp-btn-soft);
    color: var(--tp-ink); line-height: 1.3; text-decoration: none; }
.tp-f-terms a { color: var(--tp-link); }
.tp-f-terms a:hover { background: var(--tp-btn-soft-hover); text-decoration: underline; text-underline-offset: .15em; }
.tp-f-terms__more { margin: 0; border: 0; background: var(--tp-surface); box-shadow: inset 0 0 0 1px var(--tp-border-strong);
    font: inherit; font-weight: 600; cursor: pointer; }
.tp-f-terms__more:hover { box-shadow: inset 0 0 0 1px var(--tp-ink-faint); }
.tp-f-terms__more[aria-busy="true"] { color: var(--tp-ink-muted); cursor: progress; }
.tp-f-terms a:focus-visible, .tp-f-terms__more:focus-visible, .tp-f-terms li[tabindex]:focus-visible {
    outline: 2px solid var(--tp-link); outline-offset: 2px; }
/* Сведения группами: строки через линию, значения текстом через запятую (16 px), подпись 14 px
   серым над значением, от 768 px колонкой 200 px слева. */
.tp-f-facts { display: grid; margin: 0; }
.tp-f-facts__row { display: grid; gap: var(--tp-1); min-width: 0; padding-block: var(--tp-3);
    border-top: 1px solid var(--tp-border); }
.tp-f-facts__row:first-child { padding-top: 0; border-top: 0; }
.tp-f-facts__row:last-child { padding-bottom: 0; }
.tp-f-facts__term { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); font-weight: 400; line-height: 1.5; }
.tp-f-facts__value { margin: 0; min-width: 0; color: var(--tp-ink); font-size: var(--tp-fs-md); line-height: 1.5; }
.tp-f-facts__value .tp-f-terms { display: block; font-size: inherit; }
.tp-f-facts__value .tp-f-terms > li { display: inline; }
.tp-f-facts__value .tp-f-terms > li:not(:last-child)::after { content: ", "; }
.tp-f-facts__value .tp-f-terms span { display: inline; min-height: 0; padding: 0; background: none; border-radius: 0; }
@media (min-width: 768px) {
    .tp-f-facts__row { grid-template-columns: var(--tp-f-dt-w) minmax(0, 1fr); align-items: baseline; gap: var(--tp-4); }
}
/* Строки «Другие офисы» и «Похожие организации рядом»: вся строка ведет на карточку
   (растянутая ссылка названия), название цветом текста, при наведении цветом ссылки;
   ссылка сети и оценка поверх растянутой ссылки. */
.tp-f-rows > .tp-f-row--compact { border-radius: var(--tp-r-md); }
.tp-f-rows > .tp-f-row--compact .tp-f-row__name a { color: var(--tp-ink); text-decoration: none; }
.tp-f-rows > .tp-f-row--compact .tp-f-row__name a::before { content: ""; position: absolute; inset: 0;
    border-radius: inherit; }
.tp-f-rows > .tp-f-row--compact .tp-f-row__name a:hover { color: var(--tp-link); text-decoration: underline;
    text-underline-offset: .15em; }
.tp-f-rows > .tp-f-row--compact a.tp-f-row__chain, .tp-f-rows > .tp-f-row--compact .tp-f-row__rating { position: relative;
    z-index: 1; }
@media (pointer: coarse) {
    .tp-f-terms a, .tp-f-terms__more, .tp-f-act, a.tp-f-row__chain, .tp-f-row__rating, .tp-f-links__link { min-height: 44px; }
}

/* Карта: во всю ширину колонки, 240 px на телефоне, 320 px от 640 px; на телефоне
   плашка под картой, от 768 px поверх карты слева снизу; кнопки плашки мягкие */
.tp-f-map { display: grid; gap: var(--tp-3); }
.tp-f-map > * { min-width: 0; }
.tp-f-map #yMap { width: 100%; height: var(--tp-f-map-h); border-radius: var(--tp-r-md); overflow: hidden;
    background: var(--tp-surface-tint); }
.tp-f-map #block-map { position: relative; }
.tp-f-map__load { position: absolute; inset: 0; margin: auto; width: fit-content; height: fit-content;
    background: var(--tp-surface); border: 1px solid var(--tp-border-strong); }
.tp-f-map__load:hover { background: var(--tp-surface); border-color: var(--tp-ink-faint); }
.tp-f-map #yMap:has(+ .tp-f-map__load) { background: var(--tp-surface-accent); }
.tp-f-map__plate { display: grid; gap: var(--tp-1); }
.tp-f-map__address { margin: 0; color: var(--tp-ink); }
.tp-f-map__metro { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-map__acts { display: flex; flex-wrap: wrap; gap: var(--tp-3); margin-top: var(--tp-2); }
.tp-f-map__acts > .tp-f-btn { flex: 1 1 auto; }

/* Отзывы: сводка и лента */
.tp-f-rsum { display: grid; gap: var(--tp-4); margin-bottom: var(--tp-5); }
.tp-f-rsum__score { display: grid; gap: var(--tp-1); align-content: start; }
.tp-f-rsum__value { margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-4xl); font-weight: 700; line-height: 1; }
.tp-f-rsum__label { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-rsum__invite, .tp-f-rsum__write { margin: 0; }
.tp-f-dist { display: grid; gap: var(--tp-1); width: 100%; max-width: var(--tp-f-panel-w); margin: 0; padding: 0; list-style: none; }
.tp-f-dist__row { display: grid; grid-template-columns: 1ch minmax(0, 1fr) 3ch; gap: var(--tp-3); align-items: center;
    font-size: var(--tp-fs-sm); line-height: 1.5; }
.tp-f-dist__stars { color: var(--tp-ink-muted); text-align: right; }
.tp-f-dist__bar { display: block; width: 100%; height: var(--tp-f-dist-h); border: 0; border-radius: var(--tp-r-pill);
    background: var(--tp-border); overflow: hidden; -webkit-appearance: none; appearance: none; }
.tp-f-dist__bar::-webkit-progress-bar { background: var(--tp-border); border-radius: var(--tp-r-pill); }
.tp-f-dist__bar::-webkit-progress-value { background: var(--tp-star); border-radius: var(--tp-r-pill); }
.tp-f-dist__bar::-moz-progress-bar { background: var(--tp-star); border-radius: var(--tp-r-pill); }
.tp-f-dist__count { color: var(--tp-ink-muted); text-align: right; font-variant-numeric: tabular-nums; }
.tp-f-review { padding: var(--tp-4) 0; border-top: 1px solid var(--tp-border); }
.tp-f-review__head { display: flex; align-items: center; gap: var(--tp-3); margin-bottom: var(--tp-2); }
.tp-f-review__initials { display: inline-flex; flex: none; align-items: center; justify-content: center;
    width: var(--tp-f-avatar-sm); height: var(--tp-f-avatar-sm); border-radius: var(--tp-r-pill);
    background: var(--tp-surface-accent); color: var(--tp-ink-muted); font-weight: 600; }
.tp-f-review__name { margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-md); font-weight: 600; }
.tp-f-review__meta { display: flex; flex-wrap: wrap; align-items: center; gap: 0 var(--tp-3); margin: 0;
    color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-review__stars { display: inline-flex; }
.tp-f-review .tp-f-star .tp-f-icon { color: var(--tp-border-strong); }
.tp-f-review .tp-f-star.is-on .tp-f-icon { color: var(--tp-star); fill: var(--tp-star); }
.tp-f-review__text { margin: 0; color: var(--tp-ink); overflow-wrap: anywhere; }
.tp-f-review__reply { margin: var(--tp-3) 0 0; padding-left: var(--tp-4); border-left: 2px solid var(--tp-border-strong); }
.tp-f-review__reply-name { margin: 0 0 var(--tp-1); color: var(--tp-ink); font-size: var(--tp-fs-sm); font-weight: 600; }
.tp-f-review__reply-text { margin: 0; }

/* Реквизиты: таблица «подпись: значение» (строки base), группы раскрытия
   с шевроном из CSS, «Показать все N» мягкой кнопкой (card.js) */
.tp-f-legal .tp-f-dl { margin: 0; }
.tp-f-group { margin-top: var(--tp-4); border-top: 1px solid var(--tp-border); }
.tp-f-group + .tp-f-group { margin-top: 0; }
.tp-f-group__sum { display: flex; align-items: center; gap: var(--tp-2); min-height: var(--tp-7); list-style: none; cursor: pointer; }
.tp-f-group__sum::-webkit-details-marker { display: none; }
.tp-f-group__title { margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-md); font-weight: 600; }
.tp-f-group__count { color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-group__list { display: grid; gap: var(--tp-2); margin: 0 0 var(--tp-4); padding: 0; list-style: none; }
.tp-f-group > .tp-f-terms { margin-bottom: var(--tp-4); }
.tp-f-collapse { margin: 0 0 var(--tp-4); }
.tp-f-find { box-sizing: border-box; width: 100%; min-height: 44px; margin: 0 0 var(--tp-3); padding: var(--tp-2) var(--tp-3);
    border: 1px solid var(--tp-border-strong); border-radius: var(--tp-r-sm); background: var(--tp-surface);
    color: var(--tp-ink); font: inherit; }

/* Частые вопросы: без рамок, между вопросами линия */
.tp-f-faq { display: grid; }
.tp-f-faq__item + .tp-f-faq__item { border-top: 1px solid var(--tp-border); }
.tp-f-faq__q { box-sizing: border-box; display: flex; align-items: center; justify-content: space-between; gap: var(--tp-4);
    min-height: var(--tp-7); padding: var(--tp-3) 0; color: var(--tp-ink); font-size: var(--tp-fs-md); font-weight: 600;
    list-style: none; cursor: pointer; }
.tp-f-faq__q::-webkit-details-marker { display: none; }
.tp-f-faq__a { margin: 0 0 var(--tp-4); color: var(--tp-ink); }
.tp-f-group__sum::after, .tp-f-faq__q::after { content: ""; flex: none; width: var(--tp-f-chevron); height: var(--tp-f-chevron);
    margin: 0 var(--tp-1) 0 auto; border-right: 2px solid var(--tp-ink-muted); border-bottom: 2px solid var(--tp-ink-muted);
    transform: translateY(-25%) rotate(45deg); transition: transform .15s; }
.tp-f-group[open] > .tp-f-group__sum::after, .tp-f-faq__item[open] > .tp-f-faq__q::after {
    transform: translateY(25%) rotate(225deg); }
.tp-f-group__sum:focus-visible, .tp-f-faq__q:focus-visible { outline: 2px solid var(--tp-link); outline-offset: 2px; }

/* Подвал карточки разделов одной строкой 13 px */
.tp-f-card-foot { display: flex; flex-wrap: wrap; align-items: center; gap: 0 var(--tp-2); margin-top: var(--tp-6);
    padding-top: var(--tp-6); border-top: 1px solid var(--tp-border); color: var(--tp-ink-muted); font-size: var(--tp-fs-xs); }
.tp-f-card-foot__item { margin: 0; }
.tp-f-card-foot__item + .tp-f-card-foot__item::before { content: "·"; margin-right: var(--tp-2); }
.tp-f-card-foot a { display: inline-flex; align-items: center; min-height: var(--tp-5); }

/* Нижняя полоса «Позвонить · Маршрут» до 1024 px (поведение этапа 8) */
.tp-f-bar { position: fixed; left: 0; right: 0; bottom: 0; z-index: 30; display: grid; grid-auto-flow: column;
    grid-auto-columns: minmax(0, 1fr); gap: var(--tp-2);
    padding: var(--tp-2) var(--tp-4) calc(var(--tp-2) + env(safe-area-inset-bottom));
    background: var(--tp-surface); border-top: 1px solid var(--tp-border); transition: transform .2s ease, visibility .2s; }
.tp-f-bar.is-hidden { transform: translateY(100%); visibility: hidden; }
.tp-f-bar__slot { display: contents; }
.tp-f-bar__btn, .tp-f-bar__slot > a { box-sizing: border-box; display: inline-flex; align-items: center;
    justify-content: center; gap: var(--tp-2); min-height: 44px; margin: 0; padding: 0 var(--tp-3);
    border: 1px solid var(--tp-border-strong); border-radius: var(--tp-r-sm); background: var(--tp-surface);
    color: var(--tp-ink); font: inherit; font-weight: 600; text-decoration: none; cursor: pointer; }
.tp-f-bar__btn--call, .tp-f-bar__slot > a { background: var(--tp-cta); border-color: var(--tp-cta); color: var(--tp-cta-ink); }
.tp-f-bar__slot > .tp-f-phone__error { position: absolute; left: 0; right: 0; bottom: 100%; padding: var(--tp-2) var(--tp-4);
    background: var(--tp-surface); color: var(--tp-closed); font-size: var(--tp-fs-xs); line-height: 1.4; text-align: center; }
.tp-f-bar :focus-visible { outline: 2px solid var(--tp-link); outline-offset: 2px; }
.tp-f-page--bar { padding-bottom: calc(var(--tp-8) + env(safe-area-inset-bottom)); }

@media (max-width: 767.98px) {
    .tp-f-reveal { min-height: 44px; }
}
@media (max-width: 639.98px) {
    .tp-f-card-head__title { -webkit-hyphens: auto; hyphens: auto; hyphenate-limit-chars: 12 5 5; }
}
@media (max-width: 479.98px) {
    .tp-f-card-head__soft:has(> :nth-child(3)) > .tp-f-btn { flex-direction: column; gap: 0; padding-block: var(--tp-1);
        font-size: var(--tp-fs-xs); }
}
@media (max-width: 359.98px) {
    .tp-f-card-head__soft .tp-f-icon { display: none; }
}
@media (min-width: 640px) {
    .tp-f { --tp-f-h1: var(--tp-fs-4xl); }
    .tp-f-card-head__top { grid-template-columns: var(--tp-f-logo) minmax(0, 1fr); }
    .tp-f-card-head__logo { width: var(--tp-f-logo); height: var(--tp-f-logo); font-size: var(--tp-fs-4xl); }
    .tp-f-card-head__actions { display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--tp-3); }
    .tp-f-card-head__actions > .tp-f-phone--block { display: inline-grid; width: auto; }
    .tp-f-card-head__actions .tp-f-phone__show, .tp-f-card-head__actions .tp-f-phone__link { min-width: var(--tp-f-cta-w); }
    .tp-f-card-head__soft { display: flex; flex-wrap: wrap; gap: var(--tp-3); }
    .tp-f-card-head__soft > .tp-f-btn { padding-inline: var(--tp-5); }
    .tp-f-sectnav { border-radius: var(--tp-r-xl) var(--tp-r-xl) 0 0; }
    .tp-f-map #yMap { height: var(--tp-f-map-h-lg); }
    .tp-f-map__acts > .tp-f-btn { flex: 0 1 auto; }
    .tp-f-week th { width: var(--tp-f-dt-w); }
    .tp-f-rsum { grid-template-columns: auto minmax(0, 1fr); align-items: center; column-gap: var(--tp-6); }
    .tp-f-rsum__invite, .tp-f-rsum__write { grid-column: 1 / -1; }
}
@media (min-width: 768px) {
    .tp-f-map { position: relative; }
    .tp-f-map__plate { position: absolute; left: var(--tp-4); bottom: calc(var(--tp-7) + var(--tp-2)); box-sizing: border-box;
        width: max-content; max-width: min(calc(var(--tp-8) * 7), calc(100% - 2 * var(--tp-4))); padding: var(--tp-3) var(--tp-4);
        background: var(--tp-surface); border: 1px solid var(--tp-border); border-radius: var(--tp-r-md); }
    .tp-f-map:has(.tp-f-map__load) .tp-f-map__plate { position: static; width: auto; max-width: none; padding: 0;
        background: none; border: 0; border-radius: 0; }
}
@media (min-width: 1024px) {
    .tp-f-card-head__top { grid-template-columns: var(--tp-f-logo) minmax(0, 1fr) auto;
        grid-template-areas: "logo title side" "logo type side" "logo note ." "logo meta ."; }
    .tp-f-card-head__side { justify-items: end; margin-top: 0; padding-left: var(--tp-5); }
    .tp-f-card-head__side .tp-f-hrating { margin-top: calc((var(--tp-f-h1) * 1.15 - var(--tp-6) - var(--tp-2)) / 2); }
    .tp-f-card-body { grid-template-columns: minmax(0, 1fr) var(--tp-f-panel-w); grid-template-areas: "main aside";
        align-items: start; }
    .tp-f-card-body__main { grid-area: main; }
    .tp-f-card-body__aside { grid-area: aside; position: sticky; top: var(--tp-4); }
    .tp-f-cp { padding: var(--tp-6); }
    .tp-f-cp__title { font-size: var(--tp-fs-lg); }
    .tp-f-legal .tp-f-dl__row { display: grid; grid-template-columns: var(--tp-f-dt-w) minmax(0, 1fr); column-gap: var(--tp-4); }
    .tp-f-find { min-height: 40px; }
    .tp-f-bar { display: none; }
    .tp-f-page--bar { padding-bottom: 0; }
}
@media (prefers-reduced-motion: reduce) {
    .tp-f-bar, .tp-f-group__sum::after, .tp-f-faq__q::after, .tp-f-offices__toggle > .tp-f-icon--16 { transition: none; }
}

@media (min-width: 1280px) {
    .tp-f-card-head__meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--tp-2) 0; }
    .tp-f-card-head__item + .tp-f-card-head__item { margin-left: var(--tp-5); }
    .tp-f-card-head__item + .tp-f-card-head__item::before { content: ""; flex: none; width: 1px; height: var(--tp-f-line-h);
        margin-right: var(--tp-4); background: var(--tp-border); }
}
/* == listing == */
/* Листинг города, категории и тега, страница сети (этап 9, спецификация 6.2, 6.3 и 12.6)
   по правилам карточки. Шапка страницы карточкой-контейнером (.tp-f-phead в base, строки
   шапки карточки .tp-f-card-head__*). Ниже список во всю ширину контейнера (13.6), карта
   на любой ширине по кнопке «Карта» на весь экран; под списком карточка «Сети» и
   «Разделы» с разделами через линию. Список
   (спецификация 13.1) стопкой карточек организаций через 16 px (блок row) без общего
   контейнера; полоса фильтров отдельной липкой карточкой над ними: мягкие кнопки
   «Фильтры», сортировка и «Карта»; на телефоне кнопки равной ширины с иконкой
   над подписью. Выбранные условия, «Показать еще» (кнопка с рамкой), пагинация и пустая
   выдача (карточкой) на сером фоне листинга. Меню сортировки и шторка фильтров слоем по 4.1
   (рамка, радиус 12, тень), кнопки по 12.2. Карта открывается на весь экран (listing.js). Пагинация ссылками, текущая страница белой плашкой; классы списков ссылок
   общие с хабом.
   Именованные размеры выведены из токенов: 560, 216. */
.tp-f-noscroll, .tp-f-noscroll body { overflow: hidden; }
.tp-f { --tp-f-sheet-w: calc(var(--tp-8) * 8 + var(--tp-6) + var(--tp-4));
    --tp-f-col-w: calc(var(--tp-8) * 3 + var(--tp-5)); }

.tp-f-listing { display: grid; gap: var(--tp-5); }
.tp-f-listing > * { min-width: 0; }
.tp-f-listing__list { display: grid; align-content: start; gap: var(--tp-4); min-width: 0; }
.tp-f-listing__list .tp-f-rows { gap: var(--tp-4); }
.tp-f-lform { display: contents; }

/* Полоса фильтров: отдельная липкая карточка над стопкой карточек организаций (рамка,
   радиус и тень как у карточки строки) */
.tp-f-fbar { box-sizing: border-box; position: sticky; top: 0; z-index: 30; display: flex; flex-wrap: wrap;
    align-items: center; gap: var(--tp-3); min-width: 0; margin: 0; padding: var(--tp-3); background: var(--tp-surface);
    border: 1px solid var(--tp-border); border-radius: var(--tp-r-lg2); box-shadow: var(--tp-shadow-card); }
.tp-f-fbar__filters { position: relative; }
.tp-f-fbar__badge { box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center;
    min-width: var(--tp-5); height: var(--tp-5); padding: 0 var(--tp-2); border-radius: var(--tp-r-pill);
    background: var(--tp-ink); color: var(--tp-surface); font-size: var(--tp-fs-xs); font-weight: 600; line-height: 1; }
.tp-f-fbar > .tp-f-mapopen { margin-left: auto; }

.tp-f-sort { position: relative; }
.tp-f-sort__current { list-style: none; }
.tp-f-sort__current::-webkit-details-marker { display: none; }
.tp-f-sort__current > .tp-f-icon--16 { transition: transform .15s; }
.tp-f-sort[open] > .tp-f-sort__current { background: var(--tp-btn-soft-hover); }
.tp-f-sort[open] > .tp-f-sort__current > .tp-f-icon--16 { transform: rotate(180deg); }
.tp-f-sort__label { min-width: 0; white-space: nowrap; }
.tp-f-sort__short { display: none; white-space: nowrap; }
.tp-f-sort__menu { box-sizing: border-box; position: absolute; top: calc(100% + var(--tp-2)); left: 0; z-index: 20;
    width: max-content; min-width: 100%; max-width: var(--tp-f-pop-w); margin: 0; padding: var(--tp-1) 0;
    list-style: none; background: var(--tp-surface); border: 1px solid var(--tp-border); border-radius: var(--tp-r-md);
    box-shadow: var(--tp-shadow-md); }
.tp-f-sort__item { display: flex; align-items: center; gap: var(--tp-2); min-height: 44px; padding: 0 var(--tp-4);
    color: var(--tp-ink); text-decoration: none; }
.tp-f-sort__item:not([aria-current]) { padding-left: calc(var(--tp-4) * 2 + var(--tp-2)); }
a.tp-f-sort__item:hover { background: var(--tp-surface-tint); color: var(--tp-ink); }
.tp-f-sort__item[aria-current="true"] { font-weight: 600; }
.tp-f-sort__item .tp-f-icon { color: var(--tp-link); }

/* Выбранные условия: мягкие чипы 36 px, «Сбросить все» текстовым действием */
.tp-f-chipbar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--tp-2); margin: 0;
    padding: 0; list-style: none; }
.tp-f-fchip { box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--tp-1);
    min-height: calc(var(--tp-6) + var(--tp-1)); padding: 0 var(--tp-3) 0 var(--tp-4); border-radius: var(--tp-r-pill);
    background: var(--tp-surface); color: var(--tp-ink); border: 1px solid var(--tp-border); font-size: var(--tp-fs-sm);
    font-weight: 500; text-decoration: none; }
.tp-f-fchip:hover { border-color: var(--tp-border-strong); color: var(--tp-ink); }
.tp-f-fchip .tp-f-icon { color: var(--tp-ink-muted); }
.tp-f-chipbar__reset { display: inline-flex; align-items: center; min-height: calc(var(--tp-6) + var(--tp-1));
    padding: 0 var(--tp-2); color: var(--tp-link); font-size: var(--tp-fs-sm); font-weight: 500; text-decoration: none; }
.tp-f-chipbar__reset:hover { text-decoration: underline; text-underline-offset: .15em; }

/* Пустая выдача, «Показать еще», пагинация, строка про ИП */
.tp-f-empty { display: grid; justify-items: start; gap: var(--tp-2); }
.tp-f-empty__title { margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-lg); font-weight: 600; line-height: 1.4; }
.tp-f-empty__hint { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-empty__reset { margin-top: var(--tp-3); }
.tp-f-more { margin: var(--tp-2) 0 0; }
.tp-f-pager { margin: 0; }
.tp-f-pager__list { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--tp-1); margin: 0; padding: 0;
    list-style: none; }
.tp-f-pager__item, .tp-f-pager__arrow, .tp-f-pager__gap { box-sizing: border-box; display: inline-flex; align-items: center;
    justify-content: center; min-width: 44px; height: 44px; padding: 0 var(--tp-2); border-radius: var(--tp-r-md);
    color: var(--tp-link); font-size: var(--tp-fs-sm); font-weight: 500; text-decoration: none;
    font-variant-numeric: tabular-nums; }
a.tp-f-pager__item:hover, a.tp-f-pager__arrow:hover { background: var(--tp-surface); color: var(--tp-link); }
.tp-f-pager__item.is-current, .tp-f-pager__item[aria-current="page"] { background: var(--tp-surface); color: var(--tp-ink);
    font-weight: 600; box-shadow: var(--tp-shadow-card); }
.tp-f-pager__gap { color: var(--tp-ink-muted); }
.tp-f-pager__arrow--prev .tp-f-icon { transform: scaleX(-1); }
.tp-f-source { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-xs); line-height: 1.5; }

/* Списки ссылок в колонки (сети и разделы города, категории и сети хаба): ссылка 16 px,
   число 14 px серым, без рамок-чипов */
/* Списки ссылок с числом: колонки по 248 px, строка 44 px с линией снизу, название слева,
   число справа серым табличными цифрами. */
.tp-f-links { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--tp-f-col-w), 1fr));
    gap: 0 var(--tp-6); margin: 0; padding: 0; list-style: none; }
.tp-f-links > li { display: flex; align-items: center; justify-content: space-between; gap: var(--tp-3); min-width: 0;
    min-height: 44px; border-bottom: 1px solid var(--tp-border); }
.tp-f-links__link { display: inline-flex; align-items: center; min-width: 0; min-height: var(--tp-5); color: var(--tp-link);
    font-size: var(--tp-fs-md); line-height: 1.35; text-decoration: none; overflow-wrap: anywhere; }
.tp-f-links__link:hover { text-decoration: underline; text-underline-offset: .15em; }
.tp-f-links__n { flex: none; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); font-variant-numeric: tabular-nums; }

/* Карта: отдельная карточка-контейнер без внутреннего отступа, тот же радиус */
.tp-f-mapbox { display: none; padding: 0; overflow: hidden; }
.tp-f-mapbox__bar { display: none; }
.tp-f-mapbox.is-open { position: fixed; inset: 0; z-index: 1050; display: flex; flex-direction: column;
    border-radius: 0; box-shadow: none; }
.tp-f-mapbox.is-open .tp-f-mapbox__bar { display: flex; align-items: center; justify-content: space-between;
    gap: var(--tp-3); padding: var(--tp-3) var(--tp-4); border-bottom: 1px solid var(--tp-border); }
.tp-f-mapbox.is-open .tp-f-lmap { flex: 1 1 auto; height: auto; }
.tp-f-mapbox__title { margin: 0; color: var(--tp-ink); font-weight: 600; }
.tp-f-mapbox__close { flex: none; }
.tp-f-lmap { width: 100%; height: 100%; background: var(--tp-surface-tint); }
.tp-f-balloon { display: grid; gap: var(--tp-2); max-width: var(--tp-f-balloon-w); color: var(--tp-ink);
    font-size: var(--tp-fs-sm); }
.tp-f-balloon__title { color: var(--tp-ink); font-weight: 700; }
.tp-f-balloon__note { margin: 0; color: var(--tp-ink-muted); }
.tp-f-balloon__more { display: inline-flex; align-items: center; min-height: 24px; color: var(--tp-link); font-weight: 600; }

/* Шторка фильтров: на телефоне снизу, от 640 px окно по центру; группы через линии,
   длинные списки флажками, короткие группы плашками; «Сбросить» текстом, «Показать N» главной кнопкой */
.tp-f-sheet { box-sizing: border-box; width: 100%; max-width: 100%; max-height: 90vh; max-height: 90dvh; margin: auto 0 0;
    padding: 0; border: 0; border-radius: var(--tp-r-lg2) var(--tp-r-lg2) 0 0; background: var(--tp-surface);
    color: var(--tp-ink); box-shadow: var(--tp-shadow-lg); }
.tp-f-sheet[open] { display: flex; flex-direction: column; }
.tp-f-sheet::backdrop { background: color-mix(in srgb, var(--tp-ink) 45%, transparent); }
.tp-f-sheet__head { display: flex; align-items: center; justify-content: space-between; gap: var(--tp-3);
    padding: var(--tp-3) var(--tp-3) var(--tp-3) var(--tp-f-box-pad); border-bottom: 1px solid var(--tp-border); }
.tp-f-sheet__title { margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-xl2); font-weight: 700; line-height: 1.25; }
.tp-f-sheet__close { flex: none; }
.tp-f-sheet__body { display: grid; flex: 1 1 auto; align-content: start; padding: 0 var(--tp-f-box-pad); overflow-y: auto;
    overscroll-behavior: contain; }
.tp-f-sheet__foot { display: flex; align-items: center; justify-content: space-between; gap: var(--tp-4);
    padding: var(--tp-3) var(--tp-f-box-pad) calc(var(--tp-3) + env(safe-area-inset-bottom));
    border-top: 1px solid var(--tp-border); }
.tp-f-sheet__apply { flex: 1 1 auto; max-width: var(--tp-f-cta-w); font-variant-numeric: tabular-nums; }
.tp-f-sheet__apply:disabled { opacity: .6; cursor: not-allowed; }
.tp-f-sheet__reset { display: inline-flex; align-items: center; min-height: 44px; padding: 0; color: var(--tp-link);
    font: inherit; font-weight: 500; text-decoration: none; background: none; border: 0; cursor: pointer; }
.tp-f-sheet__reset:hover { text-decoration: underline; text-underline-offset: .15em; }
.tp-f-fgroup { min-width: 0; margin: 0; padding: var(--tp-5) 0; border: 0; }
.tp-f-fgroup + .tp-f-fgroup { border-top: 1px solid var(--tp-border); }
.tp-f-fgroup__legend { float: left; width: 100%; margin: 0 0 var(--tp-3); padding: 0; color: var(--tp-ink);
    font-size: var(--tp-fs-lg); font-weight: 700; line-height: 1.4; }
.tp-f-fgroup__legend + * { clear: both; }
.tp-f-fgroup__hint { margin: calc(-1 * var(--tp-2)) 0 var(--tp-3); color: var(--tp-ink-muted); font-size: var(--tp-fs-xs);
    line-height: 1.45; }
.tp-f-checks { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--tp-f-check-w), 1fr)); gap: 0 var(--tp-4);
    margin: 0; padding: 0; list-style: none; }
.tp-f-check { position: relative; display: flex; align-items: center; gap: var(--tp-3); min-height: 44px; cursor: pointer; }
.tp-f-check input { position: absolute; width: 1px; height: 1px; margin: 0; opacity: 0; -webkit-appearance: none;
    appearance: none; }
.tp-f-check__box { box-sizing: border-box; display: inline-flex; flex: none; align-items: center; justify-content: center;
    width: var(--tp-5); height: var(--tp-5); border: 2px solid var(--tp-border-strong); border-radius: var(--tp-r-sm);
    background: var(--tp-surface); }
.tp-f-check__box .tp-f-icon { color: var(--tp-surface); opacity: 0; }
.tp-f-check:has(input:checked) .tp-f-check__box { border-color: var(--tp-link); background: var(--tp-link); }
.tp-f-check:has(input:checked) .tp-f-check__box .tp-f-icon { opacity: 1; }
/* Подпись и число одной строкой текста: при переносе число идет сразу за последним словом,
   а не уезжает к правому краю колонки */
.tp-f-check__text { flex: 1 1 auto; min-width: 0; line-height: 1.35; overflow-wrap: anywhere; }
.tp-f-check__label { color: inherit; }
.tp-f-check__count { margin-left: var(--tp-1); color: var(--tp-ink-muted); font-size: var(--tp-fs-sm);
    font-variant-numeric: tabular-nums; white-space: nowrap; }
.tp-f-check.is-empty { color: var(--tp-ink-muted); cursor: not-allowed; }
.tp-f-check:has(input:focus-visible) { outline: 2px solid var(--tp-link); outline-offset: 2px; }
/* Плашки (решение владельца 05.10.2026, как звезды и оценка в фильтрах отелей): «Главное», тип
   организации, оплата и удобства. Овал с рамкой 40 px (на касании 44), подпись 14 px, число
   12 px серым; отмеченная заливкой цвета ссылки с белым текстом; пустая серой рамкой. */
.tp-f-plates { display: flex; flex-wrap: wrap; gap: var(--tp-2); margin: 0; padding: 0; list-style: none; }
.tp-f-plate { box-sizing: border-box; position: relative; display: inline-flex; align-items: center; gap: var(--tp-2);
    max-width: 100%; min-height: 40px; padding: var(--tp-1) var(--tp-4); border: 1px solid var(--tp-border-strong);
    border-radius: var(--tp-r-pill); background: var(--tp-surface); color: var(--tp-ink); font-size: var(--tp-fs-sm);
    line-height: 1.3; cursor: pointer; transition: background-color .15s, border-color .15s; }
.tp-f-plate input { position: absolute; width: 1px; height: 1px; margin: 0; opacity: 0; -webkit-appearance: none;
    appearance: none; }
.tp-f-plate:hover { background: var(--tp-surface-tint); }
.tp-f-plate__label { min-width: 0; overflow-wrap: anywhere; }
.tp-f-plate__count { flex: none; color: var(--tp-ink-muted); font-size: var(--tp-fs-xs); font-variant-numeric: tabular-nums; }
.tp-f-plate:has(input:checked) { border-color: var(--tp-link); background: var(--tp-link); color: var(--tp-surface); }
.tp-f-plate:has(input:checked) .tp-f-plate__count { color: color-mix(in srgb, var(--tp-surface) 85%, var(--tp-link)); }
.tp-f-plate.is-empty { border-color: var(--tp-border); color: var(--tp-ink-muted); cursor: not-allowed; }
.tp-f-plate.is-empty:hover { background: var(--tp-surface); }
.tp-f-plate:has(input:focus-visible) { outline: 2px solid var(--tp-link); outline-offset: 2px; }
@media (pointer: coarse) {
    .tp-f-plate { min-height: 44px; }
}
/* Доработка фильтров 05.10.2026 (образец отелей): подзаголовок
   набора 14 px 600; поле поиска 44 px со скруглением 12 px и лупой Lucide справа фоном, без
   системного крестика; в длинном списке видно 6 значений и «Показать все N» текстом цвета ссылки
   со стрелкой; раскрытый или найденный список прокручивается внутри группы (до 8 строк), чтобы
   шторка не уходила вниз на сотню строк. */
.tp-f-fgroup__sub { margin: var(--tp-4) 0 var(--tp-1); color: var(--tp-ink); font-size: var(--tp-fs-sm); font-weight: 600;
    line-height: 1.4; }
.tp-f-fgroup__hint + .tp-f-fgroup__sub { margin-top: 0; }
.tp-f-fsearch { position: relative; min-width: 0; }
.tp-f-fsearch--group { margin: 0 0 var(--tp-2); }
.tp-f-fsearch__input { box-sizing: border-box; width: 100%; height: 44px; margin: 0;
    padding: 0 calc(var(--tp-4) + var(--tp-5)) 0 var(--tp-4); border: 1px solid var(--tp-border-strong);
    border-radius: var(--tp-r-md); background: var(--tp-surface) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235c6b73' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E") no-repeat right var(--tp-3) center / var(--tp-5);
    color: var(--tp-ink); font: inherit; font-size: var(--tp-fs-md); line-height: 1.5; -webkit-appearance: none;
    appearance: none; }
.tp-f-fsearch__input::placeholder { color: var(--tp-ink-muted); opacity: 1; }
.tp-f-fsearch__input::-webkit-search-cancel-button, .tp-f-fsearch__input::-webkit-search-decoration {
    display: none; -webkit-appearance: none; appearance: none; }
.tp-f-fsearch__input:hover { border-color: var(--tp-ink-faint); }
.tp-f-fsearch__input:focus-visible { border-color: var(--tp-link); outline: 2px solid var(--tp-link); outline-offset: 0; }
.tp-f-fgroup.is-scroll .tp-f-checks { max-height: calc(44px * 8); overflow-y: auto; overscroll-behavior: contain;
    scrollbar-gutter: stable; }
.tp-f-fgroup__none { margin: var(--tp-2) 0 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-fgroup__more { display: inline-flex; align-items: center; gap: var(--tp-1); min-height: 44px; margin: var(--tp-1) 0 0;
    padding: 0; border: 0; background: none; color: var(--tp-link); font: inherit; font-weight: 600; cursor: pointer; }
.tp-f-fgroup__more:hover { text-decoration: underline; text-underline-offset: .15em; }
.tp-f-fgroup__more:focus-visible { outline: 2px solid var(--tp-link); outline-offset: 2px; }
.tp-f-fgroup__more .tp-f-icon { transition: transform .15s; }
.tp-f-fgroup__more[aria-expanded="true"] .tp-f-icon { transform: rotate(180deg); }

.tp-f-sort__item:focus-visible, .tp-f-fchip:focus-visible, .tp-f-chipbar__reset:focus-visible, .tp-f-sheet a:focus-visible,
.tp-f-sheet__reset:focus-visible,
.tp-f-pager a:focus-visible, .tp-f-links__link:focus-visible, .tp-f-balloon a:focus-visible {
    outline: 2px solid var(--tp-link); outline-offset: 2px; }

@media (max-width: 639.98px) {
    .tp-f-fbar { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); }
    .tp-f-fbar > .tp-f-btn, .tp-f-sort__current { flex-direction: column; gap: 0; width: 100%; padding: var(--tp-1);
        font-size: var(--tp-fs-xs); }
    .tp-f-fbar > .tp-f-mapopen { margin-left: 0; }
    .tp-f-sort { position: static; min-width: 0; }
    .tp-f-sort__current > .tp-f-icon--16 { display: none; }
    .tp-f-sort__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%);
        white-space: nowrap; }
    .tp-f-sort__short { display: inline; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
    .tp-f-sort__menu { left: var(--tp-f-box-pad); right: var(--tp-f-box-pad); width: auto; min-width: 0; max-width: none; }
    .tp-f-fbar__badge { position: absolute; top: var(--tp-1); right: var(--tp-1); }
}
@media (min-width: 640px) {
    .tp-f-sheet { width: min(var(--tp-f-sheet-w), calc(100% - 2 * var(--tp-5))); max-height: 85vh; max-height: 85dvh;
        margin: auto; border-radius: var(--tp-r-xl); }
}
@media (min-width: 1024px) {
    .tp-f-pager__item, .tp-f-pager__arrow, .tp-f-pager__gap { min-width: calc(var(--tp-6) + var(--tp-2));
        height: calc(var(--tp-6) + var(--tp-2)); }
}
@media (prefers-reduced-motion: reduce) {
    .tp-f-sort__current > .tp-f-icon--16, .tp-f-fgroup__more .tp-f-icon, .tp-f-plate { transition: none; }
}

/* == hub == */
/* Хаб справочника (этап 9, спецификация 7, 12.6 и 13.6; геометрия хаба пересобрана 02.10.2026).
   Шапка страницы карточкой-контейнером (.tp-f-phead): крошки, H1, подзаголовок строкой
   типа, счетчики мета-строкой шапки карточки, через 32 px поиск на высоту кнопок (52/48):
   подписи 14 px над полями, «Название или ИНН» растягивается, «Город» 280 px, главная
   «Найти»; от 1024 px в одну строку, от 640 до 1023 px «Название или ИНН» отдельной
   строкой, на телефоне поля друг под другом и «Найти» во всю ширину. Подсказки городов
   слоем по 4.1. Результаты поиска стопкой карточек организаций через 16 px (полная строка
   блока row), город 16 px 600 заголовком группы над первой карточкой города; пустая
   выдача карточкой, как в листинге.
   Ниже все блоки карточками на всю ширину контейнера, без колонок разной высоты:
   «Популярные города» плитками (мягкий фон, название целиком, число под ним; колонок
   2/3/4/6 по ширине, 12 городов ложатся ровными рядами), справа от заголовка ссылка «Все
   города» к регионам; «Категории» и «Федеральные сети» одной карточкой, списки ссылок
   .tp-f-links блока listing колонками; «Туроператоры» сеткой компактных карточек
   (_ui/mini.html: плитка буквы 48 px, название до двух строк, тип, город и номер реестра;
   ссылкой вся карточка), колонок 1/2/3. «Все города по регионам»: буквы мягкими кнопками
   44/40, регионы колонками 1/2/4, в регионе 6 крупных городов и «Еще N» (details) с
   остальными; на телефоне регион строкой «название, число городов» с раскрытием
   (details, hub.js сворачивает их при загрузке), от 640 px раскрыт всегда. Затем «Как
   проверить». Размеры выведены из токенов: 280, 48, 72. */
.tp-f-hub { --tp-f-city-w: calc(var(--tp-8) * 4 + var(--tp-5)); }

.tp-f-hub__search { display: grid; gap: var(--tp-3); margin: var(--tp-6) 0 0; }
.tp-f-hub__field { position: relative; display: grid; gap: var(--tp-1); min-width: 0; }
.tp-f-hub__label { color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); line-height: 1.5; }
.tp-f-hub__input { box-sizing: border-box; width: 100%; height: var(--tp-f-btn-h); margin: 0; padding: 0 var(--tp-4);
    border: 1px solid var(--tp-border-strong); border-radius: var(--tp-r-md); background: var(--tp-surface);
    color: var(--tp-ink); font: inherit; font-size: var(--tp-fs-md); line-height: 1.25; }
.tp-f-hub__input:hover { border-color: var(--tp-ink-faint); }
.tp-f-hub__input:focus-visible { border-color: var(--tp-link); outline: 2px solid var(--tp-link); outline-offset: 0; }
.tp-f-hub__submit { align-self: end; }
.tp-f-hub__options { box-sizing: border-box; position: absolute; top: 100%; z-index: 20; inset-inline: 0;
    max-height: var(--tp-f-pop-w); margin: var(--tp-1) 0 0; padding: var(--tp-1) 0; overflow-y: auto;
    overscroll-behavior: contain; list-style: none; background: var(--tp-surface); border: 1px solid var(--tp-border);
    border-radius: var(--tp-r-md); box-shadow: var(--tp-shadow-md); }
.tp-f-hub__option { display: flex; align-items: center; min-height: 44px; padding: 0 var(--tp-4); color: var(--tp-ink);
    cursor: pointer; }
.tp-f-hub__option:hover, .tp-f-hub__option[aria-selected="true"] { background: var(--tp-surface-tint); }
.tp-f-hub__hint { margin: var(--tp-4) 0 0; color: var(--tp-ink); }
/* Поиск (доработка 05.10.2026): в поле запроса свой крестик «Очистить» вместо системного,
   под формой строка о том, что ищется; подсказка при вводе белой карточкой под полем:
   заголовки групп 12 px серым прописными, пункт 44 px (название и серая строка города,
   адреса или числа), выбранный пункт мягким фоном, последний «Все результаты» цветом ссылки. */
.tp-f-hub__box { position: relative; min-width: 0; }
.tp-f-hub__input::-webkit-search-cancel-button, .tp-f-hub__input::-webkit-search-decoration {
    display: none; -webkit-appearance: none; appearance: none; }
.tp-f-hub__input { -webkit-appearance: none; appearance: none; }
.tp-f-hub__input::placeholder { color: var(--tp-ink-muted); opacity: 1; }
.tp-f-hub__input--q { padding-right: calc(var(--tp-f-btn-h) + var(--tp-1)); }
.tp-f-hub__clear { position: absolute; top: 50%; right: var(--tp-1); display: inline-flex; align-items: center;
    justify-content: center; width: 44px; height: 44px; padding: 0; border: 0; border-radius: var(--tp-r-md);
    background: none; color: var(--tp-ink-muted); cursor: pointer; transform: translateY(-50%); }
.tp-f-hub__clear:hover { background: var(--tp-surface-tint); color: var(--tp-ink); }
.tp-f-hub__clear:focus-visible { outline: 2px solid var(--tp-link); outline-offset: -2px; }
.tp-f-hub__tips { margin: var(--tp-3) 0 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); line-height: 1.5; }
.tp-f-hub__suggest { box-sizing: border-box; position: absolute; top: 100%; z-index: 25; inset-inline: 0;
    max-height: min(28rem, 70vh); margin: var(--tp-1) 0 0; padding: var(--tp-1) 0; overflow-y: auto;
    overscroll-behavior: contain; background: var(--tp-surface); border: 1px solid var(--tp-border);
    border-radius: var(--tp-r-md); box-shadow: var(--tp-shadow-md); }
.tp-f-hub__sgroup { margin: 0; padding: var(--tp-2) var(--tp-4) var(--tp-1); color: var(--tp-ink-muted);
    font-size: var(--tp-fs-xs); font-weight: 600; letter-spacing: .02em; text-transform: uppercase; }
.tp-f-hub__sgroup:not(:first-child) { margin-top: var(--tp-1); border-top: 1px solid var(--tp-border); }
.tp-f-hub__sopt { display: grid; align-content: center; gap: 2px; min-height: 44px; padding: var(--tp-2) var(--tp-4);
    color: var(--tp-ink); text-decoration: none; cursor: pointer; }
.tp-f-hub__sopt:hover, .tp-f-hub__sopt[aria-selected="true"] { background: var(--tp-surface-tint); }
.tp-f-hub__sopt-name { overflow: hidden; font-weight: 600; line-height: 1.35; text-overflow: ellipsis; white-space: nowrap; }
.tp-f-hub__sopt-note { overflow: hidden; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); line-height: 1.4;
    text-overflow: ellipsis; white-space: nowrap; }
.tp-f-hub__sopt--all { margin-top: var(--tp-1); border-top: 1px solid var(--tp-border); }
.tp-f-hub__sopt--all .tp-f-hub__sopt-name { color: var(--tp-link); }

/* Результаты поиска: заголовок на сером фоне, карточки стопкой через 16 px, город
   заголовком группы над первой карточкой каждого города */
.tp-f-hub__group { display: grid; gap: var(--tp-4); min-width: 0; }
.tp-f-hub__group > .tp-f-section__title { margin: 0; }
/* Шапка выдачи: H2, число найденного и как понят запрос серым, справа «Уточнить фильтрами»
   (листинг города с фильтром по названию); ярлыки городов, сетей и разделов строками-ссылками
   на белой карточке; без города число найденного по городам плашками-ссылками. */
.tp-f-hub__rhead { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: var(--tp-1) var(--tp-4); }
.tp-f-hub__rhead > .tp-f-section__title { margin: 0; }
.tp-f-hub__rmeta { grid-column: 1; margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-hub__refine { grid-column: 2; grid-row: 1 / span 2; }
.tp-f-hub__shortcuts { display: grid; margin: 0; padding: 0 var(--tp-f-box-pad); list-style: none; background: var(--tp-surface);
    border-radius: var(--tp-r-lg2); box-shadow: var(--tp-shadow-card); }
.tp-f-hub__shortcuts > li + li { border-top: 1px solid var(--tp-border); }
.tp-f-hub__shortcut { display: flex; flex-wrap: wrap; align-items: center; gap: 0 var(--tp-3); min-height: 52px;
    padding: var(--tp-2) 0; color: var(--tp-ink); text-decoration: none; }
.tp-f-hub__shortcut-kind { flex: none; min-width: 4.5rem; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-hub__shortcut-name { flex: 1 1 auto; min-width: 0; font-weight: 600; }
.tp-f-hub__shortcut-note { color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-hub__shortcut > .tp-f-icon { flex: none; color: var(--tp-ink-faint); }
.tp-f-hub__shortcut:hover .tp-f-hub__shortcut-name { color: var(--tp-link); }
.tp-f-hub__shortcut:focus-visible { outline: 2px solid var(--tp-link); outline-offset: 2px; }
.tp-f-hub__bycity { display: grid; gap: var(--tp-2); }
.tp-f-hub__bycity-title { margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-sm); font-weight: 600; }
.tp-f-hub__bycity-list { display: flex; flex-wrap: wrap; gap: var(--tp-2); margin: 0; padding: 0; list-style: none; }
.tp-f-hub__citychip { box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--tp-2); min-height: 40px;
    padding: 0 var(--tp-4); border-radius: var(--tp-r-md); background: var(--tp-btn-soft); color: var(--tp-ink);
    font-size: var(--tp-fs-sm); text-decoration: none; }
.tp-f-hub__citychip-n { color: var(--tp-ink-muted); font-size: var(--tp-fs-xs); font-variant-numeric: tabular-nums; }
.tp-f-hub__citychip:hover { background: var(--tp-btn-soft-hover); }
.tp-f-hub__citychip:focus-visible { outline: 2px solid var(--tp-link); outline-offset: 2px; }
@media (max-width: 639.98px) {
    .tp-f-hub__rhead { grid-template-columns: minmax(0, 1fr); }
    .tp-f-hub__refine { grid-column: 1; grid-row: auto; justify-self: start; }
}
@media (pointer: coarse) {
    .tp-f-hub__citychip { min-height: 44px; }
}
.tp-f-hub__found { display: grid; gap: var(--tp-4); min-width: 0; margin: 0; padding: 0; list-style: none; }
.tp-f-hub__hit { display: grid; gap: var(--tp-2); min-width: 0; }
.tp-f-hub__tile-city { margin: var(--tp-2) 0 0; color: var(--tp-ink); font-size: var(--tp-fs-md); font-weight: 600;
    line-height: 1.4; }
.tp-f-hub__hit:first-child .tp-f-hub__tile-city { margin-top: 0; }

/* Заголовок карточки блока: слева H2, справа ссылка или пояснение; на узком экране
   пояснение переносится под заголовок */
.tp-f-hub__head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between;
    gap: var(--tp-1) var(--tp-4); margin: 0 0 var(--tp-5); }
.tp-f-hub__head > .tp-f-section__title { margin: 0; }
.tp-f-hub__all { display: inline-flex; align-items: center; min-height: var(--tp-5); color: var(--tp-link);
    font-size: var(--tp-fs-md); font-weight: 600; text-decoration: none; }
.tp-f-hub__all:hover { text-decoration: underline; text-underline-offset: .15em; }
.tp-f-hub__note { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); line-height: 1.5; }

/* Популярные города: плитки с мягким фоном, название целиком (перенос только по словам и
   дефису), число организаций под названием; колонки 2/3/4/6 */
.tp-f-hub__cities { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--tp-2);
    margin: 0; padding: 0; list-style: none; }
.tp-f-hub__cities > li { display: grid; min-width: 0; }
.tp-f-hub__city { box-sizing: border-box; display: grid; align-content: start; gap: var(--tp-1);
    min-height: calc(var(--tp-8) + var(--tp-2)); padding: var(--tp-3) var(--tp-4); border-radius: var(--tp-r-md);
    background: var(--tp-btn-soft); color: var(--tp-ink); text-decoration: none; transition: background-color .15s; }
.tp-f-hub__city:hover { background: var(--tp-btn-soft-hover); color: var(--tp-ink); }
.tp-f-hub__city-name { min-width: 0; font-size: var(--tp-fs-md); font-weight: 600; line-height: 1.3;
    overflow-wrap: break-word; }
.tp-f-hub__city:hover .tp-f-hub__city-name { color: var(--tp-link); }
.tp-f-hub__city-count { color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); line-height: 1.4;
    font-variant-numeric: tabular-nums; }

/* Категории и сети: списки ссылок колонками по всей ширине карточки */
.tp-f-hub__nav { min-width: 0; }
.tp-f-hub__chain { color: var(--tp-ink); overflow-wrap: anywhere; }

/* Туроператоры: список строками с линией снизу (1, 2, 3 колонки), ссылкой вся строка
   (растянутая ссылка названия); название цветом текста, при наведении цветом ссылки; ниже
   тип и город с номером реестра через точку серым. */
.tp-f-hub__ops { display: grid; grid-template-columns: minmax(0, 1fr); column-gap: var(--tp-6); margin: 0; padding: 0;
    list-style: none; }
.tp-f-hub__ops > li { display: grid; min-width: 0; border-bottom: 1px solid var(--tp-border); }
.tp-f-mini { box-sizing: border-box; position: relative; display: grid; gap: 2px; min-width: 0; padding: var(--tp-3) 0; }
.tp-f-mini__body { display: grid; gap: 2px; min-width: 0; }
.tp-f-mini__name { margin: 0; overflow: hidden; color: var(--tp-ink); font-size: var(--tp-fs-md); font-weight: 600;
    line-height: 1.35; text-overflow: ellipsis; white-space: nowrap; }
.tp-f .tp-f-mini__name a { color: inherit; text-decoration: none; }
.tp-f-mini__name a::after { content: ""; position: absolute; inset: 0; }
.tp-f .tp-f-mini:hover .tp-f-mini__name a { color: var(--tp-link); text-decoration: underline; text-underline-offset: .15em; }
.tp-f-mini__kind { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); line-height: 1.45; }
.tp-f-mini__meta { display: flex; flex-wrap: wrap; gap: 0 var(--tp-2); margin: 0; color: var(--tp-ink-muted);
    font-size: var(--tp-fs-sm); line-height: 1.45; }
.tp-f-mini__meta > span + span::before { content: "·"; margin-right: var(--tp-2); }

/* Регионы: буквы мягкими кнопками, регионы колонками, в регионе крупные города ссылками
   через запятую и «Еще N» с остальными */
.tp-f-hub__letters ul { display: flex; flex-wrap: wrap; gap: var(--tp-2); margin: 0 0 var(--tp-5); padding: 0; list-style: none; }
.tp-f-hub__letter { box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; min-width: 44px;
    height: 44px; padding: 0 var(--tp-2); border-radius: var(--tp-r-md); background: var(--tp-btn-soft); color: var(--tp-ink);
    font-weight: 600; text-decoration: none; transition: background-color .15s; }
.tp-f-hub__letter:hover { background: var(--tp-btn-soft-hover); color: var(--tp-ink); }
.tp-f-hub__regions { columns: 1; column-gap: var(--tp-6); }
.tp-f-hub__region { break-inside: avoid; margin: 0; border-bottom: 1px solid var(--tp-border);
    scroll-margin-top: var(--tp-5); }
.tp-f-hub__region:last-child { margin-bottom: 0; }
.tp-f-hub__region[open] { padding-bottom: var(--tp-3); }
.tp-f-hub__rsum { display: flex; align-items: center; gap: var(--tp-3); min-height: var(--tp-7); list-style: none;
    cursor: pointer; }
.tp-f-hub__rsum::-webkit-details-marker { display: none; }
.tp-f-hub__rsum::after { content: ""; flex: none; width: var(--tp-2); height: var(--tp-2); margin: 0 var(--tp-1) var(--tp-1);
    border-right: 2px solid var(--tp-ink-muted); border-bottom: 2px solid var(--tp-ink-muted); transform: rotate(45deg); }
.tp-f-hub__region[open] > .tp-f-hub__rsum::after { margin-bottom: 0; transform: rotate(-135deg); }
.tp-f-hub__h3 { flex: 1 1 auto; min-width: 0; margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-md); font-weight: 600;
    line-height: 1.4; }
.tp-f-hub__rn { flex: none; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); font-variant-numeric: tabular-nums; }
.tp-f-hub__region-cities { margin: 0; padding: 0; list-style: none; line-height: 1.6; }
.tp-f-hub__region-cities > li { display: inline; }
.tp-f-hub__region-cities > li:not(:last-child)::after { content: ","; margin-right: var(--tp-1); color: var(--tp-ink-muted); }
.tp-f-hub__region-cities a { color: var(--tp-link); text-decoration: none; }
.tp-f-hub__region-cities a:hover { text-decoration: underline; text-underline-offset: .15em; }
.tp-f-hub__count { color: var(--tp-ink-muted); font-size: var(--tp-fs-xs); font-variant-numeric: tabular-nums; }
.tp-f-hub__more { margin: var(--tp-1) 0 0; }
.tp-f-hub__more-btn { display: inline-flex; align-items: center; min-height: var(--tp-5); color: var(--tp-link);
    font-size: var(--tp-fs-sm); font-weight: 600; list-style: none; cursor: pointer; }
.tp-f-hub__more-btn::-webkit-details-marker { display: none; }
.tp-f-hub__more-btn:hover { text-decoration: underline; text-underline-offset: .15em; }
.tp-f-hub__more[open] > .tp-f-hub__more-btn { display: none; }
.tp-f-hub__prose p { max-width: 72ch; margin: 0; }
.tp-f-hub__prose p + p { margin-top: var(--tp-3); }

.tp-f-hub__city:focus-visible, .tp-f-hub__letter:focus-visible, .tp-f-hub__region-cities a:focus-visible,
.tp-f-hub__all:focus-visible, .tp-f-hub__more-btn:focus-visible, .tp-f-mini__name a:focus-visible,
.tp-f-hub__rsum:focus-visible {
    outline: 2px solid var(--tp-link); outline-offset: 2px; }

@media (min-width: 640px) {
    .tp-f-hub__search { grid-template-columns: minmax(0, 1fr) auto; align-items: end; }
    .tp-f-hub__search > .tp-f-hub__field:first-child { grid-column: 1 / -1; }
    .tp-f-hub__cities { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--tp-3); }
    .tp-f-hub__city-name { font-size: var(--tp-fs-lg); }
    .tp-f-hub__ops { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .tp-f-hub__regions { columns: 2; }
    .tp-f-hub__region { margin: 0 0 var(--tp-5); border-bottom: 0; }
    .tp-f-hub__region[open] { padding-bottom: 0; }
    .tp-f-hub__rsum { display: block; min-height: 0; margin: 0 0 var(--tp-1); pointer-events: none; cursor: default; }
    .tp-f-hub__rsum::after, .tp-f-hub__rn { display: none; }
}
@media (min-width: 768px) {
    .tp-f-hub__cities { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (min-width: 1024px) {
    .tp-f-hub__search { grid-template-columns: minmax(0, 1fr) var(--tp-f-city-w) auto; }
    .tp-f-hub__search > .tp-f-hub__field:first-child { grid-column: auto; }
    .tp-f-hub__cities { grid-template-columns: repeat(6, minmax(0, 1fr)); }
    .tp-f-hub__ops { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .tp-f-hub__regions { columns: 4; }
    .tp-f-hub__letter { min-width: calc(var(--tp-6) + var(--tp-2)); height: calc(var(--tp-6) + var(--tp-2)); }
}
@media (prefers-reduced-motion: reduce) {
    .tp-f-hub__letter, .tp-f-hub__city { transition: none; }
}

/* == pages == */
/* Формы (отзыв на карточке и странице отзывов, сообщение об ошибке), страница всех отзывов
   и служебные страницы (этап 9, спецификация 8 и 12.6) по правилам карточки. Все отзывы:
   шапка карточки (.tp-f-card-head с плиткой _ui/logo.html, плашкой _ui/hrating.html, рядом
   кнопок), ниже тело карточки (.tp-f-card-body): слева карточка разделов со сводкой
   (.tp-f-rsum, .tp-f-dist блока card), сортировкой текстовыми ссылками, лентой, пагинацией
   (.tp-f-pager блока listing, на белой карточке текущая страница серой плашкой) и формой;
   справа панель контактов. Служебные: шапка страницы (.tp-f-phead), форма отдельной
   карточкой шириной колонки разделов карточки. Поля и варианты ответа на высоту кнопок
   (52/48) со скруглением 12 px, как поиск хаба; варианты мягкими плашками; главная кнопка
   в ряду шапки и кнопка формы не уже 280 px от 640 px, на телефоне во всю ширину. */
.tp-f-form { display: grid; gap: var(--tp-4); margin-top: var(--tp-4); }
.tp-f-form__field { display: grid; gap: var(--tp-1); min-width: 0; }
fieldset.tp-f-form__field { margin: 0; padding: 0; border: 0; }
.tp-f-form__label { padding: 0; color: var(--tp-ink); font-size: var(--tp-fs-sm); font-weight: 600; line-height: 1.5; }
/* Переключатель в плашке свой: круг 20 px с рамкой 2 px, выбранный - точка цвета ссылки. */
.tp-f-choice input { flex: none; width: var(--tp-f-line-h); height: var(--tp-f-line-h);
    box-sizing: border-box; margin: 0; border: 2px solid var(--tp-border-strong); border-radius: 50%;
    background: var(--tp-surface); -webkit-appearance: none; appearance: none; cursor: pointer; }
.tp-f-choice input:checked { border-color: var(--tp-link); background: var(--tp-link);
    box-shadow: inset 0 0 0 3px var(--tp-surface); }
@media (forced-colors: active) {
    .tp-f-choice input { border-color: CanvasText; }
    .tp-f-choice input:checked { background: Highlight; }
}
.tp-f-form input[type="text"], .tp-f-form input[type="email"], .tp-f-form input[type="month"], .tp-f-form select,
.tp-f-form textarea { box-sizing: border-box; width: 100%; min-height: var(--tp-f-btn-h); margin: 0;
    padding: var(--tp-3) var(--tp-4); border: 1px solid var(--tp-border-strong); border-radius: var(--tp-r-md);
    background: var(--tp-surface); color: var(--tp-ink); font: inherit; font-size: var(--tp-fs-md); line-height: 1.5; }
.tp-f-form input[type="text"], .tp-f-form input[type="email"], .tp-f-form input[type="month"], .tp-f-form select {
    height: var(--tp-f-btn-h); padding-block: 0; }
.tp-f-form textarea { min-height: calc(var(--tp-8) * 2); resize: vertical; }
.tp-f-form input:hover, .tp-f-form select:hover, .tp-f-form textarea:hover { border-color: var(--tp-ink-faint); }
.tp-f-form input:focus-visible, .tp-f-form select:focus-visible, .tp-f-form textarea:focus-visible {
    border-color: var(--tp-link); outline: 2px solid var(--tp-link); outline-offset: 0; }
.tp-f-form [aria-invalid="true"] { border-color: var(--tp-closed); }
.tp-f-form__help, .tp-f-form__consent { max-width: 72ch; margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-form__error { margin: 0; color: var(--tp-closed); font-size: var(--tp-fs-sm); }
.tp-f-form__alert { margin: 0; padding: var(--tp-3) var(--tp-4); border-radius: var(--tp-r-md);
    background: var(--tp-btn-soft); color: var(--tp-closed); }
.tp-f-form__choices { display: grid; gap: var(--tp-2); }
.tp-f-choice { box-sizing: border-box; display: flex; align-items: center; gap: var(--tp-3);
    min-height: var(--tp-f-btn-h); padding: var(--tp-2) var(--tp-4); border-radius: var(--tp-r-md);
    background: var(--tp-btn-soft); color: var(--tp-ink); line-height: 1.4; cursor: pointer;
    transition: background-color .15s; }
.tp-f-choice:hover { background: var(--tp-btn-soft-hover); }
.tp-f-choice:has(input:checked) { background: var(--tp-surface-accent); box-shadow: inset 0 0 0 2px var(--tp-link); }
.tp-f-choice:focus-within { outline: 2px solid var(--tp-link); outline-offset: 2px; }
.tp-f-form__submit, .tp-f-form > .tp-f-btn--primary { justify-self: stretch; }
/* Форма отзыва: не шире 640 px; оценка пятью плашками (на телефоне списком с переключателем,
   от 640 px в ряд: цифра 22 px и слово 13 px, переключатель скрыт, но в фокусе); опыт обращения
   плашками в две колонки; месяц и год двумя списками со стрелкой Lucide chevron-down. */
.tp-f-form--review { max-width: 40rem; }
.tp-f-form__opt { color: var(--tp-ink-muted); font-weight: 400; }
.tp-f-rate { display: grid; gap: var(--tp-2); }
.tp-f-rate__num { font-weight: 600; }
.tp-f-rate__word { color: var(--tp-ink-muted); }
/* Свой выпадающий список (firms/js/select.js): поле как у остальных полей формы, список
   белой карточкой с рамкой и мягкой тенью, пункты 44 px, наведенный пункт мягким фоном,
   выбранный цветом ссылки и 600, пункт-подсказка («Месяц», «Год») серым; вверх, если
   снизу нет места. */
.tp-f-select { position: relative; min-width: 0; }
.tp-f-select__control { box-sizing: border-box; display: flex; align-items: center; width: 100%; height: var(--tp-f-btn-h);
    padding: 0 calc(var(--tp-4) + var(--tp-5)) 0 var(--tp-4); border: 1px solid var(--tp-border-strong);
    border-radius: var(--tp-r-md); background: var(--tp-surface) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235c6b73' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") no-repeat right var(--tp-3) center / var(--tp-5);
    color: var(--tp-ink); font-size: var(--tp-fs-md); line-height: 1.5; cursor: pointer; -webkit-user-select: none;
    user-select: none; }
.tp-f-select__control:hover { border-color: var(--tp-ink-faint); }
.tp-f-select__control:focus-visible { border-color: var(--tp-link); outline: 2px solid var(--tp-link); outline-offset: 0; }
.tp-f-select__control[aria-expanded="true"] { border-color: var(--tp-link); }
.tp-f-select__control[aria-invalid="true"] { border-color: var(--tp-closed); }
.tp-f-select__value { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tp-f-select.is-empty .tp-f-select__value { color: var(--tp-ink-muted); }
.tp-f-select__list { position: absolute; top: calc(100% + var(--tp-1)); left: 0; z-index: 20; box-sizing: border-box;
    width: max-content; min-width: 100%; max-width: calc(100vw - 2 * var(--tp-4)); max-height: calc(var(--tp-7) * 6);
    margin: 0; padding: var(--tp-1); overflow-y: auto; overscroll-behavior: contain; list-style: none;
    background: var(--tp-surface); border: 1px solid var(--tp-border); border-radius: var(--tp-r-md);
    box-shadow: var(--tp-shadow-md); }
.tp-f-select.is-up .tp-f-select__list { top: auto; bottom: calc(100% + var(--tp-1)); }
.tp-f-select__option { display: flex; align-items: center; min-height: 44px; padding: 0 var(--tp-3);
    border-radius: var(--tp-r-sm); color: var(--tp-ink); font-size: var(--tp-fs-md); cursor: pointer; white-space: nowrap; }
.tp-f-select__option.is-placeholder { color: var(--tp-ink-muted); }
.tp-f-select__option.is-active { background: var(--tp-btn-soft); }
.tp-f-select__option[aria-selected="true"] { color: var(--tp-link); font-weight: 600; }
.tp-f-select__option[aria-disabled="true"] { color: var(--tp-ink-faint); cursor: default; }
.tp-f-month { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 8rem); gap: var(--tp-2); max-width: 24rem; }
.tp-f-form select { -webkit-appearance: none; appearance: none; padding-right: calc(var(--tp-4) + var(--tp-5));
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235c6b73' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
    background-position: right var(--tp-3) center; background-repeat: no-repeat; background-size: var(--tp-5); cursor: pointer; }
.tp-f-msg { margin: 0 0 var(--tp-4); padding: var(--tp-3) var(--tp-4); border-radius: var(--tp-r-md);
    background: var(--tp-btn-soft); color: var(--tp-ink); }
.tp-f-msg--ok { color: var(--tp-open); }
.tp-f-msg--error { color: var(--tp-closed); }

/* Блок формы отзыва (firms/js/review.js): состояние своего отзыва, две строки пояснений и
   кнопка «Оставить отзыв» (на телефоне во всю ширину, от 640 px не уже 280 px); форма
   приходит по нажатию на место кнопки. Под полем текста счетчик знаков серым, пока текст
   короче минимума, цветом текста. */
.tp-f-review { display: grid; gap: var(--tp-2); }
.tp-f-review > .tp-f-msg { margin: 0 0 var(--tp-2); }
.tp-f-review > .tp-f-note { margin: 0; }
.tp-f-review__start { margin: var(--tp-3) 0 0; }
.tp-f-review__open { width: 100%; }
.tp-f-review__slot:empty { display: none; }
.tp-f-review__slot > .tp-f-msg { margin: var(--tp-3) 0 0; }
.tp-f-form__count { margin: 0; color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); font-variant-numeric: tabular-nums; }
.tp-f-form__count.is-short { color: var(--tp-ink); }
.tp-f-form__field:has(input[aria-invalid="true"]) .tp-f-choice:not(:has(input:checked)) { box-shadow: inset 0 0 0 1px var(--tp-closed); }

/* Окно итога отправки отзыва: по центру, не шире 480 px, белая карточка 16 px со скруглением
   и большой тенью; в шапке знак (галочка зеленым или «i» красным в круге 40 px), заголовок
   и крестик; ниже текст и список ошибок, внизу «Понятно» и ссылка «Мои отзывы». */
.tp-f-dialog { box-sizing: border-box; width: calc(100% - 2 * var(--tp-4)); max-width: 30rem; max-height: calc(100% - 2 * var(--tp-4));
    margin: auto; padding: 0; overflow: auto; border: 0; border-radius: var(--tp-r-lg2); background: var(--tp-surface);
    color: var(--tp-ink); box-shadow: var(--tp-shadow-lg); overscroll-behavior: contain; }
.tp-f-dialog::backdrop { background: color-mix(in srgb, var(--tp-ink) 45%, transparent); }
.tp-f-dialog__head { display: flex; align-items: center; gap: var(--tp-3);
    padding: var(--tp-4) var(--tp-3) 0 var(--tp-f-box-pad); }
.tp-f-dialog__mark { display: inline-flex; flex: none; align-items: center; justify-content: center;
    width: var(--tp-7); height: var(--tp-7); border-radius: 50%; }
.tp-f-dialog__mark--ok { background: color-mix(in srgb, var(--tp-open) 12%, var(--tp-surface)); color: var(--tp-open); }
.tp-f-dialog__mark--error { background: color-mix(in srgb, var(--tp-closed) 10%, var(--tp-surface)); color: var(--tp-closed); }
.tp-f-dialog__title { flex: 1 1 auto; min-width: 0; margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-lg);
    font-weight: 700; line-height: 1.3; }
.tp-f-dialog__close { flex: none; }
.tp-f-dialog__body { display: grid; gap: var(--tp-2); padding: var(--tp-4) var(--tp-f-box-pad) 0; }
.tp-f-dialog__text { margin: 0; color: var(--tp-ink); font-size: var(--tp-fs-md); line-height: 1.5; }
.tp-f-dialog__list { display: grid; gap: var(--tp-2); margin: 0; padding: 0 0 0 var(--tp-5); color: var(--tp-ink);
    font-size: var(--tp-fs-md); line-height: 1.5; }
.tp-f-dialog.is-error .tp-f-dialog__list { color: var(--tp-closed); }
.tp-f-dialog__foot { display: flex; flex-wrap: wrap-reverse; align-items: center; justify-content: flex-end; gap: var(--tp-3);
    padding: var(--tp-5) var(--tp-f-box-pad) var(--tp-f-box-pad); }
.tp-f-dialog__foot > .tp-f-btn { flex: 1 1 auto; }
.tp-f-dialog__ok { min-width: calc(var(--tp-8) * 2); }

/* Все отзывы: сводка без нижнего отступа (разделы разделяет линия), сортировка
   текстовыми ссылками (текущая без подчеркивания, 600), пагинация на белой карточке */
.tp-f-rv .tp-f-rsum { margin-bottom: 0; }
.tp-f-rv__sort { display: flex; flex-wrap: wrap; align-items: center; gap: 0 var(--tp-4); margin: 0 0 var(--tp-2); }
.tp-f-rv__sort-label { color: var(--tp-ink-muted); font-size: var(--tp-fs-sm); }
.tp-f-rv__sort-list { display: flex; flex-wrap: wrap; gap: 0 var(--tp-4); margin: 0; padding: 0; list-style: none; }
.tp-f-rv__sort-link { display: inline-flex; align-items: center; min-height: 44px; color: var(--tp-link);
    font-size: var(--tp-fs-sm); font-weight: 500; text-decoration: underline; text-underline-offset: .15em; }
.tp-f-rv__sort-link[aria-current="page"] { color: var(--tp-ink); font-weight: 600; text-decoration: none; }
.tp-f-rv__sort-link:focus-visible { outline: 2px solid var(--tp-link); outline-offset: 2px; }
.tp-f-rv__feed { min-width: 0; }
.tp-f-rv .tp-f-pager { margin-top: var(--tp-4); }
.tp-f-rv .tp-f-pager__list { justify-content: flex-start; }
.tp-f-rv a.tp-f-pager__item:hover { background: var(--tp-btn-soft); }
.tp-f-rv .tp-f-pager__item[aria-current="page"] { background: var(--tp-btn-soft); box-shadow: none; }

/* Служебные: форма карточкой шириной колонки разделов карточки */
.tp-f-svc__main { min-width: 0; }
.tp-f-svc__main > .tp-f-form:first-child { margin-top: 0; }

@media (min-width: 640px) {
    .tp-f-form__choices { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .tp-f-form__submit, .tp-f-form > .tp-f-btn--primary { justify-self: start; min-width: var(--tp-f-cta-w); }
    .tp-f-rate { grid-template-columns: repeat(5, minmax(0, 1fr)); }
    .tp-f-rate__opt { position: relative; flex-direction: column; justify-content: center; gap: 0;
        min-height: calc(var(--tp-7) + var(--tp-4)); padding: var(--tp-2); text-align: center; }
    .tp-f-rate__opt input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
    .tp-f-rate__num { font-size: var(--tp-fs-xl); line-height: 1.2; }
    .tp-f-rate__word { font-size: var(--tp-fs-xs); }
    .tp-f-card-head__actions > .tp-f-btn--primary { min-width: var(--tp-f-cta-w); }
    .tp-f-review__open { width: auto; min-width: var(--tp-f-cta-w); }
    .tp-f-dialog__foot > .tp-f-btn { flex: 0 0 auto; }
    .tp-f-dialog__title { font-size: var(--tp-fs-xl); }
}
@media (min-width: 1024px) {
    .tp-f-rv__sort-link { min-height: 24px; }
    .tp-f-svc__main { width: calc(100% - var(--tp-f-panel-w) - var(--tp-5)); }
}
@media (prefers-reduced-motion: reduce) {
    .tp-f-hub__options { scroll-behavior: auto; }
    .tp-f-choice { transition: none; }
}

/* == balloon == */
.tp-map-balloon__title { font-weight: 700; }
.tp-map-balloon__note { margin: 4px 0 0; }
