/*!
 * HubFront — UI-компоненты (CSS). Фаза C. ЕДИНЫЙ дом стилей примитивов.
 * Copyright (c) 2026 Mehti Zeynalov / Hubstorie. Proprietary. All rights reserved.
 *
 * Сюда складываем по одному переиспользуемые UI-примитивы HubFront UI («свой
 * Bootstrap»): logo (есть), далее — button/card/sheet/toast/tabs… (по микрошагам).
 * Стили опираются на дизайн-токены (assets/css/hubfront.tokens.css), но КАЖДЫЙ
 * var() имеет фолбэк — примитив не разваливается на странице, где токены ещё не
 * подключены (часть автономных страниц держит свой :root). Правило 10: один дом
 * вместо копий по страницам.
 */

/* ── Logo (знак Hubstorie) ─────────────────────────────────────────────────
 * Канон: «hub»(--text)«storie»(--accent) СЛИТНО + акцентная точка. Разметку даёт
 * hubLogo() (helpers.php). gap действует МЕЖДУ словом и точкой (слово — один
 * флекс-элемент), внутри слова hub/storie слитны. --sm — компактный топбар ленты. */
.hub-logo {
  display: inline-flex;
  align-items: center;
  gap: 0.2em;            /* em → отступ до точки пропорционален шрифту (один вид при любом размере) */
  font-family: var(--font-serif, 'Source Serif 4', Georgia, serif);
  font-weight: 600;
  font-size: 22px;
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--text, #ede4d3);
  text-decoration: none;
  white-space: nowrap;
}
.hub-logo__word { display: inline; }
.hub-logo__accent { color: var(--accent, #d4a574); }
.hub-logo__dot {
  width: 0.24em;         /* em → точка масштабируется со шрифтом (лента/кабинет — одинаково) */
  height: 0.24em;
  flex: 0 0 auto;
  border-radius: var(--radius-round, 50%);
  background: var(--accent, #d4a574);
  align-self: center;    /* по центру строки (а не «плавающий градус» сверху) */
  margin-top: 0.04em;    /* оптическая поправка для serif */
}

/* ── Icon (единый источник SVG, hubIcon() в helpers.php) ───────────────────
 * Размер задаёт КОНТЕКСТНЫЙ CSS (напр. `.app-menu-item svg{width:..}`), как и
 * раньше — у svg нет width/height. Здесь только то, что не конфликтует с размером. */
.hub-icon { flex-shrink: 0; }

/* ── Icon button (кнопка-иконка топбара) — ЕДИНЫЙ вид (Фаза C) ──────────────
 * Канон = ридер-топбар ленты (`.icon-btn`): 30px кружок, bg-soft, рамка, 14px
 * иконка, серый → акцент в active. Кабинет переведён на него (бургер/колокол).
 * Лента остаётся на своём `.icon-btn` (его класс используют JS-селекторы жестов) —
 * визуально идентичен; переименование ленты — безопасный следующий шаг. */
.hub-iconbtn {
  width: 30px;
  height: 30px;
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-round, 50%);
  background: var(--bg-soft, #232327);
  border: 1px solid var(--border, rgba(237, 228, 211, 0.1));
  color: var(--text-dim, #b8b0a0);
  cursor: pointer;
  text-decoration: none;
  position: relative;
  -webkit-tap-highlight-color: transparent;
  transition: all 0.2s;
}
.hub-iconbtn:hover { color: var(--text, #ede4d3); }
.hub-iconbtn:active { transform: scale(0.9); }
.hub-iconbtn.active {
  background: var(--accent, #d4a574);
  color: #1a1a1c;
  border-color: var(--accent, #d4a574);
}
.hub-iconbtn svg { width: 14px; height: 14px; }

/* .hub-back — ЕДИНАЯ кнопка «назад» (модульная): прозрачная, без обводки, svg 22px,
 * ховер-акцент. Один вид в кабинете (topbar) и в ленте (грид автора). Раньше кабинет
 * держал это инлайн как .topback — перенесено сюда (правило 10). Работает на <a> и <button>. */
.hub-back {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--text, #ede4d3);
  padding: 5px;
  border-radius: 8px;
  flex-shrink: 0;
  background: none;
  border: none;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: color 0.15s, background 0.15s;
}
.hub-back:hover { color: var(--accent, #d4a574); background: var(--bg-elev, #232327); }
.hub-back svg { width: 22px; height: 22px; display: block; }

/* Вид-панель хост-сайдбара (гармошка показывает контент фичи в той же шторке).
 * Модульно — один источник для ленты (#appMenu) и кабинета (#cabMenu). Правило 10. */
.app-menu-panel-head { display: flex; align-items: center; gap: 6px; padding: 8px 12px 8px 6px; border-bottom: 1px solid var(--border, rgba(237,228,211,.08)); }
.app-menu-panel-title { font-family: var(--font-serif, 'Source Serif 4', serif); font-size: 16px; font-weight: 600; color: var(--text, #ede4d3); }
.app-menu-panel-body { padding: 6px 4px; }

/* ── Каркас сайдбар-панели (общий: подкасты/подписки/история/закладки) ──────
 * ЕДИНЫЙ источник каркаса. Грузится и на ленте, и в кабинете (components.css есть
 * везде) → кабинету своя копия (hubpods.css) больше не нужна. На ленте те же
 * значения уже есть в hubstorie.css — дубль безвреден; удаление из hubstorie.css —
 * отдельный шаг с браузер-проверкой (там селекторы скомбинированы с .app-menu). */
.overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:105;opacity:0;pointer-events:none;transition:opacity .3s}
.overlay.visible{opacity:1;pointer-events:auto}
.follow-sidebar{position:fixed;top:0;right:0;width:320px;max-width:88vw;height:100vh;height:100dvh;background:var(--bg-soft);border-left:1px solid var(--border-strong);z-index:110;transform:translateX(100%);transition:transform .35s cubic-bezier(.2,.8,.2,1);overflow-y:auto;box-shadow:-8px 0 30px rgba(0,0,0,.4)}
.follow-sidebar.visible{transform:translateX(0)}
.follow-sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:calc(16px + env(safe-area-inset-top,0px)) 16px 12px;border-bottom:1px solid var(--border)}
.follow-sidebar-title{font-family:var(--font-serif,'Source Serif 4',serif);font-size:18px;font-weight:600;color:var(--text);letter-spacing:-.01em}
.follow-sidebar-close{width:28px;height:28px;border-radius:50%;background:var(--bg-card);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;color:var(--text-dim);cursor:pointer}
.follow-sidebar-close svg{width:14px;height:14px}
.follow-sidebar-list{padding:10px}
.follow-empty{text-align:center;padding:40px 20px;color:var(--text-dim)}
.follow-empty-icon{font-size:28px;margin-bottom:10px;opacity:.5}

/* ── StatusDot (Фаза C) — индикатор статуса. SSR: hubDot() ─────────────────
 * Точка-статус (онлайн/офлайн/ок/варн/ошибка), опц. пульс. Кандидат заменить
 * самописные точки в /admin/monitor, бейджах, карточках. */
.hub-dot{display:inline-block;width:8px;height:8px;border-radius:var(--radius-round,50%);background:var(--text-faint,#6b6358);flex:0 0 auto;vertical-align:middle}
.hub-dot--ok{background:#2faa5a}
.hub-dot--warn{background:var(--gold,#f0c068)}
.hub-dot--error{background:var(--danger,#c9534e)}
.hub-dot--accent{background:var(--accent,#d4a574)}
.hub-dot--muted{background:var(--text-faint,#6b6358)}
.hub-dot--lg{width:10px;height:10px}
.hub-dot--pulse{animation:hub-dot-pulse 1.6s ease-in-out infinite}
@keyframes hub-dot-pulse{0%,100%{opacity:1}50%{opacity:.4}}

/* ── Button (Фаза C) — канон кнопки. SSR: hubBtn(); варианты/размеры ───────
 * Единый источник вида кнопки. Существующие .btn/.action-btn — мигрируем по мере
 * касания (как logo/icon). confirm() уже использует .hub-btn. */
.hub-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;border-radius:var(--radius-md,10px);padding:10px 18px;font-size:14px;font-weight:600;line-height:1;font-family:var(--font-sans,'Inter Tight',system-ui,sans-serif);cursor:pointer;border:1px solid transparent;text-decoration:none;white-space:nowrap;-webkit-tap-highlight-color:transparent;transition:opacity .15s,transform .1s,background .15s,border-color .15s}
.hub-btn:active{transform:scale(.97)}
.hub-btn svg{width:16px;height:16px;flex:0 0 auto}
.hub-btn--primary{background:var(--accent,#d4a574);color:#1a1a1c;border-color:var(--accent,#d4a574)}
.hub-btn--primary:hover{background:var(--accent-hover,#e0b485)}
.hub-btn--secondary{background:var(--bg-soft,#232327);color:var(--text,#ede4d3);border-color:var(--border,rgba(237,228,211,.1))}
.hub-btn--secondary:hover{border-color:var(--border-strong,rgba(237,228,211,.15))}
.hub-btn--danger{background:var(--danger,#c9534e);color:#fff;border-color:var(--danger,#c9534e)}
.hub-btn--ghost{background:transparent;color:var(--text-dim,#b8b0a0);border-color:var(--border,rgba(237,228,211,.1))}
.hub-btn--ghost:hover{color:var(--text,#ede4d3)}
.hub-btn--sm{padding:7px 12px;font-size:13px;border-radius:var(--radius-sm,8px)}
.hub-btn--lg{padding:13px 22px;font-size:15px}
.hub-btn--block{width:100%}
.hub-btn[disabled],.hub-btn--disabled{opacity:.55;pointer-events:none}

/* ── Toast (Фаза C) — короткие уведомления ──────────────────────────────── */
.hub-toast-wrap{position:fixed;left:0;right:0;bottom:calc(16px + env(safe-area-inset-bottom,0px));z-index:var(--z-toast,1200);display:flex;flex-direction:column;align-items:center;gap:8px;pointer-events:none;padding:0 16px}
.hub-toast{max-width:min(440px,92vw);background:var(--bg-elev,#2a2a2f);color:var(--text,#ede4d3);border:1px solid var(--border-strong,rgba(237,228,211,.15));border-radius:var(--radius-lg,12px);padding:11px 16px;font-size:14px;line-height:1.4;box-shadow:var(--shadow-md,0 8px 24px rgba(0,0,0,.4));pointer-events:auto;cursor:pointer;opacity:0;transform:translateY(10px);transition:opacity .2s,transform .2s}
.hub-toast.open{opacity:1;transform:translateY(0)}
.hub-toast--success{border-color:rgba(47,170,90,.5)}
.hub-toast--error{border-color:var(--danger,#c9534e)}

/* ── ConfirmSheet (Фаза C) — на примитиве Sheet (modal) ─────────────────── */
.hub-sheet--confirm .hub-sheet__body{padding:16px}
.hub-confirm__msg{color:var(--text-dim,#b8b0a0);font-size:14px;line-height:1.5;margin-bottom:18px}
.hub-confirm__btns{display:flex;gap:10px;justify-content:flex-end}
/* prompt — на том же примитиве: сообщение + поле ввода + кнопки .hub-btn (правило 10). */
.hub-sheet--prompt .hub-sheet__body{padding:16px}
.hub-prompt__msg{color:var(--text-dim,#b8b0a0);font-size:14px;line-height:1.5;margin-bottom:12px}
.hub-prompt__input{width:100%;box-sizing:border-box;background:var(--bg-soft,#15171b);
  border:1px solid var(--border,rgba(237,228,211,.18));border-radius:10px;color:var(--text,#ede4d3);
  padding:11px 13px;font:inherit;font-size:15px;margin-bottom:16px}
.hub-prompt__input:focus{outline:none;border-color:var(--accent,#d4a574)}
.hub-prompt__btns{display:flex;gap:10px;justify-content:flex-end}
/* Контент модалок редактора в openSheet: согласие (AI/TTS) + пре-промпт микрофона. */
.cm-consent-body{color:var(--text-dim,#b8b0a0);font-size:14px;line-height:1.6;margin:0 0 16px}
.cm-consent-check{display:flex;align-items:flex-start;gap:8px;font-size:13px;color:var(--text,#ede4d3);margin:0 0 14px;cursor:pointer}
.cm-consent-check input{width:auto;margin-top:3px;accent-color:var(--accent,#d4a574)}
.cm-consent-doc{font-size:11px;color:var(--text-faint,#8c857a);margin:0 0 16px}
.cm-consent-doc a{color:var(--accent,#d4a574)}
.cm-consent-btns{display:flex;gap:10px;justify-content:flex-end}
.cm-mic-body{color:var(--text-dim,#b8b0a0);font-size:14px;line-height:1.5;margin:0 0 18px;text-align:center}
.cm-mic-btns{display:flex;flex-direction:column;gap:8px}
.cm-mic-btns .hub-btn{width:100%}
/* кнопки confirm — на канон-примитиве .hub-btn (правило 10) */

/* ── Sheet / Modal / Drawer (примитив P1) — ФУНДАМЕНТ всех панелей ──────────
 * Варианты: bottom (снизу), side (боковой drawer), modal (центр). Открывает
 * HubFront.openSheet(). На токенах, фолбэк-safe. */
.hub-sheet-ov {
  position: fixed; inset: 0;
  background: rgba(0, 0, 0, .55);
  opacity: 0; pointer-events: none;
  transition: opacity var(--transition-base, 200ms ease);
  z-index: var(--z-overlay, 1000);
}
.hub-sheet-ov.open { opacity: 1; pointer-events: auto; }

.hub-sheet {
  position: fixed;
  background: var(--bg-soft, #232327);
  color: var(--text, #ede4d3);
  z-index: var(--z-modal, 1100);
  display: flex; flex-direction: column;
  overflow: hidden;
  box-shadow: var(--shadow-md, 0 8px 24px rgba(0,0,0,.4));
  transition: transform .35s cubic-bezier(.2, .8, .2, 1), opacity .25s ease;
}
.hub-sheet__head {
  display: flex; align-items: center; justify-content: space-between;
  padding: calc(16px + env(safe-area-inset-top, 0px)) 16px 12px;
  border-bottom: 1px solid var(--border, rgba(237,228,211,.08));
  flex: 0 0 auto;
}
.hub-sheet__title {
  margin: 0; font-family: var(--font-serif, 'Source Serif 4', Georgia, serif);
  font-size: 18px; font-weight: 600; color: var(--text, #ede4d3); letter-spacing: -.01em;
}
.hub-sheet__close {
  width: 28px; height: 28px; flex: 0 0 auto;
  border-radius: var(--radius-round, 50%);
  background: var(--bg-card, #1e1e22);
  border: 1px solid var(--border, rgba(237,228,211,.08));
  color: var(--text-dim, #b8b0a0);
  display: inline-flex; align-items: center; justify-content: center; cursor: pointer;
}
.hub-sheet__close svg { width: 14px; height: 14px; }
/* Плавающий close для шитов без тайтла (closable: true). */
.hub-sheet__close--float { position: absolute; top: 12px; right: 12px; z-index: 2;
  width: 32px; height: 32px; }
.hub-sheet__close--float svg { width: 16px; height: 16px; }
.hub-sheet__body { flex: 1 1 auto; overflow-y: auto; overflow-x: hidden;
  padding-bottom: env(safe-area-inset-bottom, 0px); }

/* bottom-sheet */
.hub-sheet--bottom {
  left: 0; right: 0; bottom: 0;
  max-height: 88dvh;
  border-radius: var(--radius-2xl, 16px) var(--radius-2xl, 16px) 0 0;
  transform: translateY(100%);
}
.hub-sheet--bottom.open { transform: translateY(0); }

/* side drawer */
.hub-sheet--side {
  top: 0; bottom: 0; width: min(380px, 92vw); height: 100dvh;
}
.hub-sheet--side.hub-sheet--right { right: 0; border-left: 1px solid var(--border-strong, rgba(237,228,211,.15)); transform: translateX(100%); }
.hub-sheet--side.hub-sheet--left  { left: 0;  border-right: 1px solid var(--border-strong, rgba(237,228,211,.15)); transform: translateX(-100%); }
.hub-sheet--side.open { transform: translateX(0); }

/* center modal */
.hub-sheet--modal {
  top: 50%; left: 50%;
  width: min(440px, 92vw); max-height: 88dvh;
  border-radius: var(--radius-2xl, 16px);
  border: 1px solid var(--border-strong, rgba(237,228,211,.15));
  transform: translate(-50%, -48%); opacity: 0;
}
.hub-sheet--modal.open { transform: translate(-50%, -50%); opacity: 1; }

/* Компактный вариант (лента: плотный топбар с 8 иконками) — меняем ТОЛЬКО масштаб
 * (font-size); gap и точка в em → пропорции те же, что у крупного. Знак идентичен,
 * отличается лишь размером под контекст. */
.hub-logo--sm { font-size: 17px; }
@media (max-width: 480px) { .hub-logo--sm { font-size: 15px; } }
@media (max-width: 360px) { .hub-logo--sm { font-size: 13px; } }

/* ─── Топбар-оболочка + гармошка-хост (модульные; правило 10) ──────────────
 * ЕДИНЫЙ источник вида шапки приложения (лого + назад + гамбургер) и выезжающей
 * шторки-гармошки. Раньше эти правила жили ИНЛАЙНОМ в header.php (кабинет/админка)
 * — это и был per-page дубль. Теперь любая страница, подключившая этот CSS +
 * hubfront.core.min.js, собирает шапку как в кабинете:
 *   <div class="topbar"><div class="topbar-left">.hub-back + hubLogo()</div>
 *     …hubIconBtn('menu')…</div>  +  <aside class="app-menu" data-hf="menu">.
 * Кабинет/админка перекрывают базовый .topbar своим .cab-page .topbar (грузится
 * позже) — вид там не меняется. Значения 1-в-1 с прежним header.php. */
/* min-height (НЕ фиксированный height): админ-топбар с переносящимся nav должен расти
   под него, иначе nav наезжает на контент (регресс 2026-06-18). Кабинет/лента имеют
   свои .cab-page/.topbar оверрайды. */
.topbar { display: flex; align-items: center; justify-content: space-between;
  padding: 0 16px; min-height: 56px; }
.topbar-left { display: flex; align-items: center; gap: 12px; min-width: 0; }

/* SHELL-PAGE host: когда shell монтирует страницу-партиал в #feed (класс .hub-shell-page), host обязан быть
   СКРОЛЛ-контейнером — иначе контент страницы выше экрана обрезается (лента сама по себе не скроллит, свайпает).
   Guard shellPageHostScrollable требует это правило при наличии класса. */
.hub-shell-page { overflow-y: auto; -webkit-overflow-scrolling: touch; height: 100%; }

/* CHROME-COMPOSER-2foundation-code: TopComposer работает по SLOT-REPLACE — legacy-узлы action-региона ДЕТАЧАТСЯ
   в JS (не скрываются), slot становится единственным контентом. Поэтому CSS-hide (`.hub-hdr-alt .topbar-actions`)
   БОЛЬШЕ НЕ НУЖЕН и удалён (overlay/hide модель убрана). `.hub-hdr-alt-bar` ниже — это сам slot-container. */
.hub-hdr-alt-bar { display: flex; align-items: center; gap: 12px; margin-left: auto; min-width: 0; }
.hub-hdr-title { font-weight: 600; font-size: 15px; color: var(--text,#ede4d3);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 48vw; }
/* COMPOSER-2a logo-slot: composer прячет бренд при `logo:false` (флаг реально управляет, не декларативно). */
.hub-logo.hub-logo-off { display: none; }

.app-menu-ov { position: fixed; inset: 0; background: rgba(0,0,0,.55); z-index: 114;
  opacity: 0; pointer-events: none; transition: opacity .25s; }
.app-menu-ov.open { opacity: 1; pointer-events: auto; }
.app-menu { position: fixed; top: 0; right: 0; width: min(360px,92vw); height: 100vh; height: 100dvh;
  background: #232327; border-left: 1px solid rgba(237,228,211,.15); z-index: 115;
  transform: translateX(100%); transition: transform .35s cubic-bezier(.2,.8,.2,1);
  overflow-y: auto; overflow-x: hidden; box-shadow: -8px 0 30px rgba(0,0,0,.4); }
.app-menu.open, .app-menu.visible { transform: translateX(0); }
.app-menu-header { display: flex; align-items: center; justify-content: space-between;
  padding: calc(16px + env(safe-area-inset-top,0px)) 16px 12px; border-bottom: 1px solid rgba(237,228,211,.08); }
.app-menu-title { font-family: var(--font-serif,'Source Serif 4',serif); font-size: 18px; font-weight: 600;
  color: #ede4d3; letter-spacing: -.01em; }
.app-menu-close { width: 28px; height: 28px; border-radius: 50%; background: #1e1e22;
  border: 1px solid rgba(237,228,211,.08); display: flex; align-items: center; justify-content: center;
  color: #b8b0a0; cursor: pointer; }
.app-menu-close svg { width: 14px; height: 14px; }
.app-menu-list { padding: 8px 10px calc(8px + env(safe-area-inset-bottom,0px)); }
.app-menu-item { display: flex; align-items: center; gap: 12px; padding: 12px 10px; border-radius: 10px;
  cursor: pointer; color: #ede4d3; font-size: 13px; text-decoration: none; background: none; border: none;
  width: 100%; text-align: left; transition: background .15s; }
.app-menu-item:hover { background: #1a1a1c; }
.app-menu-item svg { width: 17px; height: 17px; color: #b8b0a0; flex-shrink: 0; }
.app-menu-divider { height: 1px; background: rgba(237,228,211,.08); margin: 6px 10px; }
.app-menu-chevron { margin-left: auto; transition: transform .2s; }
.app-menu-accordion.open .app-menu-chevron { transform: rotate(180deg); }
.app-menu-accordion-body { padding: 2px 0 6px; overflow-x: hidden; }
.app-menu-accordion-body a { display: block; padding: 7px 0; font-size: 13px; color: #b8b0a0; text-decoration: none; }
.app-menu-accordion-body a:hover { color: #d4a574; }

/* Контент инфо-страницы в хост-шторке (модуль content): базовая типографика —
 * чтобы тело menu_pages (О проекте / Что нового / Контакты) читалось как документ.
 * Модульно (правило 10): тот же класс на любой поверхности с гармошкой. */
.hub-doc { color: var(--text-dim, #b8b0a0); font-size: 14px; line-height: 1.6; padding: 4px 14px 18px; }
.hub-doc h1, .hub-doc h2, .hub-doc h3 { color: var(--text, #ede4d3);
  font-family: var(--font-serif, 'Source Serif 4', serif); margin: 18px 0 8px; line-height: 1.25; }
.hub-doc h1 { font-size: 20px; } .hub-doc h2 { font-size: 17px; } .hub-doc h3 { font-size: 15px; }
.hub-doc p { margin: 0 0 12px; }
.hub-doc ul, .hub-doc ol { margin: 0 0 12px; padding-left: 20px; }
.hub-doc li { margin-bottom: 5px; }
.hub-doc a { color: var(--accent, #d4a574); }
.hub-doc img { max-width: 100%; height: auto; border-radius: 8px; }

/* Внутренний возврат в мини-SPA модуля (документ → список): «‹ К документам».
 * Системная кнопка панели (data-hf-panel-back) уводит в меню; эта — на шаг назад
 * ВНУТРИ модуля. Модульно (правило 10): любой модуль с под-видами зовёт .hub-subback. */
.hub-subback { display: inline-flex; align-items: center; gap: 4px; background: none; border: none;
  cursor: pointer; color: var(--accent, #d4a574); font: inherit; font-size: 13px; padding: 4px 4px 10px;
  -webkit-tap-highlight-color: transparent; }
.hub-subback:hover { text-decoration: underline; }

/* Менеджер согласия cookie в хост-шторке (модуль cookie). Категории + действия. */
.ck-wrap { padding: 4px 14px 18px; }
.ck-intro { color: var(--text-dim, #b8b0a0); font-size: 13.5px; line-height: 1.5; margin: 0 0 14px; }
.ck-intro a { color: var(--accent, #d4a574); text-decoration: underline; }
.ck-cat { display: flex; gap: 10px; align-items: flex-start; padding: 10px 0;
  border-bottom: 1px solid var(--border, rgba(237,228,211,.08)); cursor: pointer; }
.ck-cat input { width: auto; margin-top: 3px; flex: 0 0 auto; accent-color: var(--accent, #d4a574); }
.ck-cat-name { display: block; font-size: 13.5px; font-weight: 600; color: var(--text, #ede4d3); }
.ck-cat-desc { display: block; font-size: 12px; color: var(--text-faint, #8c857a); line-height: 1.4; }
.ck-actions { display: flex; flex-direction: column; gap: 8px; margin-top: 16px; }
.ck-actions .hub-btn { width: 100%; }

/* Контент «Пожаловаться» (openReportOverlay) в bottom-sheet openSheet — модульно. */
.rep-sub { color: var(--text-dim, #b8b0a0); font-size: 13px; line-height: 1.4; padding: 4px 2px 8px; }
.rep-row { display: flex; flex-direction: column; align-items: flex-start; gap: 3px; width: 100%;
  text-align: left; padding: 13px 6px; border: none; border-top: 1px solid var(--border, rgba(237,228,211,.07));
  background: none; color: var(--text, #ede4d3); font: inherit; font-size: 15px; cursor: pointer; }
.rep-row:first-of-type { border-top: none; }
.rep-name { font-weight: 600; }
.rep-desc { font-size: 12px; color: var(--text-dim, #b8b0a0); }
.rep-detail { padding: 8px 2px 2px; }
.rep-ta { width: 100%; min-height: 90px; resize: vertical; box-sizing: border-box;
  background: var(--bg-soft, #15171b); border: 1px solid var(--border, rgba(237,228,211,.14));
  border-radius: 10px; color: var(--text, #ede4d3); padding: 10px; font: inherit; font-size: 14px; }
.rep-detail .hub-btn { width: 100%; margin-top: 12px; }

/* «Моральное окно» уведомлений (модуль push_optin) в центр-модале openSheet. */
.push-optin-text { color: var(--text-dim, #b8b0a0); font-size: 14px; line-height: 1.55; margin: 0 0 16px; }
.push-optin-actions { display: flex; flex-direction: column; gap: 8px; }
.push-optin-actions .hub-btn { width: 100%; }
