/* =========================================================
   Desktop density for the four catalogue-style sections:
   Toponyms, Dictionary, Words and Sources.

   This file is deliberately loaded by those pages only.
   The map and all layouts up to 1100px are not affected.
========================================================= */

@media (min-width:1101px){
    html{
        --header-height:78px;
    }

    /* Public header: approximately the visual density of 85% browser zoom. */
    .topo-header__inner{
        grid-template-columns:175px minmax(0, 1fr) 140px;
        gap:28px;
        width:min(calc(100% - 48px), 1380px);
        min-height:78px;
    }

    .topo-header__logo img{
        width:160px;
    }

    .topo-header__menu{
        gap:30px;
    }

    .topo-header__link{
        min-height:78px;
        font-size:12.5px;
    }

    .topo-header__menu-item.active .topo-header__link::after,
    .topo-header__link.active::after{
        bottom:14px;
    }

    .topo-header__tools{
        min-width:140px;
        min-height:78px;
    }

    /* The working area keeps the three-column desktop structure. */
    .section.section--work.catalog-v2{
        padding-top:20px;
        padding-bottom:32px;
    }

    .catalog-v2 .container--wide{
        max-width:1380px;
    }

    /*
     * Паспорт — резиновая колонка, а не фиксированные 315px.
     * При 315px под текст оставалось 285px, то есть 33 знака в строке
     * при норме для связного чтения 45–75. Этимология читалась узкой
     * лентой, а колонка вырастала по высоте. Верхняя граница 460px
     * даёт около 49 знаков; в остаток забирает список статей.
     */
    .catalog-v2 .layout-sidebar{
        grid-template-columns:var(--filters-w, 290px) minmax(0, 1fr) minmax(380px, 460px);
        gap:14px;
    }

    /*
     * Статьи: свернув панель фильтров (.filters-collapsed), место
     * освобождается не для списка карточек (там и так комфортная
     * ширина), а для паспорта справа — здесь читают текст самой
     * статьи. Поднимаем только верхнюю границу паспорта (+160px), а не
     * пересчитываем всю сетку через calc() — minmax() сам сначала
     * дотягивает вторую колонку до нового потолка и только остаток
     * отдаёт списку (см. комментарий выше про 460px).
     */
    .articles-page .layout-sidebar.filters-collapsed{
        grid-template-columns:var(--filters-w, 290px) minmax(0, 1fr) minmax(380px, 620px);
    }

    .catalog-v2 .layout-sidebar__main,
    .catalog-v2 .catalog-results-list{
        gap:8px;
    }

    .catalog-v2 .layout-sidebar__side{
        position:sticky;
        top:calc(var(--header-height) + 10px);
        max-height:calc(100vh - var(--header-height) - 20px);
        max-height:calc(100dvh - var(--header-height) - 20px);
        overflow-y:auto;
        overscroll-behavior:contain;
        scrollbar-gutter:stable;
    }

    /* Server statistics strip. */
    .catalog-v2 .stats-board{
        gap:14px;
        min-height:26px;
        margin-bottom:8px;
    }

    .catalog-v2 .stats-board__item{
        min-height:26px;
    }

    .catalog-v2 .stats-board__item + .stats-board__item{
        margin-left:10px;
    }

    .catalog-v2 .stats-board__item + .stats-board__item::before{
        margin-right:10px;
    }

    .catalog-v2 .stats-board__icon{
        width:15px;
        height:15px;
        font-size:14px;
    }

    .catalog-v2 .stats-board__value{
        font-size:16px;
    }

    /* Search and the result counter. */
    .catalog-v2 .catalog-search-panel{
        gap:7px;
        margin-bottom:4px;
    }

    .catalog-v2 .catalog-search-form{
        gap:8px;
    }

    .catalog-v2 .catalog-search-input{
        height:42px;
        font-size:15px;
    }

    .catalog-v2 .catalog-search-button{
        height:42px;
        min-width:76px;
        padding-right:15px;
        padding-left:15px;
        font-size:13px;
    }

    .catalog-v2 .catalog-results-head{
        gap:10px;
        margin:6px 0 8px;
    }

    .catalog-v2 .catalog-results-summary{
        gap:6px;
    }

    .catalog-v2 .catalog-results-summary__label,
    .catalog-v2 .catalog-results-summary__sep{
        font-size:.88rem;
    }

    .catalog-v2 .catalog-results-summary__found,
    .catalog-v2 .catalog-results-summary__total{
        font-size:1.28rem;
    }

    .catalog-v2 .catalog-results-sort{
        gap:6px;
    }

    .catalog-v2 .catalog-results-sort__link{
        min-width:34px;
        height:27px;
        font-size:.82rem;
    }

    /* Left filter: retain all controls while reducing only empty space. */
    .catalog-v2 .catalog-filter-panel{
        padding:12px 11px;
    }

    .catalog-v2 .catalog-filter-panel__head{
        margin-bottom:9px;
    }

    .catalog-v2 .catalog-filter-block{
        gap:7px;
        padding:10px 1px;
    }

    .catalog-v2 .catalog-filter-districts,
    .catalog-v2 .catalog-filter-letters{
        gap:4px;
    }

    .catalog-v2 .catalog-filter-districts .catalog-filter-chip{
        height:24px;
        min-height:24px;
        font-size:10.5px;
    }

    .catalog-v2 .catalog-type-filter{
        gap:5px;
    }

    .catalog-v2 .catalog-type-filter__body{
        gap:3px;
    }

    .catalog-v2 .catalog-type-filter-group__title{
        min-height:31px;
        padding:6px 7px;
    }

    .catalog-v2 .catalog-type-filter-group__items{
        gap:4px;
        padding:6px;
    }

    .catalog-v2 .catalog-type-filter-type{
        min-height:26px;
        padding:4px 6px;
    }

    .catalog-v2 .catalog-filter-letters .catalog-filter-chip{
        height:24px;
        min-height:24px;
        font-size:11px;
    }

    /*
     * Toponym cards. Fixed relation slots are intentionally untouched.
     * gap/min-height/padding/margin-top здесь больше НЕ задаются — та
     * же специфичность, что у --density-правил в card.css, но этот
     * файл подключается позже catalog.css, поэтому фиксированные числа
     * молча побеждали и полностью гасили --density на любом экране
     * ≥1101px (то есть буквально везде, где это проверяли). Осталась
     * только ширина последней колонки — она нигде больше не задаётся.
     */
    .catalog-v2 .geo-result-layout{
        grid-template-columns:minmax(0, 1fr) auto 68px;
    }

    /*
     * Dictionary article cards. padding здесь больше не задаётся — та же
     * причина, что у .geo-result-layout чуть выше: у этого блока та же
     * специфичность, что у --density-calc() в dictionary_articles.css,
     * но desktop_density.css подключается позже и фиксированное число
     * молча побеждало на любом экране ≥1101px, как ни задай --density
     * в dictionary_articles.css.
     */

    .dictionary-catalog .dictionary-article-card__head{
        gap:14px;
    }

    .dictionary-catalog .dictionary-article-card__summary,
    .dictionary-catalog .dictionary-article-card__summary-placeholder{
        margin-top:8px;
        line-height:1.48;
    }

    .dictionary-catalog .dictionary-article-card__usage{
        gap:10px;
        margin-top:11px;
        padding-top:9px;
    }

    .dictionary-catalog .dictionary-article-card__geo-types{
        gap:5px;
    }

    .dictionary-catalog .dictionary-article-card__geo-type{
        min-height:0;
        padding:0;
    }

    /* Words cards and their additional classifications. */
    .dictionary-catalog .appellative-result-card .dictionary-article-card__layout{
        padding:13px 16px 12px;
    }

    .dictionary-catalog .appellative-result-card__meaning{
        margin-top:8px;
    }

    .dictionary-catalog .catalog-filter-block--classification,
    .dictionary-catalog .catalog-filter-block--classification + .catalog-filter-block--classification{
        margin-top:9px;
        padding-top:9px;
    }

    .dictionary-catalog .catalog-filter-block--classification .catalog-filter-title{
        margin-bottom:6px;
    }

    .dictionary-catalog .catalog-filter-block--classification .catalog-filter-chip--facet{
        min-height:27px;
        padding:4px 7px;
    }

    /* Dictionary / Words local switch and Altai keyboard. */
    .dictionary-catalog .dictionary-section-switcher{
        margin-bottom:8px;
    }

    .dictionary-catalog .dictionary-section-tabs{
        gap:6px;
    }

    .dictionary-catalog .dictionary-section-tabs__item{
        min-height:32px;
        padding:6px 12px;
    }

    .dictionary-catalog .dictionary-search-stack{
        --altai-special-key-height:25px;
        --altai-special-row-gap:4px;
    }

    .dictionary-catalog .altai-special-keys{
        gap:4px;
    }

    .dictionary-catalog .altai-special-keys__key{
        min-width:29px;
        padding:0 6px;
        font-size:14px;
    }

    /* Sources: remove the artificial 132px minimum card height. */
    .source-catalog .geo-result-layout{
        grid-template-columns:minmax(0, 1fr);
        min-height:96px;
    }

    .source-catalog .source-article-card__summary{
        margin-top:8px;
        line-height:1.42;
    }

    .source-catalog .source-filter-select{
        min-height:31px;
    }

    /* Both side columns stay useful on a short screen. */
    .catalog-v2 .catalog-object-side{
        top:calc(var(--header-height) + 10px);
    }

    .catalog-v2 .object-preview{
        max-height:calc(100vh - var(--header-height) - 20px);
        max-height:calc(100dvh - var(--header-height) - 20px);
    }
}

/*
 * Узкий десктоп (1101–1279): три колонки только-только помещаются.
 * Верхняя граница паспорта в 460px здесь съедала список — на 1101px
 * от него оставалось 331px. Держим паспорт скромнее: строка выходит
 * короче, чем на широких экранах, но всё равно длиннее прежних 33
 * знаков, и список остаётся читаемым.
 */
@media (min-width:1101px) and (max-width:1279px){
    .catalog-v2 .layout-sidebar{
        grid-template-columns:var(--filters-w, 278px) minmax(0, 1fr) minmax(330px, 380px);
    }

    /* Тот же приём, что и в блоке ≥1101px выше, но прирост скромнее
       (+80px) — на узком десктопе меньше свободного места и раздувать
       паспорт сильнее уже в ущерб списку. */
    .articles-page .layout-sidebar.filters-collapsed{
        grid-template-columns:var(--filters-w, 278px) minmax(0, 1fr) minmax(330px, 460px);
    }
}

/*
 * Широкие экраны: потолок контейнера 1380px оставлял простаивать
 * 220px на 1600 и 540px на 1920 — паспорт при этом упирался в свои
 * 315px. Здесь потолок поднимается ступенями, чтобы прибавка шла из
 * пустых полей, а не отнималась у списка статей. Блоки стоят до
 * правил для низких экранов: на невысоком мониторе плотная раскладка
 * по-прежнему важнее ширины и перекрывает эти значения.
 */
@media (min-width:1500px){
    .catalog-v2 .container--wide{
        max-width:1460px;
    }
}

@media (min-width:1600px){
    .catalog-v2 .container--wide{
        max-width:1520px;
    }
}

@media (min-width:1900px){
    .catalog-v2 .container--wide{
        max-width:1660px;
    }
}

/*
 * Short desktop viewport: approximately the visual density of 75% zoom.
 * Width remains desktop, so mobile rules and the map are still excluded.
 */
@media (min-width:1101px) and (max-height:800px){
    html{
        --header-height:68px;
    }

    .topo-header__inner{
        grid-template-columns:155px minmax(0, 1fr) 110px;
        gap:22px;
        width:min(calc(100% - 32px), 1320px);
        min-height:68px;
    }

    .topo-header__logo img{
        width:142px;
    }

    .topo-header__menu{
        gap:24px;
    }

    .topo-header__link{
        min-height:68px;
        font-size:12px;
    }

    .topo-header__menu-item.active .topo-header__link::after,
    .topo-header__link.active::after{
        bottom:11px;
    }

    .topo-header__tools{
        min-width:110px;
        min-height:68px;
    }

    .section.section--work.catalog-v2{
        padding-top:12px;
        padding-bottom:22px;
    }

    .catalog-v2 .container--wide{
        max-width:1320px;
    }

    /* Низкий экран: плотнее, но паспорт тоже резиновый — узкая
       строка тут вредит вдвойне, в экран помещается меньше строк. */
    .catalog-v2 .layout-sidebar{
        grid-template-columns:var(--filters-w, 273px) minmax(0, 1fr) minmax(340px, 420px);
        gap:10px;
    }

    /* Тот же приём, что и в блоке ≥1101px выше (+140px). */
    .articles-page .layout-sidebar.filters-collapsed{
        grid-template-columns:var(--filters-w, 273px) minmax(0, 1fr) minmax(340px, 560px);
    }

    .catalog-v2 .layout-sidebar__main,
    .catalog-v2 .catalog-results-list{
        gap:6px;
    }

    .catalog-v2 .layout-sidebar__side,
    .catalog-v2 .catalog-object-side{
        top:calc(var(--header-height) + 7px);
    }

    .catalog-v2 .layout-sidebar__side,
    .catalog-v2 .object-preview{
        max-height:calc(100vh - var(--header-height) - 14px);
        max-height:calc(100dvh - var(--header-height) - 14px);
    }

    .catalog-v2 .stats-board{
        gap:10px;
        min-height:23px;
        margin-bottom:5px;
    }

    .catalog-v2 .stats-board__item{
        min-height:23px;
    }

    .catalog-v2 .stats-board__item + .stats-board__item{
        margin-left:7px;
    }

    .catalog-v2 .stats-board__item + .stats-board__item::before{
        margin-right:7px;
    }

    .catalog-v2 .stats-board__icon{
        width:14px;
        height:14px;
        font-size:13px;
    }

    .catalog-v2 .stats-board__value{
        font-size:14px;
    }

    .catalog-v2 .catalog-search-panel{
        gap:5px;
        margin-bottom:2px;
    }

    .catalog-v2 .catalog-search-form{
        gap:6px;
    }

    .catalog-v2 .catalog-search-input,
    .catalog-v2 .catalog-search-button{
        height:38px;
    }

    .catalog-v2 .catalog-search-input{
        font-size:14px;
    }

    .catalog-v2 .catalog-search-button{
        min-width:70px;
        padding-right:13px;
        padding-left:13px;
        font-size:12px;
    }

    .catalog-v2 .catalog-results-head{
        margin:4px 0 6px;
    }

    .catalog-v2 .catalog-results-summary__label,
    .catalog-v2 .catalog-results-summary__sep{
        font-size:.8rem;
    }

    .catalog-v2 .catalog-results-summary__found,
    .catalog-v2 .catalog-results-summary__total{
        font-size:1.16rem;
    }

    .catalog-v2 .catalog-results-sort__link{
        min-width:32px;
        height:25px;
        font-size:.78rem;
    }

    .catalog-v2 .catalog-filter-panel{
        padding:9px 8px;
    }

    .catalog-v2 .catalog-filter-panel__head{
        margin-bottom:6px;
        font-size:12px;
    }

    .catalog-v2 .catalog-filter-block{
        gap:5px;
        padding:7px 1px;
    }

    .catalog-v2 .catalog-filter-districts,
    .catalog-v2 .catalog-filter-letters{
        gap:3px;
    }

    .catalog-v2 .catalog-filter-districts .catalog-filter-chip{
        height:22px;
        min-height:22px;
        font-size:9.5px;
    }

    .catalog-v2 .catalog-type-filter{
        gap:4px;
    }

    .catalog-v2 .catalog-type-filter__body{
        gap:2px;
    }

    .catalog-v2 .catalog-type-filter-group__title{
        min-height:28px;
        padding:5px 6px;
    }

    .catalog-v2 .catalog-type-filter-group__name{
        gap:6px;
        font-size:10.5px;
    }

    .catalog-v2 .catalog-type-filter-group__icon{
        width:16px;
        height:16px;
        font-size:12px;
    }

    .catalog-v2 .catalog-type-filter-group__items{
        gap:3px;
        padding:5px;
    }

    .catalog-v2 .catalog-type-filter-type{
        min-height:24px;
        padding:3px 5px;
        font-size:10px;
    }

    .catalog-v2 .catalog-filter-letters .catalog-filter-chip{
        height:22px;
        min-height:22px;
        font-size:10.5px;
    }

    /*
     * gap/min-height/padding/font-size/margin-top здесь больше НЕ
     * задаются — та же история, что и в normal-тире выше: конфликтовали
     * с --density в card.css и полностью гасили его молча. Осталась
     * только ширина последней колонки.
     */
    .catalog-v2 .geo-result-layout{
        grid-template-columns:minmax(0, 1fr) auto 64px;
    }

    .dictionary-catalog .dictionary-section-switcher{
        margin-bottom:6px;
    }

    .dictionary-catalog .dictionary-section-tabs__item{
        min-height:29px;
        padding:5px 10px;
        font-size:12px;
    }

    .dictionary-catalog .dictionary-search-stack{
        --altai-special-key-height:23px;
        --altai-special-row-gap:3px;
    }

    .dictionary-catalog .altai-special-keys{
        gap:3px;
    }

    .dictionary-catalog .altai-special-keys__key{
        min-width:27px;
        padding:0 5px;
        font-size:13px;
    }

    .dictionary-catalog .dictionary-article-card__head{
        gap:10px;
    }

    .dictionary-catalog .dictionary-article-card__summary,
    .dictionary-catalog .dictionary-article-card__summary-placeholder{
        margin-top:7px;
        line-height:1.46;
    }

    .dictionary-catalog .dictionary-article-card__usage{
        gap:8px;
        margin-top:8px;
        padding-top:7px;
    }

    .dictionary-catalog .appellative-result-card .dictionary-article-card__layout{
        padding:10px 12px 9px;
    }

    .dictionary-catalog .appellative-result-card__meaning{
        margin-top:6px;
        line-height:1.34;
    }

    .dictionary-catalog .catalog-filter-block--classification,
    .dictionary-catalog .catalog-filter-block--classification + .catalog-filter-block--classification{
        margin-top:6px;
        padding-top:6px;
    }

    .dictionary-catalog .catalog-filter-block--classification .catalog-filter-title{
        margin-bottom:4px;
    }

    .dictionary-catalog .catalog-filter-block--classification .catalog-filter-chip--facet{
        min-height:24px;
        padding:3px 6px;
    }

    .source-catalog .geo-result-layout{
        grid-template-columns:minmax(0, 1fr);
        min-height:82px;
    }

    .source-catalog .source-article-card__summary{
        margin-top:6px;
        line-height:1.36;
    }

    .source-catalog .source-article-card__geo-count{
        margin-top:5px;
    }

    .source-catalog .source-filter-select{
        min-height:28px;
        font-size:.73rem;
    }

    /*
     * padding у .object-preview и margin-top у .object-preview__meta
     * убраны — конфликтовали с фиксированными значениями в passport.css
     * (margin-top:-4px у altai-name, margin-top:8px у meta): та же
     * специфичность, но этот файл подключается позже, поэтому
     * побеждал молча. padding-bottom у meta уникален — оставлен.
     */
    .catalog-v2 .object-preview__meta{
        padding-bottom:9px;
    }
}

/*
 * Очень невысокое окно (например, свёрнутое не на весь экран, ~600-650px
 * высоты). Панель фильтров и так скроллится внутри себя независимо от
 * страницы (layout-sidebar__side имеет свой overflow-y:auto) — это не
 * баг, а расчёт на случай, когда контента объективно больше, чем влезает.
 * Здесь просто ужимаем внутренние отступы панели фильтров ещё сильнее,
 * чтобы в её собственную прокручиваемую область помещалось больше без
 * скролла.
 */
@media (min-width:1101px) and (max-height:650px){
    html{
        --header-height:60px;
    }

    .topo-header__inner{
        min-height:60px;
    }

    .topo-header__link{
        min-height:60px;
    }

    .topo-header__tools{
        min-height:60px;
    }

    .catalog-v2 .layout-sidebar__side,
    .catalog-v2 .catalog-object-side{
        top:calc(var(--header-height) + 4px);
    }

    .catalog-v2 .layout-sidebar__side,
    .catalog-v2 .object-preview{
        max-height:calc(100vh - var(--header-height) - 8px);
        max-height:calc(100dvh - var(--header-height) - 8px);
    }

    .catalog-v2 .catalog-filter-panel{
        padding:6px 6px;
    }

    .catalog-v2 .catalog-filter-panel__head{
        margin-bottom:4px;
        font-size:11px;
    }

    .catalog-v2 .catalog-filter-block{
        gap:4px;
        padding:5px 1px;
    }

    .catalog-v2 .catalog-filter-title{
        margin-bottom:3px;
        font-size:11px;
    }

    .catalog-v2 .catalog-filter-districts,
    .catalog-v2 .catalog-filter-letters{
        gap:2px;
    }

    .catalog-v2 .catalog-filter-districts .catalog-filter-chip{
        height:20px;
        min-height:20px;
        font-size:9px;
    }

    .catalog-v2 .catalog-type-filter{
        gap:3px;
    }

    .catalog-v2 .catalog-type-filter__body{
        gap:2px;
    }

    .catalog-v2 .catalog-type-filter-group__title{
        min-height:24px;
        padding:4px 5px;
    }

    .catalog-v2 .catalog-type-filter-group__name{
        gap:5px;
        font-size:10px;
    }

    .catalog-v2 .catalog-type-filter-group__icon{
        width:14px;
        height:14px;
        font-size:11px;
    }

    .catalog-v2 .catalog-type-filter-group__items{
        gap:2px;
        padding:4px;
    }

    .catalog-v2 .catalog-type-filter-type{
        min-height:21px;
        padding:2px 4px;
        font-size:9.5px;
    }

    .catalog-v2 .catalog-filter-letters .catalog-filter-chip{
        height:20px;
        min-height:20px;
        font-size:10px;
    }

    .catalog-v2 .stats-board{
        gap:8px;
        min-height:20px;
        margin-bottom:4px;
    }

    .catalog-v2 .stats-board__item{
        min-height:20px;
    }

    .catalog-v2 .catalog-search-panel{
        gap:4px;
        margin-bottom:2px;
    }

    .catalog-v2 .catalog-search-input,
    .catalog-v2 .catalog-search-button{
        height:34px;
    }
}
