@charset "UTF-8";
/* Правил вне скоупа .catalog-v2 в этом файле больше нет. Прежняя пара правил
   для .catalog-hero-plain (гашение фонового фото, затем белый фон баннера)
   удалена вместе с самим баннером: страница начинается с блока тарифов.
   Единственный !important файла ушёл вместе с ними — остались только два
   в блоке prefers-reduced-motion. */

/* VITRINA. Витрина каталога разборов (/learning/articles). Островной CSS:
   КАЖДОЕ правило замкнуто на .catalog-v2, чтобы общие имена (.card, .grid,
   .search, .chip и прочие) не столкнулись с Bulma и app.css. Общий app.css
   и сборка Mix этой задачей не трогались.

   Шрифт Manrope здесь НЕ объявляется: его @font-face уже стоят в app.css
   (задача M), и body сайта уже набран им. Дублировать объявления незачем.

   Палитра — с новой главной: teal #1F6F78, hover #175861, золотой #B8AA73,
   текст #1A1D1E, приглушённый #5C676A, линия #D6DEDF, оттенок #F2F7F7. */

.catalog-v2 {
    --teal: #1F6F78;
    --teal-hover: #175861;
    --gold: #B8AA73;
    --ink: #1A1D1E;
    --muted: #5C676A;
    --line: #D6DEDF;
    --tint: #F2F7F7;
    --white: #fff;
    --radius: 14px;
    /* NAV-E3b: навбар стал 57px (56 + 1px нижняя граница), было 4.7rem (~76px).
       Липкая панель фильтров обязана начинаться ниже него, иначе её шапка
       уезжает под навбар. Значение держится здесь одно на весь каталог —
       при следующем изменении высоты панели править эту строку. */
    --nav-h: 57px;
    --shadow-hover: 0 10px 30px rgba(26, 29, 30, .12);

    font-family: Manrope, Arial, Helvetica, sans-serif;
    color: var(--ink);
    line-height: 1.5;
    -webkit-font-smoothing: antialiased;

}

/* Тон и раскрытие до краёв экрана держит .catalog-zone — она обёртывает ОБА
   вида каталога, и плитки, и аккордеон выпусков. Поэтому при переключении фон
   не прыгает белый-серый. Прежде это стояло на самом .catalog-v2, но остров
   существует только в виде «Плитками».

   Элемент несёт оба класса сразу (.catalog-v2 .catalog-zone), поэтому var(--tint)
   здесь разрешается: переменные объявлены выше на .catalog-v2.

   Раскрытие — точными отрицательными полями, а НЕ через 100vw: 100vw включает
   полосу прокрутки и дал бы горизонтальную прокрутку. Числа из замера app.css:
   section.products-section имеет padding 0 7rem 3rem, до 1407px — 0 3rem 3rem. */
.catalog-zone {
    background: var(--tint);
    margin-left: -3rem;
    margin-right: -3rem;
    /* содержимое не упирается в нижний край серого */
    padding-bottom: clamp(24px, 3vw, 40px);
}

@media screen and (min-width: 1408px) {
    .catalog-zone {
        margin-left: -7rem;
        margin-right: -7rem;
    }
}

/* Шов у подвала. Когда серая зона — последнее в секции (это подписчик: блок
   тарифов ему не показывается ни сверху, ни снизу), между ней и подвалом
   оставалась белая полоса в 3rem — нижний отступ section.products-section.
   Подвал при этом сам почти белый (#fafafa), и узкая чисто белая лента между
   двумя близкими тонами читалась случайной линией.

   Отступом внутри зоны это не лечится — полоса снаружи. Поэтому зона доводится
   до подвала отрицательным нижним полем ровно в те же 3rem, а внутренний отступ
   на те же 3rem увеличивается, чтобы расстояние от карточек до подвала
   не изменилось.

   Только для этого случая: у гостя и у вошедшего без подписки под зоной стоит
   блок тарифов, и подтягивать его вверх нельзя. */
.catalog-zone.is-last {
    margin-bottom: -3rem;
    padding-bottom: calc(3rem + clamp(24px, 3vw, 40px));
}

/* ── переключатель видов ── */

.catalog-v2 .catalog-switch {
    max-width: 1240px;
    margin: 0 auto;
    padding: clamp(18px, 2.4vw, 28px) clamp(16px, 4vw, 40px) 0;
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
}

.catalog-v2 .catalog-switch-btn {
    flex: 1 1 0;
    min-width: 170px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 9px;
    padding: 14px 20px;
    border: 1.5px solid var(--line);
    border-radius: 12px;
    background: var(--white);
    color: var(--muted);
    font-weight: 700;
    font-size: 1rem;
    text-align: center;
    transition: border-color .18s, color .18s, background-color .18s;
}

.catalog-v2 .catalog-switch-btn svg {
    flex: none;
}

.catalog-v2 .catalog-switch-btn:hover {
    border-color: var(--teal);
    color: var(--teal);
}

.catalog-v2 .catalog-switch-btn.is-active {
    background: var(--teal);
    border-color: var(--teal);
    color: #fff;
}

/* Обёртка аккордеона: у него нет своей ширины и полей, а .catalog-zone раскрыта
   до краёв экрана — без этого выпуски прижались бы к самым краям. Ширина и
   отступы те же, что у .cat-wrap, чтобы два вида стояли по одной сетке. */
.catalog-v2 .catalog-releases {
    max-width: 1240px;
    margin: 0 auto;
    padding: clamp(20px, 3vw, 32px) clamp(16px, 4vw, 40px) 40px;
}

.catalog-v2,
.catalog-v2 *,
.catalog-v2 *::before,
.catalog-v2 *::after {
    box-sizing: border-box;
}

.catalog-v2 a {
    color: inherit;
    text-decoration: none;
}

.catalog-v2 button {
    font-family: inherit;
    cursor: pointer;
}

/* ── скрытый заголовок ── */

/* Блока шапки (.cat-head с описанием и строкой чисел) на странице больше нет:
   после кнопок сразу идёт ряд Фильтры/Показано/Сортировка. Правила под него,
   .cat-head-inner, .cat-head p и .cat-stats удалены вместе с разметкой —
   мёртвого кода не осталось.

   Заголовок первого уровня на странице есть, но глазу не виден: он нужен
   поисковикам и программам чтения с экрана. Поэтому не display:none и не
   visibility:hidden — и то и другое убирает текст из озвучки, — а увод
   за пределы видимости с обрезкой. */
.catalog-v2 .cat-sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
}

/* ── раскладка ── */

.catalog-v2 .cat-wrap {
    max-width: 1240px;
    margin: 0 auto;
    padding: clamp(20px, 3vw, 32px) clamp(16px, 4vw, 40px) 40px;
    display: grid;
    grid-template-columns: 264px 1fr;
    gap: clamp(20px, 3vw, 36px);
    align-items: start;
}

@media (max-width: 900px) {
    .catalog-v2 .cat-wrap {
        grid-template-columns: 1fr;
    }
}

/* ── панель фильтров ── */

/* ── верхний ряд: Фильтры | Показано N из M | Сортировка ── */

/* Ряд занимает обе колонки сетки и внутри повторяет ту же разбивку, поэтому
   «Фильтры» стоит ровно над панелью, а счётчик — ровно над первой карточкой.
   Общая нижняя черта служит линией старта для обеих колонок. */
.catalog-v2 .cat-toprow {
    grid-column: 1 / -1;
    display: grid;
    grid-template-columns: 264px 1fr;
    gap: clamp(20px, 3vw, 36px);
    align-items: center;
    padding-bottom: 12px;
    border-bottom: 1px solid var(--line);
}

.catalog-v2 .cat-toprow-filters {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
}

.catalog-v2 .cat-toprow-title {
    font-weight: 800;
}

.catalog-v2 .cat-toprow-result {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
}

@media (max-width: 900px) {
    /* На телефоне ряд схлопывается в прежний тулбар: слово «Фильтры» уходит
       (там есть кнопка со шторкой), черта не нужна. */
    .catalog-v2 .cat-toprow {
        grid-template-columns: 1fr;
        padding-bottom: 0;
        border-bottom: none;
    }

    .catalog-v2 .cat-toprow-filters {
        display: none;
    }
}

.catalog-v2 .cat-filters {
    position: sticky;
    top: calc(var(--nav-h) + 14px);
}

.catalog-v2 .cat-box {
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: var(--white);
    overflow: hidden;
}

/* Шапка панели нужна только мобильной шторке: на десктопе слово «Фильтры»
   и «Сбросить» стоят в верхнем ряду, а панель начинается сразу с поиска. */
.catalog-v2 .cat-fhead {
    display: none;
    align-items: center;
    justify-content: space-between;
    padding: 14px 16px;
    border-bottom: 1px solid var(--line);
    font-weight: 800;
}

.catalog-v2 .cat-fhead-actions {
    display: flex;
    align-items: center;
    gap: 10px;
}

.catalog-v2 .cat-clear {
    background: none;
    border: none;
    color: var(--teal);
    font-weight: 600;
    font-size: .85rem;
    padding: 0;
    visibility: hidden;
}

.catalog-v2 .cat-clear.is-on {
    visibility: visible;
}

.catalog-v2 .cat-search {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 14px;
    border-bottom: 1px solid var(--line);
}

.catalog-v2 .cat-search svg {
    flex: none;
    color: var(--muted);
}

.catalog-v2 .cat-search input {
    border: none;
    outline: none;
    font-family: inherit;
    font-size: .95rem;
    width: 100%;
    color: var(--ink);
    background: transparent;
    box-shadow: none;
    height: auto;
    padding: 0;
}

.catalog-v2 .cat-group {
    border-bottom: 1px solid var(--line);
}

.catalog-v2 .cat-group:last-child {
    border-bottom: none;
}

.catalog-v2 .cat-group > summary {
    list-style: none;
    cursor: pointer;
    padding: 11px 16px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    font-weight: 600;
    font-size: .92rem;
}

.catalog-v2 .cat-group > summary::-webkit-details-marker {
    display: none;
}

.catalog-v2 .cat-group > summary .cat-chev {
    transition: transform .18s;
    color: var(--muted);
}

.catalog-v2 .cat-group[open] > summary .cat-chev {
    transform: rotate(180deg);
}

.catalog-v2 .cat-tags {
    padding: 2px 16px 12px;
}

.catalog-v2 .cat-tag-opt {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 5px 0;
    font-size: .9rem;
    color: var(--ink);
    cursor: pointer;
    user-select: none;
}

.catalog-v2 .cat-tag-opt input {
    accent-color: var(--teal);
    width: 16px;
    height: 16px;
    cursor: pointer;
    margin: 0;
}

.catalog-v2 .cat-tag-opt .cat-cnt {
    margin-left: auto;
    color: var(--muted);
    font-size: .8rem;
    font-weight: 600;
}

.catalog-v2 .cat-tag-opt:hover {
    color: var(--teal);
}

/* ── правая часть верхнего ряда ── */

.catalog-v2 .cat-toolbar-left {
    display: flex;
    align-items: center;
    gap: 14px;
}

.catalog-v2 .cat-result-count {
    font-weight: 600;
    color: var(--muted);
}

.catalog-v2 .cat-result-count b {
    color: var(--ink);
}

.catalog-v2 .cat-sort {
    display: flex;
    align-items: center;
    gap: 8px;
    color: var(--muted);
    font-size: .9rem;
}

.catalog-v2 .cat-sort select {
    font-family: inherit;
    font-weight: 600;
    border: 1px solid var(--line);
    border-radius: 9px;
    padding: 7px 10px;
    color: var(--ink);
    background: var(--white);
    font-size: .9rem;
}

.catalog-v2 .cat-chips {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}

.catalog-v2 .cat-chips:not(:empty) {
    margin-bottom: 16px;
}

/* Заливка белая, а не --tint: плашка лежит прямо на фоне острова, который
   теперь сам --tint, и одинаковый цвет оставил бы от неё только рамку.
   У .cat-ttag и .cat-cover тот же --tint сохранён — они внутри белых
   карточек, там он по-прежнему читается. */
.catalog-v2 .cat-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    background: var(--white);
    border: 1px solid var(--line);
    border-radius: 999px;
    padding: 5px 10px 5px 12px;
    font-size: .85rem;
    font-weight: 600;
    color: var(--teal);
}

.catalog-v2 .cat-chip button {
    background: none;
    border: none;
    color: var(--teal);
    font-size: 1rem;
    line-height: 1;
    padding: 0;
    opacity: .7;
}

.catalog-v2 .cat-chip button:hover {
    opacity: 1;
}

/* ── мобильная кнопка фильтров и шторка ── */

.catalog-v2 .cat-mfilter {
    display: none;
}

.catalog-v2 .cat-mclose {
    display: none;
    background: none;
    border: none;
    color: var(--muted);
    font-size: 1.4rem;
    line-height: 1;
    padding: 0;
}

@media (max-width: 900px) {
    .catalog-v2 .cat-filters {
        display: none;
    }

    .catalog-v2 .cat-filters.is-open {
        display: block;
        position: fixed;
        inset: 0;
        z-index: 60;
        background: rgba(26, 29, 30, .4);
        padding: 0;
    }

    .catalog-v2 .cat-filters.is-open .cat-box {
        position: absolute;
        right: 0;
        top: 0;
        height: 100%;
        width: min(340px, 86vw);
        border-radius: 0;
        overflow-y: auto;
        animation: cat-slidein .2s ease;
    }

    @keyframes cat-slidein {
        from {
            transform: translateX(100%);
        }
        to {
            transform: none;
        }
    }

    .catalog-v2 .cat-mfilter {
        display: inline-flex;
        align-items: center;
        gap: 8px;
        background: var(--white);
        border: 1px solid var(--line);
        border-radius: 10px;
        padding: 9px 14px;
        font-weight: 700;
        color: var(--ink);
    }

    .catalog-v2 .cat-mbadge {
        background: var(--teal);
        color: #fff;
        border-radius: 999px;
        min-width: 20px;
        height: 20px;
        display: grid;
        place-items: center;
        font-size: .75rem;
    }

    .catalog-v2 .cat-mbadge[hidden] {
        display: none;
    }

    .catalog-v2 .cat-mclose {
        display: block;
    }

    /* в шторке шапка панели возвращается: там живут «Сбросить» и крестик */
    .catalog-v2 .cat-fhead {
        display: flex;
    }
}

/* ── сетка карточек ── */

.catalog-v2 .cat-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 22px;
}

.catalog-v2 .cat-grid[hidden] {
    display: none;
}

@media (max-width: 1100px) {
    .catalog-v2 .cat-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 560px) {
    .catalog-v2 .cat-grid {
        grid-template-columns: 1fr;
    }
}

.catalog-v2 .cat-card {
    border: 1px solid var(--line);
    border-radius: var(--radius);
    overflow: hidden;
    background: var(--white);
    display: flex;
    flex-direction: column;
    transition: border-color .18s, box-shadow .18s, transform .18s;
}

.catalog-v2 .cat-card:hover {
    border-color: var(--teal);
    box-shadow: var(--shadow-hover);
    transform: translateY(-3px);
}

/* Кадр обложки — 16:9: это стандарт обложек проекта (1536x864) и пропорция,
   в которой обложка живёт на странице статьи и в миниатюрах. При ней картинка
   не режется нигде: ни в витрине, ни в статье. Прежние 3:2 обрезали по бокам
   16:9-производную, из которой витрина и берёт обложку. */
.catalog-v2 .cat-cover {
    position: relative;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    background: var(--tint);
}

/* cover, а не fill: пропорцию картинки не искажаем. Если источник когда-то
   окажется не 16:9 (старые оригиналы 3:2), он кадрируется по центру —
   значимое в кадре у нас в середине. */
.catalog-v2 .cat-cover img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
    display: block;
}

/* Метка доступа. Три состояния, у каждого свой цвет: teal — открыто всем,
   золотой — открывается после входа, тёмная полупрозрачная — по подписке.
   nowrap обязателен: «Бесплатно после регистрации» не должно ломаться
   на две строки поверх обложки. */
.catalog-v2 .cat-badge {
    position: absolute;
    top: 10px;
    left: 10px;
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: .72rem;
    font-weight: 700;
    padding: 4px 9px;
    border-radius: 999px;
    white-space: nowrap;
    max-width: calc(100% - 20px);
}

.catalog-v2 .cat-badge svg {
    flex: none;
}

.catalog-v2 .cat-badge.is-open {
    background: var(--teal);
    color: #fff;
}

.catalog-v2 .cat-badge.is-reg {
    background: var(--gold);
    color: var(--ink);
}

.catalog-v2 .cat-badge.is-sub {
    background: rgba(26, 29, 30, .62);
    color: #fff;
    backdrop-filter: blur(2px);
}

.catalog-v2 .cat-card-body {
    padding: 14px 16px 16px;
    display: flex;
    flex-direction: column;
    gap: 10px;
    flex: 1;
}

.catalog-v2 .cat-card h3 {
    margin: 0;
    font-size: 1.02rem;
    font-weight: 800;
    line-height: 1.32;
    letter-spacing: -.01em;
    color: var(--ink);
}

.catalog-v2 .cat-ttags {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
}

.catalog-v2 .cat-ttag {
    font-size: .74rem;
    font-weight: 600;
    color: var(--muted);
    background: var(--tint);
    border-radius: 6px;
    padding: 3px 8px;
}

.catalog-v2 .cat-src {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: var(--teal);
    font-weight: 700;
    font-size: .85rem;
}

.catalog-v2 .cat-src svg {
    flex: none;
}

.catalog-v2 .cat-cfoot {
    margin-top: auto;
    display: flex;
    align-items: center;
    gap: 10px;
    color: var(--muted);
    font-size: .8rem;
    font-weight: 600;
    flex-wrap: wrap;
}

.catalog-v2 .cat-dot {
    width: 3px;
    height: 3px;
    border-radius: 50%;
    background: var(--line);
    flex: none;
}

/* ── показать ещё, загрузка, пусто ── */

.catalog-v2 .cat-more {
    display: block;
    margin: 34px auto 0;
    background: var(--white);
    border: 1.5px solid var(--teal);
    color: var(--teal);
    font-weight: 700;
    padding: 12px 28px;
    border-radius: 11px;
    font-size: .95rem;
}

.catalog-v2 .cat-more:hover {
    background: var(--teal);
    color: #fff;
}

.catalog-v2 .cat-more[hidden],
.catalog-v2 .cat-loading[hidden],
.catalog-v2 .cat-empty[hidden] {
    display: none;
}

.catalog-v2 .cat-more:disabled {
    opacity: .55;
    cursor: default;
}

.catalog-v2 .cat-loading {
    padding: 28px 0;
    text-align: center;
    color: var(--muted);
    font-weight: 600;
}

.catalog-v2 .cat-empty {
    border: 1px dashed var(--line);
    border-radius: var(--radius);
    padding: 48px 24px;
    text-align: center;
    color: var(--muted);
}

.catalog-v2 .cat-empty b {
    display: block;
    color: var(--ink);
    font-size: 1.1rem;
    margin-bottom: 6px;
}

@media (prefers-reduced-motion: reduce) {
    .catalog-v2 *,
    .catalog-v2 *::before,
    .catalog-v2 *::after {
        animation: none !important;
        transition: none !important;
    }
}

/* VIT-2b 2026-08-02: subscription CTA restyled to match the home page pill
   (.home-v2 .primary-button in home.css). Scoped strictly to #subscription.
   The catalog island .catalog-v2 (filters, view switcher) is a SIBLING of this
   id, not a child, so it is not affected. The promo-code button inside the
   block is .is-secondary and stays untouched.
   font-size needs !important: .is-size-4 / .is-size-5-mobile are declared with
   !important on the element itself and cannot be beaten otherwise. */
#subscription .button.is-primary {
    min-height: 52px;
    padding: 13px 22px;
    border: 1px solid #1F6F78;
    border-radius: 999px;
    background-color: #1F6F78;
    color: #FFFFFF;
    font-size: 18px !important;
    line-height: 1.3;
    font-weight: 800;
    transition: transform 160ms ease, background-color 160ms ease, box-shadow 160ms ease;
}

#subscription .button.is-primary:hover {
    background-color: #175861;
    border-color: #175861;
    color: #FFFFFF;
    transform: translateY(-1px);
    box-shadow: 0 10px 22px rgba(31, 111, 120, 0.2);
}

#subscription .button.is-primary:focus:not(:active) {
    border-color: #175861;
    box-shadow: 0 0 0 .125em rgba(31, 111, 120, 0.25);
}

@media (prefers-reduced-motion: reduce) {
    #subscription .button.is-primary { transition: none !important; }
    #subscription .button.is-primary:hover { transform: none; }
}

/* ── LOG-YEAR 2026-08-02: строка года над выпусками ────────────────────────
   Вид «по выпускам» стал серверным островом, и прошлые полные годы свёрнуты
   в одну строку. Стили строки ВЫПУСКА не трогаются: они лежат в общем app.css
   (.article-release, .release-title, .content-list) и работают как работали.
   Здесь только то, чего прежде не существовало, — сама строка года.

   Всё замкнуто на .catalog-v2: на лендинге /learning живёт прежний Vue-аккордеон
   без этой обёртки, и он не должен почувствовать ничего.

   Разумный минимум: год читается тяжелее выпуска, вложенность видна отступом.
   Итоговый вид отдаёт Настя на приёмке staging. */

.catalog-v2 .cat-year-title {
    cursor: pointer;
    /* насыщенность задаётся здесь, а не Bulma-классом: has-text-weight-bold
       объявлен с !important и не дал бы году быть жирнее выпуска */
    font-weight: 800;
    font-size: 1.15rem;
    border-bottom: 2px solid #777;
}

.catalog-v2 .cat-year-title .cat-year-count {
    font-weight: 600;
    color: #555;
}

.catalog-v2 .cat-year-body {
    display: block;
}

.catalog-v2 .cat-year.collapsed .cat-year-body {
    display: none;
}

/* Выпуски внутри года — с отступом, иначе год и его выпуски читаются
   одним плоским списком. */
.catalog-v2 .cat-year-body .article-release {
    padding-left: clamp(8px, 2vw, 20px);
}

/* ── DGV. Полоса-вход «Дайджест» над каталогом (тихий, нативный вид) ── */
.cat-digest{--teal:#1F6F78;--teal-hover:#175861;--ink:#1A1D1E;--muted:#5C676A;--line:#D6DEDF;--white:#fff;margin:36px 0 24px;}
.cat-digest-head{display:flex;align-items:baseline;gap:12px;margin:0 0 12px;flex-wrap:wrap;}
.cat-digest-title{font-size:1.05rem;font-weight:800;letter-spacing:-.01em;color:var(--ink);}
.cat-digest-sub{font-size:.82rem;color:var(--muted);font-weight:600;}
.cat-digest-all{margin-left:auto;font-size:.85rem;font-weight:700;color:var(--teal);text-decoration:none;white-space:nowrap;}
.cat-digest-all:hover{color:var(--teal-hover);}
.cat-digest-row{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;}
.cat-digest-item{display:flex;gap:9px;align-items:flex-start;text-decoration:none;color:inherit;border:1px solid var(--line);border-radius:10px;padding:11px 12px;background:var(--white);min-width:0;transition:border-color .16s;}
.cat-digest-item:hover{border-color:var(--teal);}
.cat-digest-n{color:var(--teal);font-weight:800;flex:none;font-size:.9rem;line-height:1.4;}
.cat-digest-tx{display:flex;flex-direction:column;gap:3px;min-width:0;}
.cat-digest-t{font-size:.9rem;font-weight:700;line-height:1.3;color:var(--ink);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.cat-digest-d{font-size:.78rem;line-height:1.38;color:var(--muted);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.cat-digest-lock{font-size:.62rem;border-radius:12px;padding:1px 7px;font-weight:700;flex:none;align-self:flex-start;white-space:nowrap;}
.cat-digest-lock.is-reg{color:#8A6D1F;background:#FBF4E2;border:1px solid #EBDCB4;}
.cat-digest-lock.is-sub{color:#5C676A;background:#ECEFF0;border:1px solid #DCE1E2;}
@media (max-width:640px){
  .cat-digest-row{grid-template-columns:minmax(0,1fr);}
  .cat-digest-row .cat-digest-item:nth-child(3){display:none;}
  .cat-digest-all{margin-left:0;}
}
