/* Karuna Jyotish — лендинг. Кремовая тема, Literata / Inter / Bitter.
   Палитра из приложения: #ede5d0 (фон), #593b3b (текст), #86716c (приглушённый).
   Тёмная тема — по логике приложения (инверсия), автоматически по системной теме. */

:root{
  color-scheme:light;

  --bg:#f1ead9;          /* фон страницы (края градиента) — чуть светлее #ede5d0, контрастнее с текстом #593b3b */
  --bg2:#f4efe4;         /* фон страницы — светлая середина градиента */
  --card:#f9f6ef;        /* карточки/поля/карта — в тон стеклянным кнопкам */
  /* Карточка ПОВЕРХ поля: на --card её не видно — нужен тон светлее поля,
     как --card светлее --bg у карточек курса на главной. */
  --card-hi:#fffdf8;
  /* Ещё одна ступень светлее — для чипов (лагна/накшатра) ПОВЕРХ карточки
     карты, которая уже сама в тоне --card-hi: чипу нужен свой, более светлый тон. */
  --card-hi2:#ffffff;
  /* Активная подвкладка «Джанмы» + поле под ней (см. .cp-subwrap): раньше
     мешали с --card-hi, который сам почти не отличим от --card — эффекта не
     было видно совсем. Берём --card напрямую и явно темним. В тёмной теме
     ниже — обычный --card-hi, без темнения (там просили не трогать). */
  --sub-active:color-mix(in srgb, var(--text) 7%, var(--card) 93%);
  --fill:#e3d8bf;        /* заливка вспомогательных плашек */
  --text:#593b3b;        /* основной текст, заголовки */
  --text2:#86716c;       /* приглушённый текст */
  --text-desc:#6a4f4f;   /* текст описания (Обучение/Приложение/Консультация) — темнее text2, чуть светлее заголовка */
  --text3:rgba(134,113,108,.55);  /* линии карты, номера домов */
  --gold2:#593b3b;       /* глифы планет в карте */
  --av-bindu:#9a6b00;    /* бинду аштакаварги на карте транзита (как в приложении) */
  --accent:#593b3b;      /* акцент (монохромный, из палитры) */
  --accent-soft:rgba(89,59,59,.07);
  --focus-ring:rgba(89,59,59,.16);
  --err:#a3311f;
  --ok:#4a7c50;          /* галочка валидности (пранапада/кунда) */
  --line:rgba(89,59,59,.14);

  /* светлое стекло (кнопки/чипы) */
  --glass-top:rgba(255,255,255,.72);
  --glass-bot:rgba(255,255,255,.40);
  --glass-hi:rgba(255,255,255,.75);

  --shadow:0 1px 2px rgba(89,59,59,.05),0 8px 24px rgba(89,59,59,.07);
  --shadow-hi:0 6px 14px rgba(89,59,59,.10),0 20px 44px rgba(89,59,59,.15);

  --maxw:1240px;   /* ширина контентной области */
  --serif:'Literata',Georgia,'Times New Roman',serif;
  --sans:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;
}

/* ── тёмная тема: инверсия как в приложении. Ставится атрибутом data-theme="dark"
   на <html> (JS следит за системной темой, как в приложении). ── */
:root[data-theme="dark"]{
  color-scheme:dark;

  --bg:#2a2020;          /* тёмный тёплый фон (углублённый #593b3b) */
  --bg2:#332728;         /* светлая середина градиента */
  --card:#41393a;        /* карточки/поля/карта — в тон стеклянным кнопкам */
  --card-hi:#4e4546;     /* карточка поверх поля — светлее его, см. светлую тему */
  --card-hi2:#5b5152;    /* ещё ступень светлее — чип поверх карточки, см. светлую тему */
  --sub-active:var(--card-hi);  /* тёмная тема — без изменений, чистый --card-hi */
  --fill:rgba(255,255,255,.06);
  --text:#ede5d0;        /* светлый кремовый текст */
  --text2:#a99a92;       /* приглушённый (осветлённый #86716c) */
  --text-desc:#e1dcc9;   /* текст описания (Обучение/Приложение/Консультация) — темнее заголовка, светлее text2 */
  --text3:rgba(237,229,208,.28);
  --gold2:#e6cdb2;       /* глифы планет — светлый тёплый */
  --av-bindu:#e0b552;    /* бинду аштакаварги — светлее для тёмной темы */
  --accent:#d9b9a6;      /* тёплый светлый акцент */
  --accent-soft:rgba(217,185,166,.10);
  --focus-ring:rgba(217,185,166,.22);
  --err:#e6a08c;
  --ok:#8fbf8f;          /* галочка валидности — светлее для тёмной темы */
  --line:rgba(237,229,208,.14);

  --glass-top:rgba(255,255,255,.14);
  --glass-bot:rgba(255,255,255,.05);
  --glass-hi:rgba(255,255,255,.20);

  --shadow:0 1px 2px rgba(0,0,0,.25),0 8px 24px rgba(0,0,0,.32);
  --shadow-hi:0 6px 14px rgba(0,0,0,.35),0 20px 44px rgba(0,0,0,.45);
}

*{box-sizing:border-box}
[hidden]{display:none!important}   /* иначе display из классов перебивает атрибут hidden */
/* overscroll-behavior:none — гасит упругий bounce браузера (macOS-трекпад
   и т.п.) на страницах короче экрана: без него в крайних положениях скролла
   вся страница «тянется» за жестом и потом отскакивает — вместе с ней
   визуально дёргаются шапка/футер, даже будучи position:fixed (сам вьюпорт
   на секунду смещается браузерным bounce-рендером). none полностью
   выключает этот эффект, а не просто ослабляет. */
html{scroll-behavior:smooth;background:var(--bg);overscroll-behavior-y:none}
/* ── плавный переход между страницами ──
   Просили именно как было при скролле блоков: старая страница остаётся на
   месте и гаснет, новая наезжает на неё СВЕРХУ снизу вверх. Показать старую
   и новую страницу ОДНОВРЕМЕННО при настоящем переходе между документами
   умеет только браузер — @view-transition (cross-document), без него
   никак: обычный body-keyframe при загрузке новой страницы никогда не
   увидит старую, той уже нет в DOM.
   height:100% на снимках — иначе браузер по умолчанию ИНТЕРПОЛИРУЕТ размер
   снимка между высотой старого и нового документа (у нас страницы очень
   разной высоты — index.html короткий, study.html длинный), и кадр
   визуально «сжимался/растягивался», клипался — тот самый глюк, на который
   жаловались в первый раз. Дело было не в самом API, а в том, что рядом
   ЕЩЁ и body сам анимировался своим keyframe — то же самое проигрывалось
   ДВАЖДЫ (нативным переходом и телом одновременно), отсюда и «клип и
   подъезд». Теперь только один слой анимации: свои кейфреймы на
   ::view-transition-old/new(root), никакого отдельного body-keyframe рядом. */
@media (prefers-reduced-motion:no-preference){
  @view-transition{navigation:auto}
  ::view-transition-old(root),::view-transition-new(root){
    height:100%;animation-duration:.42s;
    animation-timing-function:cubic-bezier(.22,.61,.36,1);
    animation-fill-mode:both;
  }
  ::view-transition-old(root){animation-name:kja-vt-out}
  ::view-transition-new(root){animation-name:kja-vt-in}
  @keyframes kja-vt-out{from{opacity:1}to{opacity:0}}
  @keyframes kja-vt-in{
    from{opacity:0;transform:translateY(48px)}
    to{opacity:1;transform:translateY(0)}
  }
}
/* запасной вариант — ТОЛЬКО для браузеров без поддержки View Transitions
   (@supports исключает остальные — иначе тело анимировалось бы ещё раз
   поверх нативного перехода, см. коммент выше). */
@supports not (view-transition-name: none){
  @keyframes kja-page-in{
    from{opacity:0;transform:translateY(48px)}
    to{opacity:1;transform:translateY(0)}
  }
  @media (prefers-reduced-motion:no-preference){
    body{animation:kja-page-in .42s cubic-bezier(.22,.61,.36,1)}
  }
}
/* фон — вертикальный градиент на всю высоту страницы: тёмный край → светлая середина → тёмный край */
body{
  margin:0;min-height:100dvh;color:var(--text);
  background:linear-gradient(180deg,var(--bg) 0%,var(--bg2) 50%,var(--bg) 100%) no-repeat;
  font-family:var(--serif);font-size:17px;line-height:1.6;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
  /* шапка и футер — position:fixed (см. .site-head/.site-foot ниже), полностью
     вне документного потока и не участвуют в скролле вообще — поэтому и не
     подвержены bounce/дёрганью. padding-top/-bottom компенсируют их реальную
     высоту (--header-h/--footer-h, меряет js/page-transition.js через
     ResizeObserver — переносы nav/foot-grid на 2-3 строки в другом языке
     меняют высоту, поэтому не хардкод) так, чтобы контент не заезжал под них. */
  padding-top:var(--header-h, 64px);
  padding-bottom:var(--footer-h, 64px);
}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
em,.i{font-family:'Bitter';font-style:italic}

.wrap{max-width:var(--maxw);margin:0 auto;padding:0 28px}
.eyebrow{font-family:var(--sans);font-size:12px;
  color:var(--accent);font-weight:700;margin:0 0 12px}
h1,h2,h3{font-family:var(--serif);line-height:1.15;margin:0;color:var(--text)}
h1{font-size:clamp(30px,4.4vw,50px);letter-spacing:-.01em;font-weight:700}  /* главный заголовок жирный */
h2{font-size:clamp(24px,3vw,34px);font-weight:600}
h3{font-size:20px;font-weight:600}
.lead{font-size:19px;color:var(--text);line-height:1.5}
.muted{color:var(--text2)}
.rule{height:1px;background:var(--line);border:0;margin:0}
section{padding:76px 0}
/* обучение/консультация — тот же уменьшенный отступ от шапки, что и на
   главной у .hero (было тоже 76px через общее правило section выше) */
.study,.consult{padding-top:40px}

/* ── «жирный при наведении без сдвига»: невидимая жирная копия резервирует ширину ── */
.hb{display:inline-flex;flex-direction:column;align-items:center;transform-origin:center;
  transition:transform .18s ease,color .18s ease,box-shadow .18s ease}
.hb::after{content:attr(data-label);font-weight:700;height:0;overflow:hidden;visibility:hidden;
  pointer-events:none}

/* ── светлая стеклянная кнопка (как в приложении), без обводок ──
   Покой — компактный; при наведении масштаб доводит до прежнего размера. */
.btn{
  font-family:var(--sans);font-size:13px;font-weight:500;cursor:pointer;border:0;border-radius:999px;
  padding:10px 21px;color:var(--text);
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  -webkit-backdrop-filter:blur(10px) saturate(1.5);backdrop-filter:blur(10px) saturate(1.5);
  box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12);
}
.btn:hover{transform:scale(1.2);font-weight:700;box-shadow:inset 0 1px 0 var(--glass-hi),0 8px 20px rgba(60,40,30,.20)}
.btn:active{transform:scale(1.16)}
.btn[disabled]{opacity:.5;cursor:default;pointer-events:none}
.btn-cta{color:var(--accent)}   /* смысловой акцент, но всё то же стекло */
/* крупная кнопка («Подать заявку»): в покое — размер обычной наведённой (×1.2),
   наведение работает как у всех и увеличивает уже от него */
.btn-lg{font-size:15.6px;padding:12px 25px}

/* ── шапка: ПОЛНОСТЬЮ непрозрачная и ЖЁСТКО неподвижная ──
   Раньше была стеклянная (полупрозрачный градиент + блюр, таял книзу за
   22px) — под ней просвечивал прокрученный текст, особенно заметно
   на секции «Приложение», где сразу под шапкой ещё и прилипающий
   заголовок. Сплошной var(--bg) — тот же цвет, что у страницы, поэтому
   не выглядит отдельной плашкой, просто гарантированно ничего не видно
   сквозь неё, ни на одной странице.
   position:fixed, не sticky — просили жёстко неподвижную шапку. sticky
   технически тоже «стоит у верха», но остаётся частью документного потока
   и его скролл-геометрии — при упругом bounce браузера у границы скролла
   (см. overscroll-behavior у html) sticky-элемент может визуально дёрнуться
   вместе с этим bounce. fixed привязан только к вьюпорту и не зависит от
   скролла документа вообще — не шевелится ни при каких обстоятельствах.
   Компенсация места под неё — padding-top на body (см. --header-h там же,
   меряет js/page-transition.js). */
.site-head{position:fixed;top:0;left:0;right:0;z-index:50;border:0;background:var(--bg)}
/* на всю ширину везде — .wrap здесь без ограничения max-width (общий .wrap
   центрирует контент страницы 1240px-колонкой; шапке та же логика не нужна:
   бренд у левого края, нав/вход у правого, как на странице расчётов). */
/* min-height, не height: у фиксированной height контент, которому не хватило
   64px (нав перенёсся на 2 строки — длинный текст пункта меню в другом
   языке/шрифте, другие метрики шрифта в другом браузере), не растягивает
   блок, а вылезает за его нижний край — и, будучи непрозрачным и с высоким
   z-index шапки, перекрывает верх контента под собой (карточки карт в hero
   в т.ч.). min-height вместо этого просто раздвигает шапку по факту —
   разметка ниже сама сдвигается вниз, наложения нет ни при каком языке/
   браузере/ширине экрана. */
.site-head .wrap{position:relative;z-index:1;max-width:none;padding:0 36px;
  display:flex;align-items:center;justify-content:space-between;min-height:64px}
.brand{display:inline-flex;align-items:center;gap:9px;
  font-family:var(--serif);font-size:19px;font-weight:600;letter-spacing:.01em;color:var(--text)}
a.brand{cursor:pointer;transition:transform .18s ease,color .18s ease}
a.brand:hover{transform:scale(1.06);font-weight:700;color:var(--accent)}
/* Пока открыт самый первый экран лендинга (id="calc") — логотип увеличен,
   тем же приёмом transform:scale, что и hover выше (см. .kja-hero-active
   в nav-active.js — переключается тем же вызовом, что подсвечивает пункт
   меню). transform не меняет размер бокса, поэтому высота шапки (64px) не
   плывёт. Тот же коэффициент, что у .btn:hover — «как кнопка», как просили.
   Обычный hover (scale 1.06) на этом экране не должен срабатывать вовсе —
   правило ниже держит то же значение 1.2 и при наведении, поэтому визуально
   ничего не меняется; на остальных экранах (класса нет) hover работает как
   обычно. */
body.kja-hero-active .brand{transform:scale(1.2)}
body.kja-hero-active a.brand:hover{transform:scale(1.2);font-weight:600;color:var(--text)}
/* монограмма перед названием — иконка приложения (сетка с диагоналями по
   угловым клеткам, «KJ» в центральной), без фона. Пропорции сняты с
   исходника Icon 512 new.png (мастер без обрезки под safe-zone адаптивной
   Android-иконки — там буквы мельче и сетка теснее, это не то). */
.brand-ic{flex:none;width:26px;height:26px}
.brand-ic-grid{fill:none;stroke:currentColor;stroke-width:1;opacity:.7;
  stroke-linecap:round;stroke-linejoin:round}
.brand-ic text{font-family:var(--sans);font-size:7.3px;font-weight:800;fill:currentColor;stroke:none}
.nav{display:flex;gap:30px;font-family:var(--sans);font-size:14px}
.nav a{display:inline-flex;align-items:center;gap:7px;color:var(--text2);font-weight:500;
  transition:transform .18s ease,color .18s ease}
.nav a:hover{transform:scale(1.22);font-weight:700;color:var(--accent)}  /* +≈3px, жирный, без сдвига */
/* активный пункт (открытая страница/секция) — тот же вид, что при наведении,
   но постоянно; ставит/снимает js/nav-active.js. Остальные пункты этим не
   затронуты — у них обычное поведение только по :hover. */
.nav a.is-active{transform:scale(1.22);font-weight:700;color:var(--accent)}
@media (prefers-reduced-motion:reduce){ .nav a{transition:none} }
/* гамбургер-меню (мобильная версия) — кнопка-триггер; сама видимость и
   разметка выпадающего списка — у .mobile-menu/.mobile-menu-drop ниже,
   рядом с .nav-contacts (тот же визуальный язык, единый компонент меню). */
.nav-toggle{display:inline-flex;align-items:center;justify-content:center;
  border:0;background:none;padding:0;margin:0;cursor:pointer;
  -webkit-appearance:none;appearance:none;color:var(--text2);transition:color .18s ease}
.nav-toggle:hover{color:var(--accent)}
.nav-toggle svg{width:22px;height:22px;fill:none;stroke:currentColor;
  stroke-width:1.8;stroke-linecap:round}
@media (prefers-reduced-motion:reduce){ .nav-toggle{transition:none} }
/* значок перед каждым пунктом меню — 16px, растёт вместе с текстом (transform
   уже на всём .nav a / .auth-slot > a). «Расчёты» — не статичный: те же 3 SVG,
   что в Настройках → Стиль карты (см. kjaSetNavCalcIcon в auth.js), меняется
   мгновенно при смене стиля там. */
.nav-ic{flex:none;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.6;
  stroke-linejoin:round;stroke-linecap:round}
.nav-ic-fill{fill:currentColor;stroke:none}

/* Нав и слот входа/аккаунта — вместе, вторым флекс-элементом рядом с брендом
   (иначе justify-content:space-between на .wrap растащит их по разным краям).
   auth-slot — вне .nav, поэтому остаётся видимым и в мобильном разборе,
   где .nav скрывается целиком. */
.head-right{display:flex;align-items:center;gap:30px}
/* слот кнопки «Оформить подписку» — третий флекс-элемент .wrap (между брендом
   и .head-right), justify-content:space-between уже центрирует его между ними */
.cp-sub-slot{position:relative}
/* «Войти» и имя вошедшего — обычная надпись меню, как остальные пункты нав.
   Капсулой (.btn, см. ниже renderAccountMenu в auth.js) она становится только
   на самой странице кабинета — как обозначение «вы здесь». */
/* display:flex, не block — иначе вокруг вложенной инлайновой кнопки браузер
   резервирует «строчную» высоту по ШРИФТУ САМОГО этого div (унаследован от
   body — 17px), а не по кнопке (14px): выходит на ~5px выше нужного, и .btn
   внутри центрируется уже в этой раздутой рамке, а не по кнопке впритык.
   .nav избегает той же ловушки тем же способом — он тоже flex, не block. */
.auth-slot{position:relative;display:flex;align-items:center}
/* на мобильной версии «Войти»/имя аккаунта уже есть внутри гамбургера
   (см. .mobile-menu в auth.js → initMobileMenu) — сам auth-slot в шапке
   лишний, дублировал бы то же самое рядом с иконкой меню */
@media (max-width:860px){ .auth-slot{display:none} }
/* «> a», не «a» — иначе селектор задевает и ссылку «Личный кабинет» ВНУТРИ
   выпадающего меню (оно физически вложено в .auth-slot): та начинала расти
   и жирнеть при наведении вместе с пунктом шапки, хотя это разные вещи. */
.auth-slot > a,.acct-trigger{display:inline-flex;align-items:center;gap:6px;
  font-family:var(--sans);font-size:14px;color:var(--text2);font-weight:500;
  cursor:pointer;border:0;background:none;padding:0;margin:0;line-height:1.6;
  -webkit-appearance:none;appearance:none;
  transition:transform .18s ease,color .18s ease}
/* триггер ЛК на самой странице кабинета — капсулой (.btn), значок+текст в
   ряд тем же приёмом, что «Импорт»/«Мои карты» (см. .cp-icon-btn выше):
   «жирный без сдвига» — на span.hb ВНУТРИ, не на кнопке целиком. Свой
   transition обязателен: у .btn его нет, а .hb (который его нёс) теперь
   только на внутреннем span с текстом, не на самой кнопке. */
.acct-trigger-ico{display:inline-flex;align-items:center;gap:7px;
  transition:transform .18s ease,box-shadow .18s ease}
.auth-slot > a:hover,.acct-trigger:hover{transform:scale(1.22);font-weight:700;color:var(--accent)}
@media (prefers-reduced-motion:reduce){
  .auth-slot > a,.acct-trigger,.acct-trigger-ico{transition:none}
}

/* ── переключатель языка: глиф 文 + код (УКР/РУС/ENG), анимированный дропдаун.
   Фон меню — тот же var(--card), что у .acct-drop/.combo-menu — единый «поповерный»
   тон сайта. Появление — прозрачность + лёгкий сдвиг вверх (как .acct-drop). ── */
/* в начале правой группы; чуть больший отступ от навигации, чем базовые 30px.
   ::after — вертикальная разделительная линия сразу после кнопки языка,
   перед навигацией (просили отделить переключатель языка от остального
   меню, ровно посередине зазора до неё). .lang-menu (выпадающий список)
   сам position:absolute, в обычном flex-потоке .lang-switch не участвует —
   псевдоэлемент встаёт сразу после видимой кнопки, а не после невидимого
   в закрытом виде меню.
   margin-left — сдвигает сам переключатель чуть правее от бренда.
   margin-right отрицательный — компенсирует общий gap:30px у .head-right
   (тот распределяет то же расстояние И до .nav): без него зазор ДО
   разделителя (15px, свой margin-left у ::after) и ПОСЛЕ него (тогда были
   бы все 30px gap) не совпадали бы — с margin-right:-15px после разделителя
   тоже остаётся ровно 15px (30 gap − 15 компенсация), разделитель встаёт
   строго посередине между кнопкой языка и «Обучение». */
.lang-switch{position:relative;display:flex;align-items:center;
  margin-left:10px;margin-right:-15px}
/* ярче обычного var(--line) (там opacity .14) — этот разделитель в шапке
   должен читаться отчётливее тонких служебных линий вроде .rule. */
.lang-switch::after{content:'';display:block;width:1px;height:18px;
  margin-left:15px;background:color-mix(in srgb, var(--text) 32%, transparent)}
.lang-trigger{display:inline-flex;align-items:center;gap:6px;cursor:pointer;
  border:0;background:none;padding:0;margin:0;font-family:var(--sans);color:var(--text2);
  -webkit-appearance:none;appearance:none;transition:transform .18s ease,color .18s ease}
.lang-trigger:hover{transform:scale(1.14);color:var(--accent)}
.lang-glyph{font-size:17px;line-height:1;font-weight:400}
.lang-code{font-size:13px;font-weight:600;letter-spacing:.02em}
.lang-menu{position:absolute;top:100%;right:0;margin-top:12px;min-width:170px;
  background:var(--card);border-radius:12px;box-shadow:var(--shadow-hi);overflow:hidden;padding:6px;z-index:60;
  opacity:0;transform:translateY(-6px);transition:opacity .16s ease,transform .16s ease;pointer-events:none}
.lang-menu.open{opacity:1;transform:translateY(0);pointer-events:auto}
.lang-opt{display:flex;align-items:center;gap:10px;width:100%;text-align:left;cursor:pointer;
  border:0;background:none;border-radius:8px;padding:9px 12px;font-family:var(--sans);color:var(--text);
  -webkit-appearance:none;appearance:none;transition:background .14s ease}
.lang-opt:hover{background:var(--accent-soft)}
.lang-opt.active{background:var(--accent-soft);color:var(--accent)}
.lang-opt-code{font-size:12px;font-weight:600;letter-spacing:.02em;color:var(--text2);min-width:30px}
.lang-opt.active .lang-opt-code{color:var(--accent)}
.lang-opt-name{font-size:14px;font-weight:500}

/* ── меню аккаунта в шапке: «Личный кабинет» / «Выйти», и «Оформить» в
   кабинете — общий компонент .acct-drop. Фон — тот же var(--card), что у
   .combo-menu/.sug (единственный «поповерный» фон, который есть на сайте, —
   выдумывать новый оттенок не стали). Появление — тем же приёмом, что
   модалка (.hidden убирается/добавляется JS вокруг перехода прозрачности
   и лёгкого сдвига, см. renderAccountMenu). */
.acct-menu{position:relative;display:flex;align-items:center}
.acct-drop{position:absolute;top:100%;right:0;margin-top:12px;min-width:220px;
  background:var(--card);
  border-radius:12px;box-shadow:var(--shadow-hi);overflow:hidden;padding:6px;
  z-index:30;opacity:0;transform:translateY(-6px) scale(.98);pointer-events:none;
  transition:opacity .16s ease,transform .16s ease}
.acct-drop.open{opacity:1;transform:none;pointer-events:auto}
.acct-drop a,.acct-drop button{display:block;width:100%;text-align:left;cursor:pointer;
  border:0;border-radius:9px;background:none;padding:11px 16px;color:var(--text);
  font-family:var(--sans);font-size:14.5px}
.acct-drop a:hover,.acct-drop button:hover{background:var(--accent-soft)}
/* меню аккаунта в шапке — разрастание из точки (правый верхний угол, у самой
   кнопки), а не общий лёгкий сдвиг+прозрачность остальных .acct-drop.
   ВАЖНО: масштаб — на ВНУТРЕННЕЙ обёртке (.acct-drop-pop-inner), не на самом
   .acct-drop. Раньше scale(.05) стоял прямо на .acct-drop — том же элементе,
   что слушает mouseenter для отмены автозакрытия (см. renderAccountMenu).
   Пока анимация роста не доиграла, РЕАЛЬНАЯ область наведения элемента
   (она следует за transform) — крошечная точка у угла, а не то место, куда
   пришла мышь. Таймер закрытия (200мс после ухода с кнопки) успевал
   истечь раньше, чем меню дорастало до курсора и «замечало» наведение —
   попап открывался и тут же гас. У внешнего .acct-drop теперь transform
   не трогаем вовсе — его хитбокс сразу на полный размер, растёт только
   визуальная обёртка внутри. Разные кривые на открытие/закрытие: у
   cubic-bezier(.16,1,.3,1) — резкий старт и долгое замедление, на ЗАКРЫТИЕ
   (transition берётся из состояния, В КОТОРОЕ уходим, т.е. из этого,
   «не открытого» правила) она же сжала бы почти всё визуальное движение в
   первые доли секунды — глаз читал бы это как мгновенное исчезновение.
   Поэтому здесь — свой, симметричный ease. */
.acct-drop.acct-drop-pop{background:none;box-shadow:none;padding:0;overflow:visible;
  transform:none;transition:opacity .2s ease}
.acct-drop.acct-drop-pop.open{transform:none;transition:opacity .22s ease}
.acct-drop-pop-inner{background:var(--card);border-radius:12px;box-shadow:var(--shadow-hi);
  overflow:hidden;padding:6px;transform-origin:top right;transform:scale(.05);
  transition:transform .2s ease}
.acct-drop.acct-drop-pop.open .acct-drop-pop-inner{transform:scale(1);
  transition:transform .22s cubic-bezier(.16,1,.3,1)}
@media (prefers-reduced-motion:reduce){
  .acct-drop{transition:none}
  /* этому меню — не «резко», а тихое затухание без роста/масштаба (сам
     эффект разрастания — та движуха, которую reduce-motion просит убрать). */
  .acct-drop.acct-drop-pop,.acct-drop.acct-drop-pop.open{transition:opacity .18s ease}
  .acct-drop-pop-inner,.acct-drop.acct-drop-pop.open .acct-drop-pop-inner{
    transform:none;transition:none}
}

/* ── «Контакты» в шапке: всплывающее меню по наведению ──
   Вне <nav> (не .nav a) — иначе вложенные ссылки .contacts-item сами
   попадали бы под общий стиль пунктов меню (рост×1.22 при наведении) и
   значок/текст менюшки уезжали бы как целая ссылка нав-бара. Триггер
   стилизован вручную под тот же вид, что .nav a (см. initContactsMenu
   в ui.js — открытие/закрытие тем же приёмом, что .lang-menu/.acct-drop). */
.nav-contacts{position:relative;display:flex;align-items:center}
.nav-contacts-trigger{display:inline-flex;align-items:center;gap:7px;
  border:0;background:none;padding:0;margin:0;cursor:pointer;-webkit-appearance:none;appearance:none;
  font-family:var(--sans);font-size:14px;color:var(--text2);font-weight:500;
  transition:transform .18s ease,color .18s ease}
.nav-contacts-trigger:hover{transform:scale(1.22);font-weight:700;color:var(--accent)}
@media (prefers-reduced-motion:reduce){ .nav-contacts-trigger{transition:none} }
.nav-contacts-drop{position:absolute;top:100%;right:0;margin-top:12px;min-width:240px;
  background:var(--card);border-radius:12px;box-shadow:var(--shadow-hi);overflow:hidden;padding:6px;
  z-index:60;opacity:0;transform:translateY(-6px);pointer-events:none;
  transition:opacity .16s ease,transform .16s ease}
.nav-contacts-drop.open{opacity:1;transform:translateY(0);pointer-events:auto}
.contacts-item{display:flex;align-items:center;gap:10px;width:100%;text-align:left;cursor:pointer;
  border-radius:9px;padding:9px 12px;font-family:var(--sans);font-size:14.5px;color:var(--text)}
.contacts-item:hover{background:var(--accent-soft)}
/* значки — не цветные бейджи, а линией, тем же приёмом, что .nav-ic в
   шапке (fill:none, обводка текущим цветом): подстраиваются под тему сами,
   без отдельных фирменных цветов */
.contacts-ico{flex:none;display:flex;color:var(--text2)}
.contacts-ico svg{width:18px;height:18px;fill:none;stroke:currentColor;
  stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
/* Telegram/YouTube — фирменные силуэты (как в приложении), не линией:
   свои path заливкой, обводка тут не подходит */
.contacts-ico-fill svg{fill:currentColor;stroke:none}
/* оферта/политика — без значка, мельче и приглушённее (см. «хотя бы первые
   три со значком» — эти два намеренно попроще, как обычные ссылки меню) */
.contacts-item-plain{color:var(--text2);font-size:13px;padding-left:12px}
.contacts-sep{height:1px;margin:6px 10px;background:var(--line)}
@media (prefers-reduced-motion:reduce){ .nav-contacts-drop{transition:none} }
@media (max-width:860px){ .nav-contacts{display:none} }

/* ── гамбургер-меню (мобильная версия) ──
   На ≤860px .nav и .nav-contacts скрыты целиком (см. правила выше) —
   единственный вход в разделы сайта с телефона. Пункты не дублируются в
   разметке: initMobileMenu() в auth.js клонирует их из .nav / .nav-contacts-drop /
   #kjaAuthSlot при каждом открытии — те же ссылки, что на десктопе, всегда
   актуальные (язык, статус входа), без отдельного списка на поддержке. */
.mobile-menu{position:relative;display:none;align-items:center}
.mobile-menu-drop{position:absolute;top:100%;right:0;margin-top:12px;min-width:240px;
  max-height:calc(100dvh - 90px);overflow-y:auto;
  background:var(--card);border-radius:12px;box-shadow:var(--shadow-hi);padding:6px;
  z-index:60;opacity:0;transform:translateY(-6px);pointer-events:none;
  transition:opacity .16s ease,transform .16s ease}
.mobile-menu-drop.open{opacity:1;transform:translateY(0);pointer-events:auto}
.mobile-menu-drop a,.mobile-menu-drop button{display:flex;align-items:center;gap:10px;
  width:100%;text-align:left;cursor:pointer;border:0;background:none;border-radius:9px;
  padding:11px 14px;color:var(--text);font-family:var(--sans);font-size:14.5px;font-weight:500;
  -webkit-appearance:none;appearance:none}
.mobile-menu-drop a:hover,.mobile-menu-drop button:hover{background:var(--accent-soft)}
.mobile-menu-drop svg{width:18px;height:18px;flex:none;fill:none;stroke:currentColor;
  stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
/* внутри вертикального списка не нужен ни ховер-рост .hb (мыши всё равно
   нет — сенсор), ни его невидимый жирный дублёр под ширину: тут строка и
   так на всю ширину меню */
.mobile-menu-drop .hb{display:inline;transform:none!important}
.mobile-menu-drop .hb::after{display:none}
@media (prefers-reduced-motion:reduce){ .mobile-menu-drop{transition:none} }
@media (max-width:860px){ .mobile-menu{display:flex} }

/* ── попап «Оформить подписку» в шапке расчётов (Фаза 5): отдельный компонент,
   не через .acct-drop — там правило «.acct-drop a,.acct-drop button» задаёт
   пунктам меню блочный вид с фиксированным паддингом, а здесь внутри свои
   .btn/.cp-opt с собственной раскладкой (flex, галочки), которую это правило
   сломало бы. Сама модалка/фон/анимация появления — общие .modal/.modal-panel
   (там же и размытие фона), .sub-drop здесь — только точечные переопределения
   (шире и компактнее обычной модалки). ── */
/* .modal-panel.sub-drop, не голый .sub-drop — .modal-panel сама задаёт
   width/padding с той же специфичностью (один класс), а объявлена НИЖЕ по
   файлу и перебила бы это правило по порядку; два класса гарантированно
   выше независимо от места в файле. */
/* 480px ×1.25 — шире не только по просьбе, но и практично: контент (список
   функций, оферта, чекбокс в две строки) на узкой колонке иногда переваливал
   за max-height модалки и прятал кнопку «Оформить» внизу без скролла */
/* ширина +15% (600→690). Высота — весь попап (заголовок, тарифы, оферта,
   согласие, кнопка) должен помещаться на экране целиком БЕЗ скролла самого
   попапа — calc(100dvh - 48px), т.к. у .modal свои 24px+24px padding сверху/
   снизу. display:flex column + overflow:hidden на самой панели: если при
   этих отступах и шрифте всё не влезает, ужимается только список функций
   (см. .sub-feat-list ниже, flex:1 1 auto + overflow-y:auto) — у него
   появляется свой скролл и тонкий бегунок, у остальной панели — никогда. */
.modal-panel.sub-drop{width:min(759px,100%);max-height:calc(100dvh - 48px);padding:26px 28px;
  display:flex;flex-direction:column;overflow:hidden}
/* всё, кроме списка функций, — свой натуральный размер, не ужимается */
.modal-panel.sub-drop > *{flex:none}
/* #cpHeadSubPick (chart.html — вошёл, подписки нет) оборачивает всю «мясную»
   часть попапа (заголовок, тарифы, список функций, оферту, согласие, кнопку) —
   на account.html этой обёртки нет, там те же элементы сидят прямо в
   .modal-panel.sub-drop. Flex-свойства работают только у ПРЯМЫХ детей
   flex-контейнера, поэтому без этого правила flex:1 на .sub-feat-list ниже
   не имел никакого эффекта: .sub-feat-list сидел внутри обычного блочного
   div, а сам #cpHeadSubPick, будучи прямым ребёнком, ловил flex:none выше и
   держал полный «естественный» рост — при нехватке высоты (маленький экран)
   panel обрезала его снизу через overflow:hidden, и кнопка «Оформити»
   пропадала. Специфичность ID (#cpHeadSubPick) выше правила `.modal-panel.
   sub-drop > *` (два класса), поэтому здесь можно смело отменять flex:none. */
#cpHeadSubPick{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:hidden}
#cpHeadSubPick > *{flex:none}
/* .modal-panel.sub-drop h3, не голый .sub-drop h3 — «.modal-panel h3» ниже
   по файлу той же специфичности (класс+тег) и перебивал margin/font-size
   обратно (та же ловушка, что уже была с шириной .sub-drop, см. выше) */
.modal-panel.sub-drop h3{margin:0 0 40px;font-size:19px}
.sub-drop p{margin:0;font-family:var(--sans);font-size:14px;color:var(--text2);line-height:1.5}
/* строки цен теснее обычных .cp-opts (там gap рассчитан на карту расчётов,
   тут просто список из двух коротких строк — воздух между ними лишний) */
.sub-drop .cp-opts{padding-left:0;padding-right:0;gap:0}
/* .cp-opts .cp-opt (по классу), не #cpHeadSubOpts .cp-opt (по ID) — тот же
   попап теперь стоит на двух страницах (chart.html #cpHeadSubOpts, account.html
   #acctSubDropOpts) с разными ID контейнера; класс общий для обоих. Шрифт/цвет
   подогнаны под список функций ниже — тот же, что в попапе программы модуля
   курса (#kjaModalTopics li на study.html): та строка font-family вообще не
   задаёт — наследует от body{font-family:var(--serif)} (Literata), а не
   var(--sans) (Inter), как я по ошибке ставила дважды. var(--serif) — верно. */
.sub-drop .cp-opts .cp-opt{padding-top:4px;padding-bottom:4px;font-size:16px;
  color:color-mix(in srgb, var(--text) 60%, var(--text2));font-family:var(--serif);font-weight:400}
/* align-items:flex-start — текст согласия длиннее обычных .cp-opt и переносится
   в две строки, галочка должна стоять по верхнему краю, а не «плавать» по центру.
   max-width у надписи — «поуже», не на всю ширину попапа, как обычная строка.
   Шрифт — тот же, что у списка функций (см. .sub-feat-list ниже). */
.sub-drop .cp-opt-agree{margin-top:14px;align-items:flex-start}
.sub-drop .cp-opt-agree .cp-opt-nm{line-height:1.4;max-width:82%;font-size:16px;
  color:color-mix(in srgb, var(--text) 60%, var(--text2));font-family:var(--serif);font-weight:400}
/* разделители над списком функций и под подписью «список пополняется» —
   не во всю ширину попапа (не .rule), а с отступом от краёв с обеих сторон */
.sub-feat-rule{height:1px;border:0;background:var(--line);margin:18px 14px}
/* тот же шрифт, что в попапе программы модуля курса (study.html
   #kjaModalTopics li, наследует body{font-family:var(--serif)} — Literata).
   flex:1 1 auto + min-height:0 — единственный элемент попапа, который
   сжимается и получает свой скролл, если всё вместе не влезает в
   calc(100dvh - 48px) (см. .modal-panel.sub-drop). Селектор — оба варианта
   родителя: на account.html .sub-feat-list сидит прямо в .modal-panel.sub-drop
   (нужно 3 класса, чтобы перебить `.modal-panel.sub-drop > *{flex:none}`,
   у которого их 2), на chart.html — внутри #cpHeadSubPick (нужен явный ID,
   иначе `#cpHeadSubPick > *{flex:none}` выше выигрывает по специфичности
   ID против классов, независимо от их числа). Без этого дубля flex:1
   молча не применялся ни на одной из страниц. */
.modal-panel.sub-drop .sub-feat-list,
#cpHeadSubPick > .sub-feat-list{margin:16px 0;padding:0 8px 0 20px;font-family:var(--serif);
  font-size:16px;line-height:1.55;color:color-mix(in srgb, var(--text) 60%, var(--text2));
  flex:1 1 auto;min-height:0;overflow-y:auto}
.sub-feat-list li{margin:3px 0}
/* тонкий бегунок — тот же приём, что у ленты лунного календаря
   (.lunar-cal-scroll): виден, только пока есть что скроллить (overflow:auto
   сам решает, показывать полосу или нет — «нет скролла — нет и бегунка») */
.sub-feat-list::-webkit-scrollbar{width:6px}
.sub-feat-list::-webkit-scrollbar-track{background:transparent}
.sub-feat-list::-webkit-scrollbar-thumb{background:var(--text3);border-radius:3px}
.sub-feat-list::-webkit-scrollbar-thumb:hover{background:var(--text2)}
:root[data-theme="dark"] .sub-feat-list::-webkit-scrollbar-thumb{background:var(--text2)}
/* .sub-drop .sub-feat-note / .sub-drop .sub-legal, не голые .sub-feat-note/
   .sub-legal — оба этих класса сидят на <p>, а ".sub-drop p" (класс+тег)
   специфичнее ОДНОГО класса и перебивал бы margin/font-size обратно. */
.sub-drop .sub-feat-note{font-size:12px;color:var(--text2);margin-top:2px;text-align:right}
/* margin:0 — разделители сверху и снизу (.sub-feat-rule, у каждого свой
   margin:18px 0 сам по себе) теперь и дают весь отступ; раньше здесь стоял
   ещё +28px сверху (до появления самих разделителей), из-за чего отступ
   «оферта → верхняя линия» получался заметно больше, чем «політика → нижняя
   линия» — владелец попросил сделать оба как нижний, т.е. поровну. Размер —
   как у списка функций (16px, .sub-feat-list) — единый шрифт по всему попапу;
   цвет/жирность самих ссылок (.sub-legal a) не трогаем — это их признак кликабельности. */
.sub-drop .sub-legal{margin:0;font-size:16px;font-family:var(--serif);color:var(--text2)}
.sub-legal a{display:block;color:var(--accent);font-weight:600}
.sub-legal a + a{margin-top:6px}
/* при наведении растут, как и всё на сайте (transform:scale, без сдвига
   соседей) — но строки стоят вплотную (margin-top:6px), рост от центра
   наехал бы на соседнюю строку. Верхняя растёт только вверх (снизу сосед),
   нижняя — только вниз: transform-origin у каждой смотрит в свободную
   от соседа сторону, поэтому друг друга они не задевают. */
.sub-legal a{transform-origin:left bottom;transition:transform .16s ease}
.sub-legal a:last-of-type{transform-origin:left top}
.sub-legal a:hover{transform:scale(1.08)}
@media (prefers-reduced-motion:reduce){ .sub-legal a{transition:none} }
/* «$» у цены — держим и видим сумму в долларах, ТОЛЬКО пока зажато (мышью
   или пальцем): это не переключатель валюты, отпустил — снова гривна (см.
   зажатие/отпускание в chart.html). Появляется по наведению на весь вариант
   цены; жирный, тем же шрифтом, что и сама строка, размер как у заглавной
   буквы этого текста (1em) — не мельче и не крупнее соседнего текста. */
.cp-opt-usd{margin-left:5ch;font-weight:700;font-size:1em;font-family:inherit;
  color:var(--accent);cursor:pointer;-webkit-user-select:none;user-select:none;
  opacity:0;pointer-events:none;transition:opacity .18s ease}
.cp-opt:hover .cp-opt-usd{opacity:1;pointer-events:auto}
@media (hover:none){ .cp-opt-usd{opacity:1;pointer-events:auto} }
/* «Выгода 25%» у годового тарифа — заметнее самой цены (акцентный цвет),
   но мельче и не курсивом, чтобы не спорить с ценой за внимание */
.cp-opt-save{margin-left:8px;font-size:13px;font-weight:700;color:var(--accent)}

/* ── первый экран ── */
/* было 56px — у наклонённой (rotateX/rotateY) карты в .hero-charts
   видимый верхний угол выходит за пределы её собственного 184px-бокса
   разметки (перспектива приподнимает «дальний» угол выше него), и 56px
   не хватало запаса — угол упирался в шапку сайта (см. .site-head,
   position:sticky) на части ширин экрана. Подняли общий отступ строки —
   он один на оба элемента (текст и карты), поэтому воздух над заголовком
   вырос вместе с запасом у карт, а их выравнивание друг относительно
   друга (align-items:center у .hero-head) не затронуто. */
.hero{padding-top:40px}
/* align-items:center — карты должны быть отцентрированы по вертикали
   относительно блока заголовка, это относительное выравнивание между
   ними самими и не зависит от отступа всей строки от шапки сайта (тот
   решается общим .hero{padding-top} ниже, одним значением на оба
   элемента сразу — уменьшает/увеличивает воздух от шапки, но не трогает
   выравнивание текста и карт друг относительно друга). */
.hero-head{display:flex;justify-content:space-between;align-items:center;gap:40px}
.hero-head-text{max-width:760px}
.hero-head .sub{margin:26px 0 0;color:var(--text);font-size:18px}
.hero-grid{display:grid;grid-template-columns:1fr 0.92fr;gap:24px;align-items:start;margin-top:40px}

/* 3 пустых превью стилей карты (Северный/Южный/Восточный) справа от
   слогана — чисто декоративные (aria-hidden, см. index.html), тот же SVG,
   что у настоящей карты (.chart-svg, KJAChart.render), без planets/lagna.
   Фон — цвета страницы (var(--bg)), не var(--card): выглядит как «без
   фона» (сливается с hero), но остаётся НЕПРОЗРАЧНЫМ — иначе при нахлёсте
   было бы видно карту, что лежит снизу, сквозь верхнюю (сквозь её fill=
   none), а нужно наоборот — верхняя карточка должна перекрывать нижнюю
   целиком, как настоящая непрозрачная карточка. rect и polygon — оба:
   в восточном стиле ячейки местами треугольники (polygon), не rect, без
   него они остались бы дырами, сквозь которые видно нижнюю карту; для
   диамант-декорации северного стиля (свой polygon без заливки) разницы
   не видно — он и так лежит на уже закрашенном фоне того же цвета.
   perspective — на
   тайле-обёртке, сам наклон (rotateX+rotateY) — на SVG внутри: так угол
   задаёт именно 3D-поворот плоскости карты, а не просто сжатие рисунка.
   Меньшее значение perspective и большие углы — более глубокий эффект
   (ближе «камера», сильнее схождение). Наклон подобран так, чтобы верхний
   левый угол читался как более далёкий, а нижний правый — как более
   близкий (та же грань, что ближе всего к зрителю, «выходит» на зрителя).
   flex:none — тайлы не должны сжиматься, если слогану вдруг не хватит
   места. Внахлёст — отрицательный margin-left у 2-й и 3-й карточки;
   порядок наложения (какая сверху) — обычный порядок в DOM, младшие
   перекрывают старшие, z-index не нужен. Толщина линий — * перебивает
   собственные stroke-width каждого элемента (0.8/1.5 в разметке из
   chart-render.js) единым значением: у presentation-атрибутов в SVG
   низший приоритет в каскаде, любое совпавшее правило CSS их перебивает,
   даже универсальным селектором. Цифры знаков — только у северного стиля
   (он один их всегда рисует, даже без данных, см. chartNorth в
   chart-render.js) — тут они лишние, скрыты по id самого тайла. */
.hero-charts{display:flex;flex:none}
.hero-chart-tile{width:184px;aspect-ratio:1/1;perspective:350px;flex:none}
.hero-chart-tile:not(:first-child){margin-left:-60px}
/* порядок наложения — обратный порядку в DOM (тот, слева, идёт поверх):
   z-index на flex-детях работает и без position — по спецификации
   flexbox они и так стекуются «как будто position:relative». */
#heroChartNorth{z-index:3}
#heroChartSouth{z-index:2}
#heroChartEast{z-index:1}
/* backface-visibility: без неё браузер иногда рисует «обратную сторону»
   3D-повёрнутого элемента (зеркально) — на симметричных Северном/Южном
   стилях это незаметно, а на асимметричном Восточном видно как «не в ту
   сторону» (repro: перезагружать главную несколько раз подряд). */
.hero-chart-tile .chart-svg{transform:rotateX(14deg) rotateY(-24deg);
  backface-visibility:hidden;-webkit-backface-visibility:hidden}
.hero-chart-tile .chart-svg rect,.hero-chart-tile .chart-svg polygon{fill:var(--bg)}
.hero-chart-tile .chart-svg *{stroke-width:1.8}
/* тёмная тема: сетка нарисована с stroke="var(--text3)" (chart-render.js) —
   там альфа .28, специально приглушена для настоящих карт (номера домов и
   т.п., трогать --text3 глобально нельзя, она везде). У этой декоративной
   превью-сетки в тёмной теме линии читались как дефект экрана — поднимаем
   контраст ТОЛЬКО здесь, тем же цветом --text3, но заметно плотнее (тот же
   принцип, что у --text3 в светлой теме, альфа .55 там — просто перенесённая
   сюда пропорция). Presentation-атрибут stroke у CSS-правила низший
   приоритет в каскаде — любой селектор его перебивает (см. коммент про
   stroke-width выше). */
:root[data-theme="dark"] .hero-chart-tile .chart-svg *{stroke:rgba(237,229,208,.55)}
/* Тень задумывалась ТОЛЬКО в зоне нахлёста (её отбрасывает верхняя
   карточка на нижнюю), но без сдвига красит весь периметр элемента —
   не только край в зоне контакта. Ограничить именно узкой полосой
   контакта потребовало бы отдельного элемента с абсолютным
   позиционированием, синхронизированного с тем же 3D-поворотом (rotateX/
   rotateY), что и сама карта, — ненадёжно без визуальной проверки (в
   браузер не заходим). Поэтому — по периметру у всех трёх одинаково,
   включая Восточную (раньше у неё не было вовсе, тк отбрасывать не на
   что) — так хотя бы нет асимметрии «у двух есть, у одной нет».
   filter:drop-shadow, а не box-shadow — у box-shadow на корневом <svg>
   давняя нестыковка в WebKit/Safari (тень на SVG-элементе просто не
   рисуется, работает только на HTML-боксах), в Firefox тоже не всегда
   надёжно с 3D-transform на элементе. drop-shadow — SVG-фильтр, задуман
   именно для форм/SVG и одинаково поддержан во всех актуальных браузерах,
   в т.ч. с perspective/rotateX/rotateY на элементе. */
.hero-chart-tile .chart-svg{filter:drop-shadow(0 0 22px rgba(0,0,0,.45))}
#heroChartNorth .chart-svg text{display:none}
@media (max-width:860px){
  .hero-charts{display:none}
  .calc-details{display:none}
}

.card{background:var(--card);border-radius:16px;box-shadow:var(--shadow)}

/* калькулятор */
.calc{display:flex;flex-direction:column}
.calc h2{margin-bottom:24px}
/* поля ввода + «Рассчитать» (и панель результата на их месте) — на карточке
   (.card, тот же компонент, что auth-card на login/register); заголовок
   остаётся НАД карточкой (h2 вне .calc-card), «Подробные расчёты» — сразу
   под ней (см. .calc-details ниже, margin-top держит те же 28px, что и
   везде между соседними .btn — см. button-hover-gap). */
.calc-card{position:relative;padding:28px 30px 56px}
/* .calc-stack: min-height ставит js/calc.js (по замеренной высоте панели,
   которая вот-вот покажется, см. pinCalcStackHeight в calc.js) — сама
   карточка плавно растёт/сжимается под неё этим transition, поэтому смена
   поля/результата не проседает и не дёргается, а высота карточки в покое
   всегда равна ровно видимому содержимому (без пустого запаса снизу). */
.calc-stack{transition:min-height .28s ease}
#kjaFields,#kjaResultsPane{transition:opacity .18s ease}
@media (prefers-reduced-motion:reduce){
  .calc-stack{transition:none}
  #kjaFields,#kjaResultsPane{transition:none}
}
.form-row{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px}
.field{position:relative}
/* названия полей — строчными, как в приложении; разрядка была нужна капсу */
.field label{display:block;font-family:var(--sans);font-size:12.5px;letter-spacing:.01em;
  color:var(--text2);margin-bottom:6px;font-weight:600}
/* тёмная тема: --text2 на --card там даёт ~4.1:1 — ниже порога 4.5:1 для
   обычного текста. Светлую не трогаем (не в задаче). Мешаем к --text
   ровно настолько, чтобы перейти порог с запасом (~4.9:1 расчётно). */
:root[data-theme="dark"] .field label{color:color-mix(in srgb,var(--text) 20%,var(--text2) 80%)}
/* Поля — та же стеклянная заливка, что у кнопок (.btn): один рецепт, а не похожий
   оттенок, поэтому поле и кнопка совпадают по цвету на любом фоне и в любой теме.
   Действует и на широту/долготу/пояс — они те же .field input. */
.field input{width:100%;font-family:var(--sans);font-size:16px;color:var(--text);
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  -webkit-backdrop-filter:blur(10px) saturate(1.5);backdrop-filter:blur(10px) saturate(1.5);
  border:0;border-radius:10px;padding:12px 14px;outline:none;
  box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12);
  transition:box-shadow .16s ease}
/* тёмная тема: --glass-top/--glass-bot там альфа .14/.05 — на тёмной
   карточке (--card) это почти не поднимает поле над фоном, поле и
   карточка сливаются. Светлая тема не тронута (там альфа .72/.40, уже
   работает). Берём --card-hi/--card-hi2 — тот же принцип «на ступень
   светлее --card», уже применяемый в других местах для того же эффекта,
   но непрозрачный (не привязан к тому, что под карточкой), поэтому
   контраст с --card гарантирован, а не зависит от подложки. Без рамки —
   различаем полностью заливкой, как и везде на сайте (см. no-borders-on-cards). */
:root[data-theme="dark"] .field input{background:linear-gradient(180deg,var(--card-hi2),var(--card-hi))}
.field input::placeholder{color:var(--text2);opacity:.7}
/* :focus — без рамки; сигнал фокуса — кольцо (--focus-ring) поверх тени. */
.field input:focus{box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12),
  0 0 0 3px var(--focus-ring)}
.field-full{grid-column:1/-1}

/* Строка города: поле шириной с «дату рождения»; подпись — по центру колонки
   «времени рождения» и по вертикали на середине поля города (высота = высоте
   поля: 12px padding сверху/снизу + строка, поэтому центры совпадают). */
.city-row{align-items:end}
.city-more{display:flex;align-items:center;justify-content:center;margin:0;
  height:43px}

.sug{position:absolute;left:0;right:0;top:100%;margin-top:4px;z-index:20;background:var(--card);
  border-radius:10px;box-shadow:var(--shadow-hi);overflow:hidden}
.kja-sug-item{display:block;width:100%;text-align:left;font-family:var(--sans);font-size:15px;
  color:var(--text);background:none;border:0;padding:10px 13px;cursor:pointer}
.kja-sug-item:hover{background:var(--accent-soft)}
.sug-c{color:var(--text2)}   /* страна — подчинена названию города */

.manual-link{font-family:var(--sans);font-size:13px;color:var(--text2);cursor:pointer}
.manual-link:hover{color:var(--accent)}

/* Ручной ввод координат: плавное раскрытие через grid-template-rows 0fr→1fr —
   единственный способ анимировать «высоту по содержимому» без замеров в JS.
   ВАЖНО: на .manual-inner не должно быть padding — 0fr даёт треку минимум по
   содержимому, а padding несжимаем, и блок застрянет на его высоте. Поэтому
   отступы и подложка — на .manual-box внутри.
   visibility снимает поля с прохода по Tab, пока блок закрыт. */
.manual{display:grid;grid-template-rows:0fr;margin:0;opacity:0;
  transition:grid-template-rows .3s ease,opacity .24s ease,margin .3s ease}
.manual.open{grid-template-rows:1fr;opacity:1;margin:14px 0 4px}
.manual-inner{overflow:hidden;min-height:0;
  visibility:hidden;transition:visibility 0s linear .3s}
.manual.open .manual-inner{visibility:visible;transition-delay:0s}
.manual-box{padding:14px;background:var(--accent-soft);border-radius:10px}
/* широта / долгота / пояс — одной строкой, равной ширины;
   align-items:end держит поля на одной линии, даже если подпись перенесётся */
.manual-row{grid-template-columns:repeat(3,1fr);align-items:end}
.manual .form-row{margin-bottom:0}
@media (prefers-reduced-motion:reduce){
  .manual{transition:none}
}

.calc-actions{display:flex;align-items:center;justify-content:center;gap:14px;flex-wrap:wrap;margin-top:20px}
/* «Рассчитать» — единственная по-настоящему контрастная кнопка блока (см.
   задачу «иерархия кнопок»): плоская заливка в цвет заголовка, без стекла
   и тени. Через #id, не через .btn-cta — тот переиспользуется как обычная
   стеклянная CTA-кнопка по всему остальному сайту (login/register/account/
   chart.html и т.д.), трогать его глобально не нужно. var(--text)/var(--card)
   сами меняются местами между темами — заливка и текст инвертируются
   автоматически, без отдельного правила под тёмную тему. */
#kjaCalcBtn{background:var(--text);color:var(--card);
  -webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:none}
#kjaCalcBtn:hover{background:var(--text);color:var(--card);box-shadow:none}
/* «Подати заявку» на странице консультації і в попапі модуля курсу, і
   «Надіслати» на самій анкеті (2й попап, з вибором месенджера) — тот же
   приём плоской заливки, що у «Розрахувати» (см. выше), через #id, не
   .btn-cta глобально. */
#kjaApplyBtn,#kjaModalApplyBtn,#afSubmit{background:var(--text);color:var(--card);
  -webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:none}
#kjaApplyBtn:hover,#kjaModalApplyBtn:hover,#afSubmit:hover{background:var(--text);color:var(--card);box-shadow:none}
/* «Подробные расчёты» — внутри карточки калькулятора, в правом нижнем углу
   (.calc-card{position:relative}, доп. padding-bottom под неё же). Вторичное
   действие — обычная текстовая ссылка с подчёркиванием, без стеклянной
   пилюли .btn (фон/тень/рост при наведении рядом с контрастной «Рассчитать»
   были бы лишними — обе кнопки иначе снова спорили бы за внимание). */
.calc-details{position:absolute;right:30px;bottom:18px;margin:0;
  background:none;-webkit-backdrop-filter:none;backdrop-filter:none;
  box-shadow:none;border-radius:0;padding:0;
  color:var(--text2);font-weight:500;text-decoration:underline;text-underline-offset:3px}
.calc-details:hover{color:var(--accent);font-weight:500;transform:none;box-shadow:none}
/* вступительные абзацы под колонками (калькулятор/календарь) — заметный
   отступ от полей/карточки над ними, не «прилипают» вплотную */
.calc-intro{margin:40px 0 0;font-size:17px;line-height:1.6;color:var(--text)}
/* второй абзац описания калькулятора («Более того — …») — обычный отступ
   между абзацами, а не 40px, задуманные как отбивка от блока над ними */
.calc-intro+.calc-intro{margin-top:18px}
.lunar-intro{margin:40px 0 0;font-size:17px;line-height:1.6;color:var(--text);transition:opacity .18s ease}
@media (prefers-reduced-motion:reduce){ .lunar-intro{transition:none} }

.err{font-family:var(--sans);font-size:14px;color:var(--err);margin:14px 0 0}
/* сообщение под конкретным полем формы (регистрация: email/имя+фамилия уже
   заняты) — тот же цвет, что у .err, но компактнее и ближе к полю */
.field-err{font-family:var(--sans);font-size:12.5px;color:var(--err);margin:6px 0 0}

/* дата/время/место одной строкой вместо полей ввода (после расчёта) */
/* без margin-top: теперь birth-row — первый элемент своей панели
   (#kjaResultsPane), отступ от заголовка блока даёт h2{margin-bottom} —
   так же, как у полей ввода в другой панели, без лишнего зазора */
.birth-row{display:flex;align-items:center;justify-content:space-between;gap:14px}
.birth-line{font-family:var(--sans);font-size:17px;font-weight:700;color:var(--text)}

/* таблица результатов — без разделительных линий между строками, только
   заголовок колонок (см. no-borders-on-cards: различаем не рамкой, а отступом).
   Первая колонка (подпись строки) — по левому краю, «Знак Зодиака» и
   «Накшатра» — по центру. */
.results-table{margin-top:18px;width:100%;border-collapse:collapse}
.results-table th{font-family:var(--sans);font-size:13px;font-weight:700;
  color:var(--text2);padding:0 8px 8px}
.results-table td{font-family:var(--serif);font-size:18px;font-weight:600;
  color:var(--text);padding:8px}
.results-table td.k{font-family:var(--sans);font-size:14px;font-weight:700;
  color:var(--text2)}
.results-table th:first-child,.results-table td:first-child{text-align:left;padding-left:0}
.results-table th:not(:first-child),.results-table td:not(:first-child){text-align:center}
.results-table th:last-child,.results-table td:last-child{padding-right:0}
/* разделитель между строками результата — одна линия на всю строку (все 3
   колонки), короче самой строки (инсет по 12px с каждой стороны через
   background-size/position), не упирается в края поля. На tr, а не на
   td каждой колонки — иначе получались бы 3 отдельных коротких отрезка
   вместо одной сквозной линии. */
.results-table tbody tr:not(:last-child){
  background-image:linear-gradient(var(--line),var(--line));
  background-repeat:no-repeat;background-position:center bottom;
  background-size:calc(100% - 24px) 1px}

/* карта (chart.html) */
.chart-host{position:relative}
/* Карты Джанмы квадратные (viewBox 300×300). Резервируем квадрат заранее, чтобы
   нижний ряд по «Больше карт» ВЫЕЗЖАЛ на реальную высоту, а не подпрыгивал в
   момент отрисовки карт: пустой хост уже держит высоту, содержимое встаёт в неё. */
#cpCharts .chart-host{aspect-ratio:1/1}
.chart-svg{display:block}

/* лунный календарь (главная) — карточка той же формы, что раньше держала
   карту. Своя разметка карточек (lc-ev-*), НЕ шарит стили с .tr-ev-*
   на странице «Подробно» — там другая раскладка (дата/время в столбик). */
.lunar-side{position:sticky;top:88px;border-left:1px solid var(--line);padding-left:32px}
/* переключатель «Лунный календарь» / «Панчанга» — тем же полем ниже, без
   отдельной карточки на кнопку (см. #lunarCalPane/.hero-panchanga). Обе
   надписи ВСЕГДА должны стоять в один ряд, на любом языке (ru/uk-строки
   заметно длиннее en) — раньше здесь был размер шрифта .lunar-cal-title
   (heading, clamp 24–34px, задуман под ОДНО слово); с двумя словами рядом
   он на узких/ru-uk экранах не помещался, ряд переносился на вторую строку
   — а это ещё и сдвигало карточку ниже, потому что sizeEvScroll в
   lunar-cal.js меряет высоту от фактического положения #kjaEvScroll: лишняя
   строка над ним «съедала» высоту поля. Поэтому: шрифт заметно меньше и не
   растёт от vw без верхнего предела, flex-wrap:nowrap и white-space:nowrap
   на самих кнопках — перенос строки исключён совсем, а не просто маловероятен.
   Активная надпись цветом как раньше .lunar-cal-title, неактивная —
   приглушённым цветом и на 20% меньше — transform:scale, НЕ font-size: оба
   элемента лежат в одной flex-строке с align-items:baseline, и смена
   font-size меняла бы фактическую высоту самой строки (какая надпись
   сейчас крупная — от этого зависел line-height всей строки), а от этого
   на пиксель-два сдвигалось бы всё ниже — тот же механизм, что и с
   переносом. transform в раскладке не участвует (та же идея, что у
   .btn:hover{transform:scale(1.2)}), поэтому размер строки теперь всегда
   одинаков — оба элемента при любом состоянии физически одного и того же
   font-size (полный, из clamp на .lunar-side-tabs). */
.lunar-side-tabs{display:flex;gap:14px;align-items:baseline;flex-wrap:nowrap;
  margin:0 0 16px;font-size:clamp(18px,1.4vw,22px)}
.lunar-side-tab{font-family:var(--serif);font-weight:600;line-height:1.15;
  color:var(--text);background:none;border:0;padding:0;margin:0;cursor:pointer;
  white-space:nowrap;font-size:1em;transform-origin:0 100%;
  transition:color .18s ease,transform .18s ease}
.lunar-side-tab:not(.active){color:var(--text2);transform:scale(.8)}
/* город/пояс/время (см. index.html/panchanga-now.js) — общая строка, видна
   при любой из вкладок (не только «Панчанга»): иначе при переключении она
   появлялась/исчезала и сдвигала карточку ниже по вертикали. Между
   переключателем (теперь некрупный, см. .lunar-side-tabs) и карточкой. */
.hero-panchanga-loc{font-family:var(--sans);font-size:12.5px;color:var(--text2);
  margin:0 0 10px}
/* тот же «стеклянный» фон, что у полей ввода калькулятора (.field input) —
   не плоская заливка var(--card), а такой же градиент+блюр. Размер карточки
   — постоянный при любой из двух вкладок (пробовали анимировать сужение
   под панчангу, но резиновый список календаря на миг переламывался, пока
   карточка не дорастала обратно до полной ширины — читалось как «скачок»);
   панчанга просто уже своего контента (см. .hero-panchanga-rows), с пустым
   местом справа, а не карточка уже панчанги. */
.lunar-cal{background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  -webkit-backdrop-filter:blur(10px) saturate(1.5);backdrop-filter:blur(10px) saturate(1.5);
  border-radius:16px;box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12);
  padding:22px}
/* фейд-аффорданс прокрутки: убрали отдельный ::after снизу (накладывал
   свой слой var(--glass-bot) ПОВЕРХ собственного фона карточки — у самого
   низа складывались два полупрозрачных слоя и читалось отдельной светлой
   полосой, не как у верхнего края). Верх и низ ленты фейдятся ОДНИМ и тем
   же способом — mask-image на .lunar-cal-scroll ниже (симметричный
   linear-gradient, 10px с обеих сторон): гасит сам контент до прозрачности,
   без наложения лишнего слоя цвета, поэтому низ выглядит так же, как верх. */
/* height (не max-height) — запасной вариант до первой отрисовки; точную
   высоту на EV_VISIBLE_ROWS целых строк без обрезки ставит sizeEvScroll
   в lunar-cal.js, тоже через height. Так поле держит один и тот же размер
   и под лентой календаря, и под панчангой (см. #lunarCalPane/.hero-panchanga
   ниже) — с max-height более короткое содержимое просто сжало бы карточку.
   Лента открывается прокрученной на «сейчас» — какая бы строка ни оказалась
   первой видимой, её граница-разделитель (между строками, см. lc-ev-row+
   lc-ev-row) в этот момент сидит ровно на верхнем/нижнем крае карточки и
   читается как посторонняя линия. mask-image мягко гасит края — граница
   тает, а не обрывается ровно на кромке, независимо от точности scrollTop.
   scrollbar-gutter:stable — место под полосу прокрутки зарезервировано
   всегда, даже когда её не видно (у ленты календаря содержимое обычно
   переполняет высоту и полоса есть, у панчанги — нет): без этого доступная
   ширина скакала бы на ширину полосы при переключении вкладок.
   transition:height — на случай смены самого числа (resize/новый расчёт
   sizeEvScroll в lunar-cal.js); между Календарём и Панчангой высота теперь
   не меняется вовсе — см. FIELD_HEIGHT_TRIM там же и .hero-panchanga ниже. */
.lunar-cal-scroll{height:260px;overflow-y:auto;scrollbar-gutter:stable;
  transition:height .3s ease;
  -webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 10px,#000 calc(100% - 10px),transparent 100%);
  mask-image:linear-gradient(to bottom,transparent 0,#000 10px,#000 calc(100% - 10px),transparent 100%)}
/* scrollbar-width/scrollbar-color НЕ ставим: в Chrome 121+ их наличие
   отключает ::-webkit-scrollbar целиком — с ними полоса пропадала бы
   в Chromium, а не становилась тонкой. Только webkit-триада — её же
   понимает и Safari, постоянная видимая полоса без overlay-скрытия macOS. */
.lunar-cal-scroll::-webkit-scrollbar{width:6px}
.lunar-cal-scroll::-webkit-scrollbar-track{background:transparent}
.lunar-cal-scroll::-webkit-scrollbar-thumb{background:var(--text3);border-radius:3px}
.lunar-cal-scroll::-webkit-scrollbar-thumb:hover{background:var(--text2)}
/* тёмная тема: --text3 там α.28 — ползунок был бы почти невидим, берём
   --text2 (ярче) специально для него; светлую тему не трогаем. */
:root[data-theme="dark"] .lunar-cal-scroll::-webkit-scrollbar-thumb{background:var(--text2)}
.lunar-cal-loading{font-family:var(--sans);font-size:14px;color:var(--text2)}

.lc-ev-list{display:flex;flex-direction:column}
/* строка — три колонки: дата/время, разделительная точка (обе — фиксированной
   ширины по содержимому, tabular-nums не даёт дате гулять между строками) и
   всё остальное (название + sub) справа от точки. Sub-строка (знак/накшатра/
   пада затмения, выход из поста экадаши) лежит внутри .lc-ev-col РЯДОМ с
   названием (не с точкой), поэтому её левый край сам совпадает с началом
   названия — без подбора отступа руками. */
.lc-ev-row{display:flex;align-items:baseline;gap:8px;padding:9px 2px}
.lc-ev-row+.lc-ev-row{border-top:1px solid var(--line)}
.lc-ev-col{flex:1;min-width:0}
.lc-ev-dt{font-family:var(--sans);font-size:15px;font-weight:600;color:var(--accent);
  font-variant-numeric:tabular-nums;flex:none}
.lc-ev-sep{color:var(--text3);flex:none}
/* шрифт — как у значений калькулятора (.results-table td), размер прежний */
.lc-ev-name{font-family:var(--serif);font-size:15.5px;font-weight:600;color:var(--text);
  display:inline-flex;align-items:center;gap:6px}
.lc-ev-sub{margin-top:2px;font-family:var(--sans);font-size:13.5px;color:var(--text2)}

/* панчанга «на сейчас» — переключатель того же поля (см. .lunar-side-tabs
   выше, #lunarCalPane/#kjaEvScroll в index.html). height:100% растягивает
   блок на всю высоту #kjaEvScroll, а .hero-panchanga-rows занимает её всю
   (flex:1) и разносит 6 строк space-between — так верстка сама
   подстраивается под любую высоту поля. Эта высота ОДНА и та же что под
   календарём, что под панчангой — считает её sizeEvScroll в lunar-cal.js
   (см. FIELD_HEIGHT_TRIM там же), без «мёртвого» отступа сверху/снизу, что
   раньше был тут padding'ом (у .hero-pan-row ниже его больше нет). Между
   панелями высота поэтому не скачет и не анимируется — она вообще не
   меняется, ни высота, ни ширина (см. .lunar-cal выше). По горизонтали —
   узко само содержимое, не карточка: подпись+значение стоят рядом (свой
   узкий gap, не space-between на всю ширину карточки), сама группа строк
   не шире max-width и прижата к левому краю (align-items:flex-start на
   родителе) — справа от них остаётся пустое место внутри карточки
   постоянного размера. max-width — на случай смены языка (меняется длина
   слов), поэтому у него ещё и transition. */
.hero-panchanga{height:100%;display:flex;flex-direction:column;align-items:flex-start}
.hero-panchanga-rows{flex:1;width:100%;box-sizing:border-box;
  display:flex;flex-direction:column;gap:5px;
  justify-content:center}
.hero-pan-item{width:100%}
/* строка-разделитель над Накшатрой — «Шукла/Кришна пакша» слева (см.
   #heroPanPaksha в panchanga-now.js), заменившая убранную строку Хоры;
   тот же трек, что у .hero-pan-bar ниже, но подпись прижата к левому
   краю, а не спрятана под значением строки. */
.hero-pan-paksha-bar{position:relative;width:100%;height:2px;border-radius:2px;
  margin-bottom:12px;background:color-mix(in srgb, var(--text2) 30%, transparent)}
.hero-pan-paksha{position:absolute;left:0;bottom:0;
  font-family:var(--sans);font-size:14.28px;font-weight:700;color:var(--text2);white-space:nowrap}
/* подпись/значение — как раньше, flex space-between по краям строки.
   Процент — position:absolute по центру ВСЕЙ строки (50% её ширины),
   не 2й grid-колонки: та была центром лишь оставшегося места между
   подписью и значением, а не геометрическим центром строки.
   overflow:hidden — жёсткая граница строки: без него transform:scale на
   .pan-val при наведении временно «раздувал» скролл-контейнер поля
   (#kjaEvScroll/.lunar-cal-scroll — overflow-y:auto, общая высота с
   календарём), из-за чего поле прыгало и снизу мелькали артефакты
   скролла. Сама строка при этом ничего не обрезает у обычного текста —
   только у выросшего transform. */
.hero-pan-row{position:relative;display:flex;align-items:baseline;gap:12px;justify-content:space-between;
  overflow:hidden}
/* 16.8 * .85 = 14.28px */
.hero-pan-row .k{font-family:var(--sans);font-size:14.28px;font-weight:700;color:var(--text2);
  white-space:nowrap;flex:0 0 auto}
/* шрифт — как у значений калькулятора (.results-table td: var(--serif) 18px),
   размер на 5% меньше (18 * .95 = 17.1px) */
.hero-pan-row span:last-child{font-family:var(--serif);font-size:17.1px;font-weight:600;color:var(--text);
  white-space:nowrap;text-align:right}
/* трек на всю ширину (видимый — см. color-mix ниже) + заливка обратно по
   проценту (см. setBar в panchanga-now.js) — числом проценты не дублируем. */
.hero-pan-bar{height:2px;margin-top:3px;border-radius:2px;
  background:color-mix(in srgb, var(--text2) 30%, transparent);overflow:hidden}
.hero-pan-bar-fill{height:100%;width:0;border-radius:2px;background:var(--accent);
  transition:width .4s ease}

/* ── обучение ── */
/* текст+программа — левая половина, фото — правая (см. .study-photo ниже);
   тот же приём колонок, что у .app-grid. Колонки равные — весь блок вместе
   с .wrap сдвинут вправо (см. правило на широких экранах ниже), это и даёт
   фото больше места, а не разная ширина колонок. */
.study-grid{display:grid;grid-template-columns:1fr 1fr;gap:48px;align-items:start;margin-top:18px}
.study-copy,.study-photo-slot{min-width:0}
.study .lead{max-width:720px;margin-bottom:18px}
.study p{max-width:720px;color:var(--text-desc)}
/* названия блоков (отзывы, программа) — крупнее и с воздухом сверху;
   отдельный класс, а не .study h3: тот зацепил бы заголовки карточек модулей.
   margin-top уменьшен (было 120px) — просили сократить отступ между текстом
   и программой курса именно в этом блоке (единственное место с .block-title) */
.block-title{font-size:26px;margin-top:48px}

/* На широких экранах .wrap этой секции сдвинут вправо и чуть шире обычного:
   левый край (и текст) остаётся на месте (margin-left тот же, что дал бы
   обычный центрирующий margin:auto), а правый — вдвое ближе к краю экрана,
   чем обычно. Формула через % от .study (100% ширины экрана), а не 100vw —
   не задваивает ширину скроллбара. Ниже 1296px (где обычная центровка и так
   даёт 0 отступов) правило не включаем — иначе margin ушёл бы в минус. */
@media (min-width:1296px){
  .study .wrap{max-width:none;
    width:calc(var(--maxw) + (100% - var(--maxw))/4);
    margin-left:calc((100% - var(--maxw))/2);margin-right:0}
}

/* фото — ЖЁСТКО неподвижно, та же логика, что у .site-head/.site-foot
   (см. их комментарии выше): position:fixed, а не sticky — никогда не
   двигается при скролле текста слева, ни на пиксель. Высота — адаптивно
   вся видимая область между шапкой и футером (top/bottom от их переменных
   --header-h/--footer-h, см. js/page-transition.js). Ширина/положение по
   горизонтали (left/width) — там, где сетка отвела бы правую колонку;
   .study-photo вынута из грида (fixed не участвует в grid-раскладке),
   поэтому left/width подгоняет js/study-photo.js под невидимый плейсхолдер
   .study-photo-slot, который и стоит в сетке вместо неё (та же ширина
   колонки, с учётом брейкпоинта на широких экранах, см. .study .wrap
   выше) — надёжнее, чем дублировать эту брейкпоинт-математику в calc(). */
/* display:flex + center/center — центрирует картинку внутри бокса по ОБЕИМ
   осям, когда её пропорция не совпадает с пропорцией бокса (см. ниже). */
.study-photo{position:fixed;top:var(--header-h, 64px);bottom:var(--footer-h, 64px);
  z-index:2;overflow:hidden;display:flex;align-items:center;justify-content:center}
/* max-width/max-height:100% + width/height:auto + aspect-ratio — НЕ
   object-fit:contain на растянутой на 100%×100% картинке. Разница важна для
   маски (см. ниже): при object-fit картинка растянута на весь бокс, и внутри
   ЭТОГО растянутого бокса остаются пустые поля (letterbox) — маска же
   считается от границ бокса, а не от границ видимого изображения, поэтому
   если снизу пустое поле (леттербокс), маска гасит пустоту, а не картинку,
   и фейд-аут визуально пропадает (ровно то, что и было). Здесь картинка —
   САМА себе бокс нужного размера (width/height:auto с aspect-ratio даёт ей
   ровно те пиксели, что видны, без запаса) — маска на ней всегда совпадает
   с её собственным нижним краем, где бы он ни оказался после центрирования.
   Исчезновение снизу — маской по самой картинке (не отдельным слоем поверх,
   иначе на стыке остаётся заметная линия/полоса), узкая полоса (94%→100%,
   ~6% высоты кадра). */
.study-photo-img{max-width:100%;max-height:100%;width:auto;height:auto;
  aspect-ratio:827/1001;object-fit:contain;display:block;
  -webkit-mask-image:linear-gradient(to bottom, black 94%, transparent 100%);
  mask-image:linear-gradient(to bottom, black 94%, transparent 100%)}

/* карточки: без обводок, увеличение + усиление тени при наведении, плавно */
.reviews{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:34px}
.review{padding:24px}
.review .quote{color:var(--text2);font-style:italic;font-family:'Bitter';min-height:78px}
.review .who{font-family:var(--serif);font-weight:600;margin-top:16px;color:var(--text)}

/* grid-auto-rows:1fr — все ряды одной высоты, поэтому все карточки одинаковые
   (иначе нижний ряд с коротким текстом заметно ниже верхнего).
   2 в строке — карточки в левой половине блока обучения (.study-copy),
   рядом с фото справа. Без max-width: сама колонка уже (0.75fr, см.
   .study-grid) — доп. сужение внутри было бы избыточным. */
.modules{display:grid;grid-template-columns:repeat(2,1fr);grid-auto-rows:1fr;gap:18px;
  margin-top:34px}
.module{position:relative;padding:24px;display:flex;flex-direction:column;min-height:210px}
/* номер модуля — строчными, без капса, слева, как остальной текст карточки */
.module .num{position:relative;font-family:var(--sans);font-size:15px;letter-spacing:.02em;
  color:var(--accent);font-weight:700;padding-bottom:12px}
/* разделитель под строкой модуля: сплошной, симметричный отступ 14px — не встык к краям */
.module .num::after{content:'';position:absolute;left:14px;right:14px;bottom:0;height:1px;
  background:var(--line)}
.module h3{margin:12px 0 8px}
/* пояснение — курсивом, как цитата в отзывах; flex:1 занимает всё место между
   заголовком и строкой срока/«Подробно», а justify-content центрирует текст в нём */
.module p{color:color-mix(in srgb, var(--text) 35%, var(--text2));font-size:16.5px;line-height:1.5;flex:1;margin:0;
  font-family:'Bitter';font-style:italic;
  display:flex;flex-direction:column;justify-content:center}
/* у 02-го модуля текст самый длинный — чуть мельче остальных */
.module[data-module="02"] p{font-size:15px}
.module .mod-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;
  margin-top:16px;min-height:30px}
.module .dur{font-family:var(--sans);font-size:14px;color:var(--text2)}

/* Вся карточка — одна кнопка: клик в любом месте открывает окно */
.module{cursor:pointer}
.module:focus-visible{outline:2px solid var(--accent);outline-offset:3px}

/* «Подробно» — только текст, без плашки и обводок. Проступает в нижнем правом
   углу карточки под курсором и исчезает, когда мышь ушла. */
.card-more{font-family:var(--sans);font-size:12.5px;font-weight:600;color:var(--accent);
  opacity:0;transform:translateY(4px);pointer-events:none;
  transition:opacity .22s ease,transform .22s ease}
.module:hover .card-more,.module:focus-visible .card-more{opacity:1;transform:none}

.hover-lift{transition:transform .22s ease,box-shadow .22s ease;will-change:transform}
.hover-lift:hover{transform:translateY(-6px) scale(1.02);box-shadow:var(--shadow-hi)}

.center{text-align:center;margin-top:34px}

/* приложение */
/* у всех секций сайта стандартный отступ section{padding:76px 0} — здесь,
   с новым заголовком блока, сверху он читался как большой пустой промежуток
   до самого скролла. Уменьшаем только для этой секции, остальные не трогаем.
   padding-bottom — РОВНО до верха ленты миниатюр, без зазора вообще:
   снизу теперь ещё и position:fixed лента миниатюр поверх футера
   (.app-shot-row-frame, см. ниже) — без этого отступа последний абзац
   текста (.app-outro) прятался бы под ней при долистывании до конца.
   Зазора сверх этого просили не оставлять — нижний край текста при
   долистывании должен доходить РОВНО до нижнего края большого скрина
   (тот тоже кончается на верхней границе ленты миниатюр, см. .app-gallery
   ниже), не выше. Обе переменные меряет js/page-transition.js /
   js/app-gallery.js. */
.app{padding-top:56px;
  padding-bottom:calc(var(--footer-h, 64px) + var(--thumbrow-h, 130px))}
/* текст — ровно половина поля, как просили изначально. Правая колонка
   (.app-gallery-slot) — просто пустой плейсхолдер под неё в сетке, см.
   .app-gallery ниже (вне сетки, position:fixed). */
.app-grid{display:grid;grid-template-columns:1fr 1fr;gap:48px;align-items:start}
/* min-width:0 на обеих колонках грида — без этого 1fr всё равно считается
   не меньше min-content содержимого. */
.app-copy,.app-gallery-slot{min-width:0}
.app-copy p{color:var(--text-desc)}
.app-intro{margin-top:0}
.app-outro{margin-top:26px;font-family:'Bitter';font-style:italic}

/* блоки возможностей приложения — без обводок, разделяем воздухом */
.app-feat{margin-top:26px}
.app-feat h3{display:flex;align-items:center;gap:10px;margin:0 0 6px}
.app-feat p{margin:0}

/* заголовок+кнопка Google Play и большой скрин — ОДИН неподвижный блок
   (просили объединить, не два независимых элемента): оба внутри
   .app-gallery, position:fixed, статично по центру между шапкой и лентой
   миниатюр (top/bottom — переменные --header-h/--footer-h+--thumbrow-h,
   считает js/page-transition.js + js/app-gallery.js), никогда не двигается
   при скролле текста слева — та же логика, что у .site-head/.site-foot/
   .study-photo. Больше НЕ overlay поверх скроллящегося текста (тот был
   нужен только пока заголовок жил в левой колонке .app-copy и полз поверх
   неё) — теперь это отдельная правая колонка, текст слева её не касается,
   поэтому и никакой подложки/градиента под заголовком больше не нужно.
   left/width — подгоняет js/app-gallery.js под невидимый плейсхолдер
   .app-gallery-slot, который и стоит в сетке вместо галереи (та же ширина
   колонки) — надёжнее, чем дублировать раскладку .app-grid в calc(). */
.app-gallery{position:fixed;top:var(--header-h, 64px);
  bottom:calc(var(--footer-h, 64px) + var(--thumbrow-h, 130px));
  z-index:2;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:20px}
.app-title-row{flex:none;width:100%}
.app-title-inner{display:flex;align-items:center;justify-content:space-between;
  gap:20px;flex-wrap:wrap}
.app-title-inner h2{margin:0}
.app-title-inner .gp-btn{margin-top:0;flex:none}
/* высота — переменная --app-shot-h, которую меряет и ставит app-gallery.js:
   вся высота .app-gallery МИНУС реальная высота .app-title-row над ним и
   gap — а не догадка, потому что заголовок иногда переносится на 2 строки
   (другой язык/ширина), и тогда доступной под скрин высоты меньше. */
.app-shot-big{position:relative;aspect-ratio:700/1514;width:auto;max-width:100%;
  height:var(--app-shot-h, calc(100dvh - 290px));max-height:690px;min-height:220px;touch-action:pan-y;
  border-radius:44px;overflow:hidden;background:var(--fill);box-shadow:var(--shadow)}
/* два слоя друг на друге — переключение скрина листает один слой другим
   (направление зависит от того, левее или правее выбрана миниатюра) */
.app-shot-layer{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  object-position:center;display:block;transform:translateX(0);
  transition:transform .85s cubic-bezier(.4,0,.2,1)}
.app-shot-layer:not(.is-front){transform:translateX(100%)}

/* лента миниатюр — вне сетки колонок (см. app.html: отдельный блок в .wrap,
   а не внутри .app-gallery), поэтому шириной на весь контент страницы, а не
   только правую колонку — иначе её обрезает граница с текстом.
   position:fixed, прижата к футеру (bottom:var(--footer-h) — тот же приём,
   что и у самого футера, см. styles.css выше): просили ленту сразу на одном
   месте, без движения при скролле текста слева, а не sticky-отлипание в
   конце секции. БЕЗ подложки — совсем, никакого фона: раньше блюр/градиент
   был нужен, чтобы скрывать скроллящийся ПОД лентой текст в момент до её
   отлипания; теперь лента не часть скролла вообще, текст до неё никогда не
   доезжает, прятать нечего. */
.app-shot-row-frame{position:fixed;left:0;right:0;bottom:var(--footer-h, 64px);z-index:31}
/* миниатюры — фиксированная небольшая ширина (не растянуты на всю строку),
   ряд центрирован (justify-content:center); 13-14 миниатюр у разных языков
   умещаются без переноса на десктопных ширинах .wrap. overflow-x:auto —
   подстраховка на узких экранах (мобильный .app-grid ужимается в 1 колонку,
   но эта лента вне сетки колонок, на всю ширину .wrap): при фиксированной
   ширине миниатюр (не резиновой, как раньше) на совсем узком экране ряд
   может не влезть — тогда просто скроллится, а не переносится/сжимается.
   padding сверху — место для translateY миниатюры при наведении. */
.app-shot-row{display:flex;justify-content:center;gap:8px;
  padding:20px 4px 10px;max-width:100%;overflow-x:auto}
/* скругление пропорционально большому скрину (44px при ширине ~320px —
   те же ~14% от ширины, но в px, а не в % — иначе у высокой узкой миниатюры
   % от width/height давал бы разные по факту радиусы и растянутый угол */
.app-shot-thumb{flex:0 0 46px;aspect-ratio:700/1514;border-radius:9px;overflow:hidden;padding:0;
  background:var(--fill);cursor:pointer;
  transition:transform .28s cubic-bezier(.2,.8,.2,1),box-shadow .22s ease}
.app-shot-thumb img{width:100%;height:100%;object-fit:cover;display:block}
/* какой скрин сейчас показан крупно — перманентно увеличена, не только по hover */
.app-shot-thumb.active{transform:scale(1.15) translateY(-6px);box-shadow:var(--shadow);z-index:1}
.app-shot-thumb:hover,.app-shot-thumb:focus-visible{transform:scale(1.15) translateY(-6px);
  box-shadow:var(--shadow-hi);z-index:2}

/* ── фирменная кнопка Google Play (тёмная плашка со «Доступно в» + логотип) ── */
.gp-btn{display:inline-flex;align-items:center;gap:12px;margin-top:22px;
  padding:9px 18px 9px 15px;border-radius:10px;background:#000;color:#fff;
  border:1px solid rgba(255,255,255,.28);
  transition:transform .18s ease,box-shadow .18s ease}
.gp-btn:hover{transform:scale(1.04);box-shadow:0 8px 20px rgba(0,0,0,.28)}
.gp-btn:active{transform:scale(1.01)}
/* размер задан и атрибутами в SVG — логотип не разрастётся, даже если CSS не доехал */
.gp-logo{width:24px;height:27px;flex:none;max-width:24px}
.gp-text{display:flex;flex-direction:column;line-height:1.1;font-family:var(--sans);text-align:left}
.gp-text small{font-size:10px;opacity:.9}
.gp-text strong{font-size:18px;font-weight:600;letter-spacing:.01em;margin-top:2px}

/* консультация — весь блок (текст+видео слева) центрирован по высоте между
   шапкой и футером: min-height считает доступную высоту (100dvh минус их
   переменные --header-h/--footer-h, те же, что у body{padding-top/-bottom}
   выше — тут не задваивание, а ровно та же видимая область), flex сам
   центрирует .cons-grid внутри неё. */
.consult{min-height:calc(100dvh - var(--header-h, 64px) - var(--footer-h, 64px));
  display:flex;align-items:center}
/* видео теперь ПОД текстом в левой колонке (просили), правая половина —
   пустой плейсхолдер .cons-photo-slot под фото, которое добавится позже.
   60/40 — текст шире, чем пустая колонка под фото. */
.cons-grid{display:grid;grid-template-columns:60fr 40fr;gap:48px;align-items:center}
.cons-copy p{color:var(--text-desc);margin-top:26px}   /* воздух под заголовком */
/* кнопка — по центру колонки текста */
.cons-actions{display:flex;align-items:center;justify-content:center;gap:14px;flex-wrap:wrap;margin-top:36px}

/* видео: 16:9, скругление; полноэкранный режим — родной ютубовский.
   margin-top — раньше видео было отдельной колонкой грида (свой отступ не
   нужен), теперь стоит ПОД кнопкой внутри .cons-copy. */
.video-frame{position:relative;aspect-ratio:16/9;border-radius:14px;overflow:hidden;
  background:#000;box-shadow:var(--shadow);margin-top:36px}
.video-frame iframe{position:absolute;inset:0;width:100%;height:100%;border:0;display:block}
/* ссылка внутри текста — подчёркиванием, чтобы читалась как ссылка */
.inline-link{color:var(--accent);text-decoration:underline;text-underline-offset:3px;
  text-decoration-thickness:1px;transition:opacity .18s ease}
.inline-link:hover{opacity:.7}

/* футер — контакты внизу, ЖЁСТКО неподвижен (position:fixed), как и шапка —
   те же причины: не sticky/не обычный поток, чтобы не дёргаться при упругом
   bounce браузера у границы скролла. Всегда у низа вьюпорта на любой
   странице, независимо от длины контента (компенсация места под него —
   padding-bottom на body, см. --footer-h там же). z-index ниже шапки (50) и
   попапов (100), но выше обычного контента. */
.site-foot{position:fixed;left:0;right:0;bottom:0;z-index:30;
  border-top:1px solid var(--line);padding:14px 0;background:var(--card)}
/* все пункты — плоским рядом (без вложенных пар-групп) и равномерно вдоль
   всей ширины .wrap (тот же .wrap, что и у «Консультации» — одинаковая
   ширина): justify-content:space-between на самих пунктах, а не на группах
   по 2. flex-wrap — только подстраховка на случай нехватки места. */
.foot-grid{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;
  gap:8px 20px;font-family:var(--sans);font-size:13.5px}
/* copyright раньше был крупнее (15px), жирным (600, унаследовано от общего
   .brand) и в полный контраст (var(--text)) — на фоне соседних ссылок
   (12.5px, обычный вес, var(--text2)) читался громче всех четырёх. Теперь
   вровень по размеру/весу/цвету с ссылками — тише или наравне, не громче;
   сериф оставлен (это единственное, что отличает его как «подпись бренда»,
   не громкость). */
.foot-grid .brand{font-family:var(--serif);font-size:13.5px;font-weight:400;color:var(--text2)}
.foot-grid a{color:var(--text2);display:inline;margin-top:0}
.foot-grid a:hover{color:var(--accent)}


/* ── всплывающее окно модуля: фон размывается, панель всплывает ── */
.modal{position:fixed;inset:0;z-index:100;display:flex;align-items:center;justify-content:center;
  padding:24px;
  background:color-mix(in srgb, var(--bg) 55%, transparent);
  -webkit-backdrop-filter:blur(14px) saturate(1.1);backdrop-filter:blur(14px) saturate(1.1);
  opacity:0;transition:opacity .26s ease}
.modal.open{opacity:1}
.modal-panel{position:relative;width:min(560px,100%);max-height:80vh;overflow-y:auto;
  padding:30px 32px;border-radius:18px;background:var(--card);box-shadow:var(--shadow-hi);
  transform:translateY(14px) scale(.97);transition:transform .26s cubic-bezier(.2,.8,.3,1)}
.modal.open .modal-panel{transform:none}
.modal-x{position:absolute;top:12px;right:14px;width:32px;height:32px;border:0;border-radius:999px;
  background:none;color:var(--text2);font-size:24px;line-height:1;cursor:pointer;
  transition:color .18s ease,background .18s ease}
.modal-x:hover{color:var(--accent);background:var(--accent-soft)}
.modal-panel .num{font-family:var(--sans);font-size:12px;
  color:var(--accent);font-weight:700}
.modal-panel h3{margin:8px 0 0;font-size:24px}
/* разделитель под названием модуля в попапе — не на всю ширину поля (тот
   же приём, что .module .num::after на карточках: симметричный инсет 14px) */
#kjaModalTitle{position:relative;padding-bottom:14px}
#kjaModalTitle::after{content:'';position:absolute;left:14px;right:14px;bottom:0;height:1px;
  background:var(--line)}
.topics{margin:18px 0 0;padding:0;list-style:none;line-height:1.3}
.topics li{font-size:16px;color:var(--text2);padding:4px 0 4px 18px;position:relative}
.topics li::before{content:'•';position:absolute;left:0;color:var(--text2)}
.topics .soon{font-family:'Bitter';font-style:italic;color:var(--text2);padding-left:0}
.topics .soon::before{content:none}
/* попап модуля курса: текст пунктов программы чуть темнее (было var(--text2)),
   и один разделитель под всем списком — не во всю ширину поля. Скоуп через
   #id — .topics переиспользуется на account.html (список пройденных модулів),
   его не трогаем. */
#kjaModalTopics{position:relative;padding-bottom:14px}
#kjaModalTopics li{color:color-mix(in srgb, var(--text) 60%, var(--text2))}
#kjaModalTopics::after{content:'';position:absolute;left:14px;right:14px;bottom:0;height:1px;
  background:var(--line)}
/* цена и подписка в попапе модуля — крупнее и темнее общего .acct-row-sub
   (13.5px/var(--text2)); перед строкой о подписке — галочка (как «•» у
   .topics li::before — тем же приёмом, псевдоэлементом, не в переводе). */
#kjaModalPrice,#kjaModalPriceNote{font-size:15.5px;color:color-mix(in srgb, var(--text) 35%, var(--text2))}
#kjaModalPriceNote::before{content:'✓ ';color:var(--accent);font-weight:700}
/* условие «модуль пройден» перед заявкой на следующий — чекбокс + подпись */
.prereq-check{display:flex;align-items:flex-start;gap:10px;margin-top:20px;cursor:pointer;
  font-size:14.5px;color:var(--text2);line-height:1.4}
.prereq-check input{margin-top:3px;width:16px;height:16px;flex:none;cursor:pointer}

/* ── попап фактуры результата калькулятора (накшатра/знак/дом лагнеша на
   главной) — переиспользует .modal/.modal-panel/.modal-x модуля курса ── */
/* ширина — +60% от первоначальных 480px */
#kjaFactModal .modal-panel{width:min(768px,100%);max-height:76vh}
/* заголовок + градусы накшатры — одной строкой: название слева, градусы
   прижаты к правому краю (для знака/дома .fact-deg остаётся пустым) */
.fact-title-row{display:flex;align-items:baseline;justify-content:space-between;gap:14px}
#kjaFactModalTitle{margin:8px 0 0;font-size:22px}
.fact-deg{margin:8px 0 0;font-size:13px;color:var(--text2);white-space:nowrap;flex:none}
/* фактура (управитель/девата/символ, или управитель/стихия) — одной строкой,
   пары «подпись: значение» через разделительную точку. У накшатры —
   по центру карточки, у знака — по левому краю (см. задачу). */
.fact-line{margin:14px 0 0;font-size:14px;color:var(--text)}
.fact-line .fact-k{color:var(--text2);font-weight:700}
.fact-line-center{text-align:center}
.fact-body{margin:18px 0 0;font-size:16px;line-height:1.6;color:var(--text)}
.fact-body p{margin:0 0 14px}
.fact-body p:last-child{margin-bottom:0}
/* крестик попапа — без дефолтной синей обводки при фокусе с клавиатуры,
   но с собственным едва заметным кольцом (не совсем без индикатора) */
#kjaFactModalX:focus-visible{outline:none;box-shadow:0 0 0 2px var(--accent-soft)}

/* значения в таблице результатов калькулятора — кликабельны: в покое
   выглядят как обычный текст, при наведении/фокусе растут плавно — тот же
   приём, что у кнопок шапки (.nav a:hover), а не просто смена цвета;
   открытие попапа — строго по клику (без авто-всплывания по наведению,
   см. js/result-popup.js). Без font-weight на hover (в отличие от .nav
   a:hover/.pan-val) — таблица результатов auto-layout (без table-layout:
   fixed), и жирный шрифт меняет ширину текста в ячейке, из-за чего
   пересчитывались ширины колонок и «скакала» вся таблица при наведении на
   любое значение, особенно длинное. transform:scale — чисто визуальный,
   в раскладке не участвует, той же проблемы не создаёт. */
.kja-val{display:inline-block;cursor:pointer;
  transition:transform .18s ease,color .18s ease}
.kja-val:hover,.kja-val:focus-visible{transform:scale(1.2);color:var(--accent)}
.kja-val:focus-visible{outline:none}
@media (prefers-reduced-motion:reduce){ .kja-val{transition:none} }

/* значения панчанги «на сейчас» — те же значения-кнопки, что на
   калькуляторе (.kja-val), просто под своим классом (текст выровнен
   вправо в этих строках — text-align уже на span:last-child выше).
   transform-origin:right — рост только влево (в свободное место строки),
   правый край при этом не двигается и не «уезжает» за границу поля (как
   было при росте от центра, дефолт). */
.pan-val{display:inline-block;cursor:pointer;transform-origin:right center;
  transition:transform .18s ease,color .18s ease}
.pan-val:hover,.pan-val:focus-visible{transform:scale(1.2);font-weight:700;color:var(--accent)}
.pan-val:focus-visible{outline:none}
@media (prefers-reduced-motion:reduce){ .pan-val{transition:none} }

/* попап значения панчанги — НЕ .modal: локально у курсора (позиционирует
   js/panchanga-now.js), затемнение фона без блюра (в отличие от .modal,
   где backdrop-filter:blur), ширина вдвое уже калькуляторного попапа
   (768px/2=384px). Крестик — свой (.pan-popover-x), тот же приём без
   дефолтного синего outline, что у .modal-x/#kjaFactModalX. */
.pan-popover-backdrop{position:fixed;inset:0;z-index:99;background:rgba(0,0,0,.35);
  opacity:0;transition:opacity .16s ease}
.pan-popover-backdrop.open{opacity:1}
.pan-popover{position:fixed;z-index:100;width:min(384px,90vw);box-sizing:border-box;
  padding:20px 22px;border-radius:14px;background:var(--card);box-shadow:var(--shadow-hi);
  opacity:0;transform:translateY(6px) scale(.98);
  transition:opacity .16s ease,transform .16s ease}
.pan-popover.open{opacity:1;transform:none}
.pan-popover-x{position:absolute;top:8px;right:10px;width:28px;height:28px;border:0;border-radius:999px;
  background:none;color:var(--text2);font-size:20px;line-height:1;cursor:pointer;
  transition:color .18s ease,background .18s ease}
.pan-popover-x:hover{color:var(--accent);background:var(--accent-soft)}
.pan-popover-x:focus-visible{outline:none;box-shadow:0 0 0 2px var(--accent-soft)}
#kjaPanPopTitle{margin:0 20px 8px 0;font-size:18px}
#kjaPanPopBody{margin:0;font-size:14.5px;line-height:1.55;color:var(--text)}
@media (prefers-reduced-motion:reduce){
  .pan-popover-backdrop,.pan-popover{transition:none}
}

/* ── анкета во всплывающем окне ── */
.modal-form{width:min(620px,100%)}
.modal-form form{margin-top:20px}
.fblock{margin-bottom:14px}
.fblock label{display:block;font-family:var(--sans);font-size:12.5px;letter-spacing:.01em;
  color:var(--text2);margin-bottom:6px;font-weight:600}
.modal-form textarea{width:100%;font-family:var(--sans);font-size:16px;color:var(--text);
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  border:0;border-radius:10px;padding:12px 14px;outline:none;resize:vertical;min-height:96px;
  box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12)}
/* в анкете поля без обводок — кольца фокуса не рисуем, заливка остаётся */
.modal-form textarea:focus{box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12)}
.modal-form .field input:focus{box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12)}
.modal-form .combo:focus-within{box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12)}
.modal-form input:focus-visible,.modal-form textarea:focus-visible,
.modal-form button:focus-visible{outline:none}

/* Контакт одной строкой: слева выпадающий выбор мессенджера, вертикальная
   линия, справа сам контакт. Стеклянная заливка — на обёртке, поле внутри
   прозрачное (иначе легло бы стекло на стекло). */
.combo{position:relative;display:flex;align-items:stretch;border-radius:10px;
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12);
  transition:box-shadow .16s ease}
.combo:focus-within{box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12),
  0 0 0 3px var(--focus-ring)}
.combo-pick{position:relative;display:flex;align-items:center;gap:8px;flex:none;
  padding:12px 13px;border:0;background:none;cursor:pointer;color:var(--text);
  font-family:var(--sans);font-size:14px;font-weight:500;border-radius:10px 0 0 10px}
.combo-pick .combo-name{white-space:nowrap}
.combo-pick:not(.chosen) .combo-name{color:var(--text2)}   /* пока не выбран */
.combo-ico{display:flex;align-items:center;flex:none}
.combo-ico:empty{display:none}
.combo-caret{flex:none;color:var(--text2);transition:transform .18s ease}
.combo-pick[aria-expanded="true"] .combo-caret{transform:rotate(180deg)}
/* вертикальная разделительная линия между выбором и полем */
.combo-pick::after{content:'';position:absolute;right:0;top:9px;bottom:9px;width:1px;
  background:var(--line)}
/* поле внутри .combo — не .field input, поэтому свои border/шрифт/отступы:
   без этого браузер рисует собственную рамку на правой половине строки */
.combo input{flex:1;min-width:0;border:0;outline:none;background:none;box-shadow:none;
  border-radius:0 10px 10px 0;padding:12px 14px;
  font-family:var(--sans);font-size:16px;color:var(--text)}
.combo input:focus{box-shadow:none;outline:none}
.combo-menu{position:absolute;top:100%;left:0;margin-top:6px;z-index:30;min-width:190px;
  background:var(--card);border-radius:10px;box-shadow:var(--shadow-hi);
  /* overflow:visible — не hidden: строке с флай-аутом (D-2 · Хора) нужно
     вылезать за пределы меню. overflow-x:visible/overflow-y:hidden не
     годится — по спецификации CSS такая пара «схлопывается» в auto/hidden
     и всё равно обрезает флай-аут по горизонтали. Пункты и так внутри
     padding с своим border-radius, обрезка по факту была декоративной. */
  overflow:visible;padding:4px}
/* меню выбора мессенджера в анкете — открывается ВВЕРХ, не вниз: поле
   часто ближе к низу формы, и на невысоких/вторых экранах меню (top:100%)
   вылезало за нижнюю границу вьюпорта. Только этот combo — общий
   .combo-menu (варги на chart.html и т.д.) не трогаем. */
#afMsgrMenu{top:auto;bottom:100%;margin-top:0;margin-bottom:6px;
  opacity:0;transform:translateY(6px);transition:opacity .16s ease,transform .16s ease}
#afMsgrMenu.open{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){ #afMsgrMenu{transition:none} }
.combo-opt{display:flex;align-items:center;gap:9px;width:100%;text-align:left;cursor:pointer;
  border:0;border-radius:7px;background:none;padding:9px 10px;color:var(--text);
  font-family:var(--sans);font-size:14px}
.combo-opt:hover{background:var(--accent-soft)}
.combo-opt[aria-selected="true"]{font-weight:700}

/* Пункт списка варг со «вторым уровнем» (сейчас — D-2 · Хора, методы расчёта):
   при наведении рядом раскрывается флай-аут с вариантами, основное меню при
   этом остаётся открытым. Стрелка вправо — только индикатор, кликом не
   управляет (открытие — исключительно наведением, как попросили). */
.combo-opt-sub{position:relative}
.combo-opt-label{flex:1;min-width:0}
.combo-opt-arrow{flex:none;color:var(--text2);transform:rotate(-90deg);transition:color .16s ease}
.combo-opt-sub:hover .combo-opt-arrow,.combo-opt-sub:focus-within .combo-opt-arrow{color:var(--accent)}
.combo-flyout{position:absolute;left:100%;top:-4px;margin-left:2px;z-index:31;min-width:170px;
  background:var(--card);border-radius:10px;box-shadow:var(--shadow-hi);padding:4px;
  opacity:0;transform:translateX(-6px);pointer-events:none;
  transition:opacity .16s ease,transform .16s ease}
.combo-opt-sub:hover .combo-flyout,.combo-opt-sub:focus-within .combo-flyout{
  opacity:1;transform:none;pointer-events:auto}
/* список у правого края экрана (карточка планет) — флай-аут раскрывается
   влево, чтобы не уезжать за край, как и само меню (.cp-menu-r) */
.cp-menu-r .combo-flyout{left:auto;right:100%;margin-left:0;margin-right:2px}
.combo-flyout-opt{display:block;width:100%;text-align:left;white-space:nowrap;cursor:pointer;
  border:0;border-radius:7px;background:none;padding:9px 10px;color:var(--text);
  font-family:var(--sans);font-size:14px}
.combo-flyout-opt:hover{background:var(--accent-soft)}
.combo-flyout-opt[aria-selected="true"]{font-weight:700}
@media (prefers-reduced-motion:reduce){
  .combo-flyout{transition:none}
}

/* «Отправить» — по центру; размер кнопки не трогаем */
.form-submit{display:flex;justify-content:center;margin-top:20px}

.modal-form .err{margin:12px 0 0}
.ok{font-family:var(--sans);font-size:14px;color:var(--accent);margin:12px 0 0}

@media (prefers-reduced-motion:reduce){
  .modal,.modal-panel,.card-more{transition:none}
}

/* ── служебные страницы аккаунта (вход/регистрация/сброс пароля/кабинет) ──
   Одна карточка по центру узкой колонки; поля друг под другом, как в анкете
   консультации, но без сетки .form-row — тут только одна колонка. */
.auth-wrap{max-width:420px;margin:0 auto}
/* регистрация — с двумя полями (Имя/Фамилия) в ряд, вдвое шире обычной
   auth-card: на 420px они были тесными, а заголовок почти упирался в край */
.auth-wrap-wide{max-width:840px}
.auth-card{padding:36px 34px}
.auth-card .hint{margin:8px 0 26px;color:var(--text2);font-size:15px}
.auth-form .field{margin-bottom:16px}
.auth-links{margin-top:22px;display:flex;flex-direction:column;gap:10px;
  font-family:var(--sans);font-size:14px;text-align:center}
/* разделитель «или» между входом по паролю и через Google */
.auth-or{display:flex;align-items:center;gap:12px;margin:22px 0;
  font-family:var(--sans);font-size:12.5px;color:var(--text2)}
.auth-or::before,.auth-or::after{content:'';flex:1;height:1px;background:var(--line)}
@media (max-width:480px){
  .auth-card{padding:28px 22px}
}

/* ── личный кабинет: вкладки — тот же вид, что у вкладок страницы расчётов
   (.cp-tab, см. выше «страница «Подробно»»): переиспользуем класс целиком,
   а не копируем стиль, чтобы вид совпадал буквально. Ширина вкладок здесь
   не фиксированная (2–3 шт., не 5), поэтому строка — flex, а не grid. */
/* во всю ширину экрана — тем же приёмом, что body.wide на странице расчётов
   (max-width:none), а не --maxw обычных секций сайта */
.acct-wrap{max-width:none;padding:0 36px}
.acct-tabs{display:flex;gap:4px;width:100%;margin:0;position:relative;z-index:2}
.acct-tabs .cp-tab{flex:1}
.acct-panes{overflow:clip;overflow-clip-margin:50px}
.acct-panel{padding:44px 48px;margin-top:0;border-radius:0 0 16px 16px;transition:border-radius .28s ease}
.acct-panel.r-tl{border-top-left-radius:16px}
.acct-panel.r-tr{border-top-right-radius:16px}
@media (max-width:480px){
  .acct-panel{padding:24px 20px}
}
/* появление вкладки при переключении — тот же keyframe, что у уровней даш
   (см. «@keyframes cp-in» выше); высоту .acct-panes анимирует JS отдельно
   (initTabs), так же, как .cp-panes на странице расчётов. */
.acct-pane-enter{animation:cp-in .22s ease both}
@media (prefers-reduced-motion:reduce){
  .acct-pane-enter{animation:none}
}

/* строка «параметр + действие» (пароль, подписка) */
.acct-row{display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap}
.acct-row-title{font-family:var(--sans);font-weight:700;font-size:15px;color:var(--text)}
.acct-row-sub{font-family:var(--sans);font-size:13.5px;color:var(--text2);margin-top:4px}
/* «Подписка активна» / дата — справа в строке подписки, там же, где кнопка
   «Оформить подписку» когда доступа нет (#acctSubSubmitRow и #acctSubActiveBox
   взаимоисключающие, показывается только один). Не приглушённым цветом, как
   обычные подписи (муted var(--text2)) — активная подписка не второстепенная
   информация. text-align:right — блок стоит на месте кнопки, тот была бы
   прижата к правому краю, текст выравниваем так же. */
#acctSubActiveBox{text-align:right}
.acct-row-sub.acct-sub-active{color:var(--text);margin-top:0}
#acctSubActiveDate{margin-top:2px}
/* галочка — тот же приём, что у #kjaModalPriceNote::before на study.html;
   отступ до текста — margin-right:1ch (ширина одного символа). Только у
   первой строки («Подписка активна»), не у даты под ней. */
.acct-sub-check::before{content:'✓';color:var(--accent);font-weight:700;margin-right:1ch}
/* шрифт крупнее обычных мелких подписей — обеим строкам блока, не всему
   .acct-row-sub (остальные подписи в «Настройках» не трогаем) */
#acctSubActiveLine,#acctSubActiveDate{font-size:15px}
.acct-row-sub.ok{margin:4px 0 0}   /* переопределяет отступ базового .ok */

/* «$» в строке цены анкеты на обучение (afPriceLine, см. ui.js) — не
   переключатель, а «нажми и держи»: жирнее и крупнее текста строки, как
   заглавная буква в ней, без подчёркивания (иначе читалось бы как обычная
   текстовая ссылка-переключатель, а это разовая подсказка на время нажатия). */
.ccy-hold-btn{display:inline-block;margin-left:6px;font-family:var(--sans);
  font-weight:800;font-size:17px;line-height:1;color:inherit;border:0;background:none;
  padding:0;cursor:pointer;-webkit-user-select:none;user-select:none;
  vertical-align:-1px;transition:color .12s ease,transform .12s ease}
.ccy-hold-btn:hover{color:var(--accent)}
.ccy-hold-btn:active{color:var(--accent);transform:scale(1.1)}
@media (prefers-reduced-motion:reduce){ .ccy-hold-btn{transition:none} }
.acct-form{max-width:640px}
.acct-form .field{margin-bottom:16px}

/* «Настройки»: личные данные слева, подписка справа — сворачивается в одну
   колонку на узких экранах тем же брейкпоинтом, что и грид-блоки лендинга */
.acct-set-grid{display:grid;grid-template-columns:1fr 1fr;gap:48px;align-items:stretch;position:relative}
.acct-set-grid::before{content:'';position:absolute;top:0;bottom:0;left:50%;width:1px;
  background:var(--line);transform:translateX(-50%)}
.acct-sub-col{display:flex;flex-direction:column}
/* «Подписка»/«Пароль» — две равные половины на всю высоту поля (см.
   align-items:stretch выше), каждая центрирует своё содержимое по высоте —
   так разделительная линия между ними всегда ровно посередине поля, какой
   бы высоты ни была левая колонка (форма личных данных). */
.acct-sub-half{flex:1;display:flex;flex-direction:column;justify-content:center}
@media (max-width:860px){
  .acct-set-grid{grid-template-columns:1fr;gap:34px}
  .acct-set-grid::before{display:none}
}

/* «Статистика» → место на диске (админка, Фаза 7) — та же файловая система,
   что у самого сервера и Postgres (свой VPS). Красный — когда занято ≥90%,
   сама граница ставится в JS (см. loadStats() в account.html). */
.acct-disk-bar{height:8px;max-width:420px;margin-top:8px;border-radius:4px;
  background:var(--line);overflow:hidden}
.acct-disk-bar-fill{height:100%;border-radius:4px;background:var(--accent);
  transition:width .4s ease}
.acct-disk-bar-fill.crit{background:var(--err)}

/* «Статистика» (админка, Фаза 7) — те же 2 колонки, что «Настройки» */
.acct-stats-cols{display:grid;grid-template-columns:1fr 1fr;gap:48px;align-items:start}
@media (max-width:860px){
  .acct-stats-cols{grid-template-columns:1fr;gap:34px}
}
/* переключатель периода у «Популярных страниц» — сутки/30 дней (см.
   loadStats/switchStatsRange в account.html); заливка+наведение вместо
   рамок, как и везде на сайте (см. память "без обводок на карточках") */
.stats-range-toggle{display:flex;gap:2px}
.stats-range-btn{font-family:var(--sans);font-size:12px;font-weight:500;color:var(--text2);
  cursor:pointer;padding:4px 9px;border:0;border-radius:8px;background:transparent;
  transition:background .18s ease,color .18s ease}
.stats-range-btn:hover{color:var(--text);background:color-mix(in srgb, var(--text) 8%, var(--card) 92%)}
.stats-range-btn.on{color:var(--text);font-weight:700;background:var(--sub-active)}

/* заглушка вкладки «Обучение» — по центру, мельче обычного .lead */
.acct-empty{text-align:center;padding:20px 0}
.acct-empty p{color:var(--text2);font-size:15px;line-height:1.5;max-width:440px;margin:0 auto 30px}


/* таблица «Пользователи» (вкладка «Админка») — прокрутка вбок на узких экранах,
   а не сжатие колонок и не горизонтальный скролл всей страницы */
.acct-table-wrap{overflow-x:auto;margin-top:18px}
.acct-table{width:100%;border-collapse:collapse;font-family:var(--sans);font-size:14px}
.acct-table td:last-child,.acct-table th:last-child{white-space:nowrap;text-align:right}
/* 28px — тот же запас, что у других соседних растущих при наведении кнопок
   на сайте (см. .cp-acts): кнопка увеличивается на 20%, ~10px на сторону,
   8px не хватало и они налезали друг на друга. */
.acct-table td:last-child button+button{margin-left:28px}
/* «Заметка» — шире остальных, тянет строку и прижимает кнопки к правому краю */
.acct-table td:nth-child(5),.acct-table th:nth-child(5){min-width:220px}
.acct-table th{text-align:left;font-weight:700;color:var(--text2);font-size:12px;
  padding:9px 12px;border-bottom:1px solid var(--line)}
.acct-table td{padding:9px 12px;border-bottom:1px solid var(--line);color:var(--text)}
.acct-table tr:last-child td{border-bottom:0}
.acct-table .active{color:var(--ok)}
.acct-table .expired{color:var(--text2)}
.acct-table-edit td{background:var(--accent-soft)}
.acct-table-edit .field{margin:0;display:inline-block;width:auto}
.acct-table-edit input{font-family:var(--sans);font-size:14px;color:var(--text);
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));border:0;border-radius:8px;
  padding:8px 10px;outline:none;box-shadow:inset 0 1px 0 var(--glass-hi),0 3px 8px rgba(60,40,30,.10)}
.acct-table-edit input+input,.acct-table-edit button{margin-left:8px}
.acct-admin-search{display:flex;gap:10px;align-items:end;margin-top:16px;flex-wrap:wrap}
.acct-admin-search .field{flex:1;min-width:180px;margin:0}
/* крестик сброса внутри поля поиска — виден только когда есть текст (.show) */
.field-search input{padding-right:34px}
.field-x{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:26px;height:26px;
  border:0;border-radius:999px;background:none;color:var(--text2);font-size:17px;line-height:1;
  cursor:pointer;display:none;transition:color .18s ease,background .18s ease}
.field-x.show{display:block}
.field-x:hover{color:var(--accent);background:var(--accent-soft)}
/* подвкладки внутри админки («Пользователи»/«Заявки»/«Статистика») —
   переиспользуем .cp-subtabs/.cp-subtab/.cp-subwrap целиком (см. страницу
   расчётов), три колонки вместо шести по умолчанию — см. #acctAdminSubtabs
   рядом с #cpVSubtabs/#cpTSubtabs ниже по файлу. */

/* строки таблицы — плавно, а не рывком: обновление поиска и раскрытие/
   закрытие строки редактирования. transform на <tr> ненадёжен в разных
   браузерах, поэтому только прозрачность. */
.acct-table tbody tr{animation:acct-row-in .18s ease both}
.acct-table-edit.acct-row-leave{animation:acct-row-out .18s ease both}
@keyframes acct-row-in{from{opacity:0}to{opacity:1}}
@keyframes acct-row-out{from{opacity:1}to{opacity:0}}
@media (prefers-reduced-motion:reduce){
  .acct-table tbody tr,.acct-table-edit.acct-row-leave{animation:none}
}

/* поле email в настройках — только чтение, приглушаем визуально */
.field input:disabled{opacity:.6;cursor:not-allowed}

/* ── страница «Подробно»: две карты в строку, под ними таблицы ── */
/* Страница расчётов шире обычной (иначе три карты тесно), но к краю не жмётся:
   36px у всего — шапки, заголовка, полей, карт, таблиц, футера. Одна сетка. */
body.wide .wrap{max-width:none;padding:0 36px}
.chart-page{padding-top:44px}

/* ── Только десктоп ──
   Ниже 1024px страница расчётов не показывается вовсе: вместо неё объяснение.
   Порог — по вёрстке: три колонки по 511px плюс поля живут от ~1600px, при
   1024px уже начинается компромисс, а компромиссов тут решили не делать. */
.cp-desktop-only{display:none;padding:80px 0}
.cp-only-box{max-width:560px;margin:0 auto;text-align:center}
.cp-only-box h1{font-size:clamp(24px,6vw,32px);margin:0 0 18px}
.cp-only-box p{color:var(--text2);margin:0 0 14px}
.cp-only-sub{color:var(--text)}
.cp-only-box .btn{margin-top:14px}
/* обе кнопки «десктоп-только» экрана (На главную / Google Play) — в ряд,
   перенос на 2 строки на совсем узких экранах; без собственных отступов
   кнопок — только общий у обёртки, иначе с .cp-only-box .btn{margin-top:14px}
   и .gp-btn{margin-top:22px} получалось бы двойное расстояние. */
.cp-only-actions{display:flex;align-items:center;justify-content:center;
  gap:16px;flex-wrap:wrap;margin-top:14px}
.cp-only-actions .btn,.cp-only-actions .gp-btn{margin-top:0}
@media (max-width:1023px){
  .cp-desktop-only{display:block}
  .chart-page{display:none}
}
/* Шапка формы — выше вкладок (.cp-tabs z:2) и шапки панчанги (rc-bar z:20),
   иначе выпадающий список городов (.sug) проваливается под них. Но НИЖЕ шапки
   сайта (.site-head z:50), иначе перекрывает попап выбора языка. */
.cp-head{position:relative;z-index:40}
/* заголовок — с двойного абзаца: 36px сетки + ещё 36px.
   Размер увеличен: строчные буквы серифа (var(--serif), у него заметно
   меньшая высота строчных относительно кегля, чем у sans в кнопках рядом)
   на прежнем clamp(26,3.4vw,38) выглядели мельче текста «Мои карты» и
   других .btn (13px, но с высокой строчной у sans) — теперь высота
   строчных должна совпадать. */
.cp-head h1{font-size:clamp(32px,4.2vw,46px);padding-left:36px;margin:0}
/* строка «имя карты»: слева заголовок (меняется на имя сохранённой карты) +
   «Мои карты» + «Импорт», справа «Поделиться». Между заголовком и кнопками —
   зазор шире обычного (явно отделяет имя от управления картами); между
   самими кнопками — обычный. */
.cp-title-row{display:flex;align-items:center;justify-content:space-between;gap:20px}
/* align-items:baseline, не center — низ строчных букв заголовка и низ
   текста в кнопках («Мои карты»/«Импорт») должны совпадать, а не просто
   центры боксов (у них разная высота — крупный serif-заголовок и невысокие
   .btn-таблетки). */
.cp-title-left{display:flex;align-items:baseline;gap:16px;min-width:0}
.cp-title-left h1{white-space:nowrap;margin-right:24px}   /* имя карты — целиком, без обрезания */
.cp-mychart{position:relative}

/* «Мои карты»: текст + шеврон. Шеврон — абсолютным позиционированием, а не
   в общем flex-потоке кнопки: у .hb flex-direction:column (стек ради
   невидимой жирной копии текста), из-за него обычный соседний элемент лёг
   бы ПОД текст, а не рядом. */
.cp-mychart-trigger{position:relative;padding-right:34px}
.cp-mychart-trigger .mc-chevron{position:absolute;right:14px;top:50%;
  transform:translateY(-50%);pointer-events:none;transition:transform .18s ease}
.cp-mychart-trigger[aria-expanded="true"] .mc-chevron{transform:translateY(-50%) rotate(180deg)}

/* «Импорт»: значок + текст в ряд. «Жирный без сдвига» — на самом тексте
   (span.hb внутри), не на кнопке целиком — по той же причине, что у шеврона. */
/* .hb несёт не только невидимую жирную копию текста, но и transition для
   transform/box-shadow у .btn:hover — а он теперь на span.hb ВНУТРИ кнопки,
   не на самой кнопке. Без него рост 1.2x на наведении скакал без анимации. */
.cp-icon-btn{display:inline-flex;align-items:center;gap:7px;
  transition:transform .18s ease,box-shadow .18s ease}
.cp-icon-btn svg{flex:none}
@media (prefers-reduced-motion:reduce){
  .cp-icon-btn{transition:none}
}

/* «Мои карты» / «Поделиться» / «Сбросить»: та же кнопка-«.hb внутри», что у
   «Импорт» выше (см. комментарий там), но зазор между значком и текстом —
   ровно один символ (1ch), а не общий gap .cp-icon-btn — поэтому свой класс,
   а не переиспользование .cp-icon-btn (тот не трогаем, им пользуется «Импорт»). */
.cp-lead-btn{display:inline-flex;align-items:center;
  transition:transform .18s ease,box-shadow .18s ease}
.cp-lead-ic{flex:none;margin-right:1ch}
@media (prefers-reduced-motion:reduce){
  .cp-lead-btn{transition:none}
}
/* тот же значок + 1ch слева от текста — у пунктов списка «Поделиться»
   («Ссылка», «Печать»); эти — не .btn, поэтому просто строка, без scale-transition. */
.share-fmt-lead{display:inline-flex;align-items:center}

/* ── «Мои карты» / «Поделиться»: поповер — тот же приём, что .acct-drop
   (openDrop/closeDrop из auth.js: fade+slide, без своей анимации). «Мои
   карты» всегда висит под своей кнопкой (position:absolute); формат
   экспорта (.share-drop) нужен и под кнопкой «Поделиться» в шапке, и у
   каждой карты в списке «Мои карты» — JS ставит его координаты сам
   (position:fixed, getBoundingClientRect от нажатой кнопки). */
.mychart-drop{position:absolute;top:100%;left:0;margin-top:12px;
  background:var(--card);border-radius:14px;box-shadow:var(--shadow-hi);
  z-index:40;opacity:0;transform:translateY(-6px) scale(.98);pointer-events:none;
  transition:opacity .18s ease,transform .18s ease}
.mychart-drop.open{opacity:1;transform:none;pointer-events:auto}
.share-drop{position:fixed;top:0;left:0;margin-top:0;
  background:var(--card);border-radius:14px;box-shadow:var(--shadow-hi);
  z-index:50;opacity:0;transform:translateY(-6px) scale(.98);pointer-events:none;
  transition:opacity .18s ease,transform .18s ease;min-width:230px;padding:6px}
.share-drop.open{opacity:1;transform:none;pointer-events:auto}
.share-fmt{display:block;width:100%;text-align:left;cursor:pointer;border:0;border-radius:9px;
  background:none;padding:11px 16px;color:var(--text);font-family:var(--sans);font-size:14.5px}
.share-fmt:hover{background:var(--accent-soft)}
/* «Печать» — пункт меню «Поделиться», раскрывающий аккордеоном список
   документов (5 шт., см. runPrint в chart-page.js) прямо внутри того же
   попапа — не отдельным полем. Стрелка справа плавно поворачивается вниз
   (тот же приём, что у .combo-caret, только показывает не список, а то,
   что список ниже раскрылся, а не появился отдельно). */
.share-sep{height:1px;margin:6px 10px;background:var(--line)}
.share-fmt-more{display:flex;align-items:center;justify-content:space-between;gap:10px}
.share-fmt-more-chevron{flex:none;color:var(--text2);transition:transform .25s ease}
.share-fmt-more[aria-expanded="true"] .share-fmt-more-chevron{transform:rotate(90deg)}
/* Раскрытие — grid-template-rows 0fr→1fr (а не max-height): растягивается
   ровно под фактическую высоту содержимого, без подбора константы на глаз. */
.share-sub-wrap{display:grid;grid-template-rows:0fr;transition:grid-template-rows .28s ease}
.share-sub-wrap.open{grid-template-rows:1fr}
.share-sub{overflow:hidden;min-height:0}
.share-fmt-sub{padding-left:32px;position:relative}
.share-fmt-sub::before{content:'';position:absolute;left:16px;top:50%;
  width:4px;height:4px;border-radius:50%;background:var(--text2);transform:translateY(-50%)}

/* «Мои карты»: поиск + фильтр избранного сверху, список карт, экспорт всех
   карт снизу. Ширина — вдвое больше обычного попапа (карты длиннее меню). */
.mychart-drop{width:680px;padding:14px;max-height:min(70vh,560px);display:flex;flex-direction:column}
.mc-search-row{display:flex;align-items:center;gap:8px;flex:none}
.mc-search-row input{flex:1;min-width:0;font-family:var(--sans);font-size:14px;color:var(--text);
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));border:0;border-radius:10px;
  padding:9px 12px;outline:none;box-shadow:inset 0 1px 0 var(--glass-hi),0 3px 10px rgba(60,40,30,.10)}
.mc-search-row input:focus{box-shadow:inset 0 1px 0 var(--glass-hi),0 3px 10px rgba(60,40,30,.10),
  0 0 0 3px var(--focus-ring)}
.mc-favfilter{flex:none;width:34px;height:34px;display:flex;align-items:center;
  justify-content:center;border:0;border-radius:9px;background:none;color:var(--text2);cursor:pointer;
  transition:color .16s ease,background .16s ease}
.mc-favfilter:hover{background:var(--accent-soft);color:var(--text)}
.mc-favfilter svg{fill:none;stroke:currentColor;stroke-width:1.8}
.mc-favfilter.on{color:var(--accent)}
.mc-favfilter.on svg{fill:currentColor}

.mc-list{overflow-y:auto;margin:12px -6px 0;padding:0 6px;flex:1;min-height:40px}
.mc-empty{padding:22px 4px;text-align:center;color:var(--text2);font-size:13.5px}
.mc-row{display:flex;align-items:center;gap:8px;border-radius:10px;padding:8px;cursor:pointer;
  transition:background .14s ease}
.mc-row:hover{background:var(--accent-soft)}
.mc-row-main{flex:1;min-width:0}
.mc-name{font-family:var(--sans);font-size:14px;font-weight:600;color:var(--text);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mc-sub{font-family:var(--sans);font-size:12px;color:var(--text2);margin-top:1px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mc-fav,.mc-ico{flex:none;width:28px;height:28px;display:flex;align-items:center;justify-content:center;
  border:0;background:none;color:var(--text2);cursor:pointer;border-radius:8px;
  transition:color .14s ease,background .14s ease}
.mc-fav:hover,.mc-ico:hover{background:var(--card);color:var(--text)}
.mc-fav svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.8}
.mc-fav.on{color:var(--accent)}
.mc-fav.on svg{fill:currentColor}
.mc-ico svg{width:15px;height:15px}
.mc-ico.mc-del:hover{color:#c0392b}
.mc-row-acts{display:flex;align-items:center;gap:2px;flex:none;opacity:0;transition:opacity .14s ease}
.mc-row:hover .mc-row-acts,.mc-row:focus-within .mc-row-acts{opacity:1}

.mc-export-all{flex:none;margin-top:10px;padding-top:12px;border-top:1px solid var(--line);
  border-left:0;border-right:0;border-bottom:0;background:none;color:var(--accent);cursor:pointer;
  font-family:var(--sans);font-size:13.5px;font-weight:600;text-align:center}
.mc-export-all:hover{opacity:.75}

@media (prefers-reduced-motion:reduce){
  .mychart-drop,.share-drop,.share-sub-wrap,.share-fmt-more-chevron{transition:none}
}

/* поля ввода — одной строкой; кнопки по низу, вровень с полями */
.cp-form{display:flex;align-items:end;gap:14px;flex-wrap:wrap;margin-top:24px}
.cp-form .field{flex:0 1 190px}
.cp-form .cp-city{flex:0 1 374px}   /* адрес со страной длинный — поле заметно шире прочих */
.cp-form .cp-geo{flex:0 1 118px}
.cp-form .cp-tz{flex:0 1 120px}
/* в окне сохранения город вдвое шире пояса */
.cps-city-row{grid-template-columns:2fr 1fr}
/* Зазоры с запасом на наведение: кнопка растёт на 20%, то есть по ~12px в каждую
   сторону. С прежними 10px соседей она перекрывала. */
.cp-acts{display:flex;align-items:center;gap:28px;height:43px;margin-left:14px}
.cp-acts-right{margin-left:auto}   /* «Сбросить» — в правый угол строки */
.cp-loading{margin-top:34px;color:var(--text2)}
/* Раскрытие/сворачивание всей страницы расчёта: тот же приём, что у координат
   на главной — grid-template-rows 0fr→1fr. Отступов на .cp-body-inner быть не
   должно: 0fr даёт треку минимум по содержимому, и padding не даст ей схлопнуться. */
.cp-body{display:grid;grid-template-rows:0fr;opacity:0;
  transition:grid-template-rows .42s ease,opacity .3s ease}
.cp-body.open{grid-template-rows:1fr;opacity:1}
/* overflow:clip (не hidden) — так же обрезает во время анимации высоты, но НЕ
   создаёт scroll-container, из-за которого ломается position:sticky у шапки
   времени в ректификации. */
.cp-body-inner{overflow:clip;overflow-clip-margin:50px;min-height:0;visibility:hidden;transition:visibility 0s linear .42s}
.cp-body.open .cp-body-inner{visibility:visible;transition-delay:0s}
@media (prefers-reduced-motion:reduce){
  .cp-body{transition:none}
}

/* ── вкладки страницы расчётов ──
   Пять равных закладок во всю ширину поля. У каждой скруглены оба верхних угла.
   Без обводок: неактивные различимы заливкой, активная — цвета поля и налезает
   на него на 1px, поэтому читается как продолжение листа. */
.cp-tabs{display:grid;grid-template-columns:repeat(5,1fr);gap:4px;width:100%;
  margin:30px 0 0;position:relative;z-index:2}
.cp-tab{display:inline-flex;align-items:center;justify-content:center;gap:7px;
  font-family:var(--sans);font-size:14px;font-weight:500;color:var(--text2);
  cursor:pointer;padding:12px 8px;margin-bottom:-1px;position:relative;
  border:0;border-radius:12px 12px 0 0;
  background:color-mix(in srgb, var(--card) 40%, transparent);
  transition:background .18s ease,color .18s ease,border-radius .28s ease}
/* значок закладки — тот же приём, что .cp-chart-ic (значки «чья карта»
   Джанмы/Варшапхалы/Транзита), но чуть мельче под размер вкладки */
.cp-tab-ic{width:16px;height:16px;flex:0 0 auto;display:block}
.cp-tab-ic svg{width:100%;height:100%;display:block}
.cp-tab:hover{color:var(--text);background:color-mix(in srgb, var(--card) 70%, transparent)}
.cp-tab.active{color:var(--text);font-weight:700;background:var(--card)}
/* Стык активной закладки с полем — вогнутыми скруглениями, без прямых углов.
   Квадратик цвета поля по бокам, из которого маской вырезана четверть круга:
   получается «перетекание» закладки в лист, как во вкладках браузера. */
.cp-tab.active::before,
.cp-tab.active::after{
  content:'';position:absolute;bottom:0;width:12px;height:12px;
  background:var(--card);pointer-events:none}
.cp-tab.active::before{left:-12px;
  -webkit-mask-image:radial-gradient(circle 12px at 0 0, transparent 12px, #000 12.5px);
  mask-image:radial-gradient(circle 12px at 0 0, transparent 12px, #000 12.5px)}
.cp-tab.active::after{right:-12px;
  -webkit-mask-image:radial-gradient(circle 12px at 100% 0, transparent 12px, #000 12.5px);
  mask-image:radial-gradient(circle 12px at 100% 0, transparent 12px, #000 12.5px)}
/* У крайних закладок снаружи поля нет — «перетёк» висел бы в пустоте.
   Гасим внешний угол: у первой — левый, у последней — правый. */
.cp-tab.active:first-child::before{content:none}
.cp-tab.active:last-child::after{content:none}
/* Поле — продолжение закладок. Верхние углы прямые только там, где к полю
   примыкает активная закладка; с других сторон скругляются (классы ставит JS). */
.cp-pane .cp-charts{margin-top:0;border-radius:0 0 16px 16px;
  transition:border-radius .28s ease}   /* слияние с закладкой — плавное */
.cp-pane .cp-charts.r-tl{border-top-left-radius:16px}
.cp-pane .cp-charts.r-tr{border-top-right-radius:16px}
/* крайняя неактивная закладка над скруглённым углом поля — скругляем и её низ */
.cp-tab.r-bl{border-bottom-left-radius:12px}
.cp-tab.r-br{border-bottom-right-radius:12px}
/* clip, не hidden — не ломает sticky; overflow-clip-margin, чтобы не срезало
   тени карточек у краёв (иначе на уголках артефакты) */
.cp-panes{overflow:clip;overflow-clip-margin:50px}
.cp-soon{margin:0;color:var(--text2);font-family:'Bitter';font-style:italic}

/* ── вкладки без входа/подписки: доступна только «Джанма» ──
   Приглушаем заливкой (не трогаем текст — читаемость важнее), курсор
   показывает, что клик не переключит вкладку. Подсказка — тот же .acct-drop,
   что меню аккаунта в шапке (тот же фон/тень/анимация, только своя позиция). */
.cp-tab.locked{opacity:.55;cursor:not-allowed}
.cp-gate-pop{position:absolute;top:100%;left:0;right:auto;min-width:260px;padding:14px 16px 16px}
.cp-gate-pop p{margin:0 0 10px;color:var(--text2);font-size:14px;line-height:1.45;font-family:var(--sans)}
.cp-gate-pop a{color:var(--accent);font-weight:600}
/* «Сохранить»/«Мои карты» живут в разных строках шапки — та же подсказка,
   но координаты ставит JS через getBoundingClientRect (viewport, не родитель) */
.cp-gate-pop-fixed{position:fixed;top:0;left:0;margin-top:0}
/* выбор «Редактировать»/«Сохранить как новую карту» — обычный текст сайта
   (тот же шрифт, что описание в «Обучении»: var(--serif), не служебный
   var(--sans) остальных поповеров), т.к. это фраза-предложение, а не UI-ярлык */
#cpSaveChoicePop p{font-family:var(--serif);font-size:14px;line-height:1.45;color:var(--text)}
#cpSaveChoicePop button{font-family:var(--serif);font-size:16px}
#cpSaveChoicePop #cpSaveChoiceDone{color:var(--text2)}
/* разделитель после текста-вопроса, перед кнопками выбора — тот же приём,
   что .contacts-sep («Контакты»/оферта): заливка-полоска, не рамка */
#cpSaveChoicePop .cp-save-choice-sep{height:1px;margin:2px 0 8px;background:var(--line)}
/* ── «Настройки» ──
   Два поля рядом, как поля ректификации: подпись НАД карточкой (rc-fh), сама
   карточка светлее поля (rc-fld2). Поля не равны — «Отображение» уже, у
   «Расчётов» больше строк. Различаем заливкой и разделителями, не рамками. */
.cp-set2{display:grid;grid-template-columns:0.82fr 1fr;gap:34px;align-items:start;
  padding:8px 2px 6px}
.cp-setfield{min-width:0}
.cp-setcard{padding:20px 22px}

/* Подпись параметра — жирным (Inter 700), как просили. Над самим контролом. */
.cp-set-sub{font-family:var(--sans);font-size:15px;font-weight:700;color:var(--text);
  margin:0 0 10px}
.cp-set-sub-c{text-align:center}

/* «Отображение»: два ряда половин (Стиль карты/Дополнительно, Джанма кундали/
   Чара-караки). Вертикаль — сквозная на оба ряда разом, тем же приёмом, что
   у «Расчётов» ниже (.cp-set-vrule поверх, а не по сетке в каждом ряду) —
   иначе она рвалась бы на горизонтали между рядами. */
.cp-set-display{position:relative}
.cp-set-split{display:grid;grid-template-columns:1fr 1fr;column-gap:45px}
.cp-set-half{min-width:0}
/* «Расчёты»: три уровня по два контрола. Разделитель между колонками —
   единый, поэтому его рисует не сетка, а .cp-set-vrule поверх. */
.cp-set-grid{display:grid;grid-template-columns:1fr 1fr;column-gap:48px;align-items:start}
.cp-set-cell{min-width:0}
.cp-set-cell-full{grid-column:1/-1}

/* Единая вертикаль — общая для «Отображения» и «Расчётов»: тянется через все
   уровни, не прерываясь на горизонталях между ними. У «Расчётов»
   padding-bottom подводит её ровно к линии над «Продолжительностью года». */
.cp-set-calc{position:relative;padding-bottom:18px}
.cp-set-vrule{position:absolute;left:50%;top:0;bottom:0;width:1px;
  transform:translateX(-50%);background:var(--line)}
/* Горизонтальный разделитель между блоками. */
.cp-set-hline{height:1px;background:var(--line);margin:18px 10px}
/* Линия над «Продолжительностью года» — вплотную под уровнями, в неё входит
   вертикаль (у .cp-set-calc снизу ровно её отступ). */
.cp-set-hline-year{margin-top:0}

/* Список вариантов с квадратиком-галочкой. Различаем заливкой при наведении,
   отметку несёт стеклянный квадратик справа. Сами варианты — с отступом от
   уровня названия параметра (название на месте, параметры сдвинуты внутрь);
   справа тоже отступ, чтобы квадратики не липли к краю/разделителю. */
.cp-opts{display:flex;flex-direction:column;gap:4px;padding-left:22px;padding-right:22px}
.cp-opt{display:flex;align-items:center;justify-content:space-between;gap:14px;
  width:100%;cursor:pointer;border:0;border-radius:9px;padding:8px 10px;background:none;
  font-family:var(--sans);font-size:14px;font-weight:700;color:var(--text2);
  transition:color .18s ease,background .18s ease}
.cp-opt:hover{color:var(--text);background:var(--accent-soft)}
.cp-opt.on{color:var(--text)}
.cp-opt-nm{text-align:left}
/* стиль карты: миниатюра стиля перед названием */
.cp-opt-l{display:flex;align-items:center;gap:10px;min-width:0}
.cp-opt-th{display:inline-flex;flex:none;width:19px;height:19px;color:var(--text3)}
.cp-opt-th svg{width:100%;height:100%;fill:none;stroke:currentColor;stroke-width:1;
  stroke-linejoin:round;stroke-linecap:round}
.cp-opt.on .cp-opt-th{color:var(--accent)}
/* стеклянный квадратик со скруглениями — под галочку */
.cp-opt-box{position:relative;flex:none;width:20px;height:20px;border-radius:6px;
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  box-shadow:inset 0 1px 0 var(--glass-hi),0 2px 5px rgba(60,40,30,.12)}
.cp-opt-box::after{content:'';position:absolute;left:7px;top:3px;width:5px;height:10px;
  border:solid var(--accent);border-width:0 2px 2px 0;transform:rotate(45deg);
  opacity:0;transition:opacity .15s ease}
.cp-opt.on .cp-opt-box::after{opacity:1}
@media (prefers-reduced-motion:reduce){ .cp-opt,.cp-opt-box::after{transition:none} }

/* Чара-караки — название и сегмент в одну строку; сама половина (см. .cp-set-half-karaka)
   центрирует эту строку по высоте, чтобы не липла к верху рядом с более высокой
   колонкой «Джанма кундали». */
.cp-set-karaka{display:flex;flex-direction:row;align-items:center;justify-content:center;gap:14px}
.cp-set-karaka .cp-set-sub{margin:0}
.cp-set-half-karaka{display:flex;align-items:center;justify-content:center}
.cp-seg{display:inline-flex;background:var(--accent-soft);border-radius:999px;padding:3px}
.cp-seg-btn{font-family:var(--sans);font-size:14px;font-weight:700;color:var(--text2);cursor:pointer;
  border:0;border-radius:999px;padding:6px 16px;background:none;transition:color .18s ease,background .18s ease}
.cp-seg-btn:hover{color:var(--text)}
.cp-seg-btn.on{color:var(--text);background:var(--card);box-shadow:0 1px 3px rgba(60,40,30,.12)}

/* ── Джанма: карты — постоянно на месте; ниже, под «Больше/Меньше карт», —
   переключатель (та же логика цвета, что у больших вкладок: неактивная
   различима заливкой чуть светлее поля, активная — цвета самого поля) на
   пять остальных содержимых — планеты, периоды, силы, сахамы, божества. */
/* Тот же язык, что у больших вкладок (Джанма/Варшапхала/…) — неактивная
   закладка светлее поля, активная сливается с ним цветом. Без «перетекания»
   в скруглённый угол поля (как у больших вкладок): здесь закладки стоят
   внутри поля, а не на стыке с ним, поэтому вырезы-четвертинки не нужны. */
.cp-subtabs{display:grid;grid-template-columns:repeat(6,1fr);gap:4px;
  margin:26px 0 0;position:relative;z-index:2}
.cp-subtab{font-family:var(--sans);font-size:12px;font-weight:500;color:var(--text2);
  cursor:pointer;padding:11px 5px;margin-bottom:-1px;position:relative;
  border:0;border-radius:10px 10px 0 0;
  /* Светлая тема: card/card-hi слишком близки (см. :root) — на них color-mix
     между собой не даёт видимого контраста, поэтому темним примесью текста.
     Тёмная тема ниже возвращает исходную формулу (card-hi/card) — не трогаем. */
  background:color-mix(in srgb, var(--text) 3%, var(--card) 97%);
  transition:background .18s ease,color .18s ease,border-radius .28s ease}
.cp-subtab:hover{color:var(--text);background:color-mix(in srgb, var(--text) 8%, var(--card) 92%)}
/* Активная закладка и поле-обёртка ниже — общий тон --sub-active (перетекание
   держится на точном совпадении цвета этих двух мест + вырезов-уголков).
   Светлая тема: чистый --card-hi почти не отличим от --card (см. :root) —
   темним примесью текста. Тёмная тема возвращает --card-hi как есть — вопрос
   был только про светлую. */
.cp-subtab.on{color:var(--text);font-weight:700;background:var(--sub-active)}
/* :not(.on) — иначе эта запись (специфичнее .cp-subtab.on из-за атрибута
   data-theme) перебивала бы фон активной закладки и в тёмной теме тоже. */
:root[data-theme="dark"] .cp-subtab:not(.on){background:color-mix(in srgb, var(--card-hi) 45%, var(--card) 55%)}
:root[data-theme="dark"] .cp-subtab:not(.on):hover{background:color-mix(in srgb, var(--card-hi) 75%, var(--card) 25%)}
/* Поле внутри поля: закладки перетекают в #cpSubWrap (--sub-active), не в
   голый фон #cpCharts (--card) — та же механика вырезов-четвертинок и
   адаптивных скруглений, что у больших вкладок и .cp-charts (roundField/
   r-tl/r-tr), только r-bl/r-br здесь не нужны отдельным классом — задаются
   вместе с r-tl/r-tr через JS (roundSubField), см. initSubtabs. */
.cp-subtab.on::before,
.cp-subtab.on::after{
  content:'';position:absolute;bottom:0;width:10px;height:10px;
  background:var(--sub-active);pointer-events:none}
.cp-subtab.on::before{left:-10px;
  -webkit-mask-image:radial-gradient(circle 10px at 0 0, transparent 10px, #000 10.5px);
  mask-image:radial-gradient(circle 10px at 0 0, transparent 10px, #000 10.5px)}
.cp-subtab.on::after{right:-10px;
  -webkit-mask-image:radial-gradient(circle 10px at 100% 0, transparent 10px, #000 10.5px);
  mask-image:radial-gradient(circle 10px at 100% 0, transparent 10px, #000 10.5px)}
.cp-subtab.on:first-child::before{content:none}
.cp-subtab.on:last-child::after{content:none}
.cp-subtab.r-bl{border-bottom-left-radius:10px}
.cp-subtab.r-br{border-bottom-right-radius:10px}
/* платные подвкладки Джанмы (Бала/Сахамы/Божества/Тара-бала) — та же приглушённая
   заливка, что у платных ГЛАВНЫХ вкладок (.cp-tab.locked), см. lockJanmaExtras */
.cp-subtab.locked{opacity:.55;cursor:not-allowed}
/* Обёртка-поле: та же порода, что .cp-pane .cp-charts (низ всегда скруглён,
   верх — там, где не примыкает активная закладка). Карточки таблиц внутри
   поднимаем на ступень (--card-hi2), иначе слились бы с этим полем. */
.cp-subwrap{background:var(--sub-active);border-radius:0 0 14px 14px;padding:22px;
  transition:border-radius .28s ease}
.cp-subwrap.r-tl{border-top-left-radius:14px}
.cp-subwrap.r-tr{border-top-right-radius:14px}
/* Светлая тема: чуть темнее чистого --card-hi2 (иначе почти белый на белом).
   Тёмная — без изменений (там --card-hi2 и так заметно отличается). */
.cp-subwrap .rc-fld2{background:color-mix(in srgb, var(--text) 2%, var(--card-hi2) 98%)}
:root[data-theme="dark"] .cp-subwrap .rc-fld2{background:var(--card-hi2)}
.cp-subpane[hidden]{display:none}
.cp-cards2{display:grid;grid-template-columns:1fr 1fr;gap:26px}
.cp-cards3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:26px}
.cp-cards4{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:26px}
/* Йогини/Нараяна/Чара в «Периодах» Джанмы — платные (Вимшоттари бесплатна) */
#cpSubPeriods [data-dasha-col].locked{opacity:.55;cursor:not-allowed}
/* Бала — карточки друг под другом (не в ряд): у Шад-балы 11 колонок, в трети
   ширины поля они не влезали и таблица уезжала в горизонтальный скролл. */
.cp-cards-stack{display:flex;flex-direction:column;gap:26px}
/* заголовок карточки + доп-контрол (список) в одну строку, с небольшим
   отступом (не в разные углы) — управляющие божества, варга у грах. */
.cp-card-head{display:flex;align-items:center;gap:3ch;margin-bottom:12px}
.cp-card-head .rc-fh{margin:0}
/* вариант «в правый угол поля» — заголовок слева, контрол у правого края
   (Грахи → варга), в отличие от плотной пары заголовок+контрол (Божества) */
.cp-card-head-end{justify-content:space-between}
/* Варга/Божество — узкие, фиксированной ширины; Описание забирает всё
   остальное место и переносится по словам (а не одной строкой, как числа). */
.cp-deitable{table-layout:fixed}
.cp-deitable th:nth-child(1),.cp-deitable td:nth-child(1){width:70px}
.cp-deitable th:nth-child(2),.cp-deitable td:nth-child(2){width:160px}
.cp-deitable td{white-space:normal;vertical-align:top}
.cp-deitable tbody tr:hover{background:var(--card-hi2)}
.cp-deitable .cp-dei-name{color:var(--accent);font-weight:600}
.cp-deitable .cp-dei-desc{color:var(--accent);line-height:1.5}

/* Тара-бала: 9 тар прямо на поле (без карточек — как остальной контент
   .cp-subwrap), в 3 колонки, заполнение сверху вниз, затем слева направо
   (grid-auto-flow:column + фиксированные 3 строки). Разделитель между
   тарами — тонкая линия снизу, не рамка вокруг. Цвет номера — по качеству
   тары (good/bad/mid), теми же токенами, что и остальной сайт. */
.cp-tara-list{display:grid;grid-template-columns:repeat(3,1fr);
  grid-template-rows:repeat(3,auto);grid-auto-flow:column;column-gap:28px}
.cp-tara-card{padding:16px 20px 16px 0;border-bottom:1px solid var(--line)}
/* последняя тара в каждой из 3 колонок (порядок DOM — сверху вниз по
   колонке: 1,2,3 · 4,5,6 · 7,8,9) — без нижней линии, поле кончается тут же. */
.cp-tara-list>.cp-tara-card:nth-child(3n){border-bottom:0}
.cp-tara-head{display:flex;align-items:center;gap:10px}
.cp-tara-num{flex:none;width:24px;height:24px;border-radius:50%;display:flex;
  align-items:center;justify-content:center;font-family:var(--sans);font-size:12.5px;
  font-weight:700;background:var(--accent-soft);color:var(--accent)}
.cp-tara-num.q-good{background:color-mix(in srgb, var(--ok) 14%, transparent);color:var(--ok)}
.cp-tara-num.q-bad{background:color-mix(in srgb, var(--err) 14%, transparent);color:var(--err)}
.cp-tara-name{font-family:var(--sans);font-size:15px;font-weight:600;color:var(--text)}
.cp-tara-ruler{margin-left:auto;color:var(--text2);font-family:var(--sans);font-size:13px}
/* Накшатры — сразу под названием тары. */
.cp-tara-nak{display:block;margin:6px 0;color:var(--text2);font-size:13px}
/* Сутра — курсивом того же шрифта/наклона, что описание в карточках модулей
   курса (.module p: font-family Bitter, font-style italic), см. styles.css. */
.cp-tara-sutra{font-family:'Bitter';font-style:italic;color:var(--text2);margin-bottom:8px}
.cp-tara-row{display:flex;gap:10px;margin-top:4px;font-size:13.5px;line-height:1.5}
.cp-tara-row .tl{flex:0 0 130px;color:var(--text2)}
.cp-tara-row .tv{flex:1;color:var(--text)}
.cp-tara-row.tara-do .tl{color:var(--ok)}
.cp-tara-row.tara-avoid .tl{color:var(--err)}
.cp-tara-nak{color:var(--text2);font-size:13px}

/* Локация по умолчанию — поле формой как «Место рождения» в шапке (.field input) */
.cp-set-loc{position:relative;width:100%}
.cp-set-loc-in{width:100%;font-family:var(--sans);font-size:16px;color:var(--text);
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  border:0;border-radius:10px;padding:12px 14px;outline:none;
  box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12);
  transition:box-shadow .16s ease}
.cp-set-loc-in::placeholder{color:var(--text2);opacity:.7}
.cp-set-loc-in:focus{box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12),
  0 0 0 3px var(--focus-ring)}
.cp-set-loc-sug{width:100%}

/* обе карты — в одном поле */
.cp-charts{padding:22px;margin-top:34px}
/* Первый ряд: три карты во всю ширину. Четвёртая стоит в колонке нулевой ширины
   и выезжает по «Больше карт» — так три соседние ужимаются плавно, а не рывком.
   Колонки заданы calc(), а НЕ fr: списки вида «1fr 1fr 1fr 0fr» и «repeat(4,1fr)»
   браузер интерполировать отказывается, и раскрытие происходило рывком.
   78px = три зазора по 26px; они есть всегда, даже у нулевой колонки. */
.cp-row-main{display:grid;gap:26px;
  grid-template-columns:calc((100% - 78px)/3) calc((100% - 78px)/3) calc((100% - 78px)/3) 0px;
  transition:grid-template-columns .45s cubic-bezier(.4,0,.2,1)}
.cp-charts.more .cp-row-main{
  grid-template-columns:calc((100% - 78px)/4) calc((100% - 78px)/4) calc((100% - 78px)/4) calc((100% - 78px)/4)}
.cp-row-extra{display:grid;grid-template-columns:repeat(4,1fr);gap:26px}
/* нижний ряд карт: раскрывается плавно (0fr→1fr), отступы — на внутреннем слое */
.cp-extra{display:grid;grid-template-rows:0fr;opacity:0;
  transition:grid-template-rows .45s cubic-bezier(.4,0,.2,1),opacity .3s ease,margin-top .45s ease}
.cp-extra.open{grid-template-rows:1fr;opacity:1;margin-top:26px}
.cp-extra-inner{overflow:hidden;min-height:0;visibility:hidden;transition:visibility 0s linear .45s}
.cp-extra.open .cp-extra-inner{visibility:visible;transition-delay:0s}
/* «Больше карт» — по центру под полем, только текст со стрелкой */
.cp-more{display:flex;align-items:center;justify-content:center;gap:7px;width:100%;
  margin:0;padding:16px 0 2px;border:0;background:none;cursor:pointer;
  font-family:var(--sans);font-size:13.5px;font-weight:600;color:var(--accent)}
.cp-more:hover{opacity:.75}
.cp-more-caret{transition:transform .3s ease}
.cp-more[aria-expanded="true"] .cp-more-caret{transform:rotate(180deg)}
@media (prefers-reduced-motion:reduce){
  .cp-extra,.cp-row-main,.cp-tab,.cp-pane .cp-charts{transition:none}
  .cp-more-caret{transition:none}
}
/* ── Варшапхала ──
   Карты обязаны быть ростом с джанмовские, поэтому сетка та же самая — три
   колонки по (100% - 78px)/3, — просто карт в ней две, а третья колонка пустая.
   Ограничивать ширину самой строки нельзя: колонки считаются в процентах ОТ НЕЁ,
   и строка, ужатая по той же формуле, даёт колонки втрое уже нужного. */
.cp-row-two{display:grid;gap:26px;
  grid-template-columns:repeat(3,calc((100% - 78px)/3))}
/* Значок «чья карта» — по центру строки кнопок, между варгой и стилем.
   Размер и цвет — как у .dual-glyph в приложении (index.html:1501). */
.cp-chart-ic{width:20px;height:20px;color:var(--text2);flex:0 0 auto;display:block}
.cp-chart-ic svg{width:100%;height:100%;display:block}
/* Мудда-даша — в третьей колонке сетки, справа от карты рождения. Своей
   ширины не просит: колонка ровно такая же, как под картой. Высоту тоже не
   просит — задаёт исключительно ряд карт (растяжением grid), внутренний слой
   вынут из потока (тот же приём, что у .rc-ev-col в ректификации): раскрытие
   маха-периода растёт и скроллится ВНУТРИ карточки, карты не двигая. */
.cp-vside{position:relative;min-width:0}
.cp-vside-inner{position:absolute;inset:0;display:flex;flex-direction:column;min-height:0}
.cp-vside-scroll{flex:1;min-height:0;overflow-y:auto}

/* ── Сарватобхадра чакра ──
   Открывается на весь экран (fixed поверх шапки сайта) из списка стиля
   первой карты — вкладка под ней просто ждёт под hidden. Квадрат — по
   меньшей стороне окна, с запасом под боковую панель. Различение ячеек —
   заливкой, без обводок (см. no-borders-on-cards); сами линии сетки —
   акцентные, не приглушённый --line, чтобы чакра читалась как чертёж. */
.cp-sbc{position:fixed;inset:0;z-index:60;display:flex;flex-direction:column;
  align-items:flex-start;gap:22px;padding:32px 40px;background:var(--card);overflow:auto}
/* .cp-tt.cp-sbc-title — специфичность выше одного .cp-tt (margin:30px 0 14px
   ниже по файлу иначе перебивает: та же ловушка, что была с .sbc-table th). */
.cp-tt.cp-sbc-title{margin:0}
/* Не растянута на всю ширину (align-self:center, а не .cp-sbc-row{width:100%}) —
   поэтому центрируется как единый блок «чакра + поле накшатр», а не сама чакра:
   с более широким полем накшатр это и сдвигает чакру левее центра экрана. */
.cp-sbc-row{display:flex;gap:32px;align-items:flex-start;align-self:center;
  flex:1;min-height:0}
.sbc-grid{flex:0 0 auto;width:min(78vh,62vw);aspect-ratio:1/1;
  display:grid;grid-template-columns:repeat(9,1fr);grid-template-rows:repeat(9,1fr);
  gap:1px;background:color-mix(in srgb, var(--accent) 32%, var(--line));
  box-shadow:0 0 0 1.5px color-mix(in srgb, var(--accent) 48%, var(--line));
  border-radius:10px;overflow:hidden}
.sbc-cell{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:2px;background:var(--card-hi);font-family:var(--sans);text-align:center;padding:2px;
  overflow:hidden;min-width:0}
.sbc-cell.sbc-nak{background:var(--card-hi2);position:relative}
.sbc-cell.sbc-tithi{background:var(--card-hi2)}
.sbc-cell.sbc-sign{background:color-mix(in srgb, var(--accent) 14%, var(--card-hi))}
/* Подсветка «глазом» из боковой таблицы — мягким лимонным поверх обычной
   заливки ячейки; текст затемняем принудительно, иначе в тёмной теме
   --text светлый и на жёлтом фоне нечитаем. */
.sbc-cell.sbc-hl{background:#fbf3a8}
.sbc-cell.sbc-hl .sbc-code,.sbc-cell.sbc-hl .sbc-pl{color:#4a3c00}
/* Накшатра с планетой — кликабельна (показывает ведхи), заливкой на hover,
   без обводок (см. no-borders-on-cards). */
.sbc-cell.sbc-vsrc{cursor:pointer}
.sbc-cell.sbc-vsrc:hover{background:color-mix(in srgb, var(--accent) 16%, var(--card-hi2))}
/* Сама ячейка-источник, пока ведхи показаны — свой оттенок (акцентная
   заливка), отличный от трёх цветов ведх ниже, чтобы не путать «откуда»
   с «куда». */
.sbc-cell.sbc-vsrc-on{background:color-mix(in srgb, var(--accent) 24%, var(--card-hi2))}
/* Три ведхи по клику на накшатру с планетой (site: специфичность через
   .sbc-grid — иначе .sbc-cell.sbc-tithi/.sbc-sign ниже по каскаду
   перебивают фон titхи-креста/знаков, у них та же специфичность 2 класса).
   Порядок правил — обратная (голубая) поверх прямой (зелёной) поверх
   поперечной (жёлтой), если лучи пересеклись на одной клетке. Текст
   затемняем, как и у .sbc-hl — иначе в тёмной теме нечитаем. */
.sbc-grid .sbc-cell.sbc-vt{background:#fbf3a8}
.sbc-grid .sbc-cell.sbc-vt .sbc-code,.sbc-grid .sbc-cell.sbc-vt .sbc-pl,
.sbc-grid .sbc-cell.sbc-vt .sbc-syl-dev,.sbc-grid .sbc-cell.sbc-vt .sbc-syl-tr{color:#4a3c00}
.sbc-grid .sbc-cell.sbc-vf{background:#d7ecd3}
.sbc-grid .sbc-cell.sbc-vf .sbc-code,.sbc-grid .sbc-cell.sbc-vf .sbc-pl,
.sbc-grid .sbc-cell.sbc-vf .sbc-syl-dev,.sbc-grid .sbc-cell.sbc-vf .sbc-syl-tr{color:#1f3d1f}
.sbc-grid .sbc-cell.sbc-vr{background:#cde6f5}
.sbc-grid .sbc-cell.sbc-vr .sbc-code,.sbc-grid .sbc-cell.sbc-vr .sbc-pl,
.sbc-grid .sbc-cell.sbc-vr .sbc-syl-dev,.sbc-grid .sbc-cell.sbc-vr .sbc-syl-tr{color:#173a4d}
/* Угловая ведха (планета в краевой паде у одной из 4 накшатр-стыков угла —
   см. cornerDiagFor) — диагональ через Пурна-Титхи, светло-красным/розовым.
   Правило последнее в каскаде — перебивает жёлтую/зелёную/голубую на
   пересечении (это более редкое и «сильное» условие). */
.sbc-grid .sbc-cell.sbc-vc{background:#f6cdd3}
.sbc-grid .sbc-cell.sbc-vc .sbc-code,.sbc-grid .sbc-cell.sbc-vc .sbc-pl,
.sbc-grid .sbc-cell.sbc-vc .sbc-syl-dev,.sbc-grid .sbc-cell.sbc-vc .sbc-syl-tr{color:#5c1a22}
/* Название накшатры — тем же шрифтом, что и было, в левый верхний угол ячейки
   (вынуто из потока, чтобы планеты под ним центрировались сами по себе). */
.sbc-nak .sbc-code{position:absolute;top:2px;left:3px;font-size:12px;font-weight:700;color:var(--text)}
/* Планеты — вдвое крупнее (минус 8%). Отступ сверху — чтобы при переносе
   планет на 2 строки они не наезжали на название накшатры в углу. */
.sbc-pl{font-size:23px;font-weight:700;color:var(--accent);line-height:1.2;margin-top:8px}
.sbc-code{font-size:22px;color:var(--text2)}
/* Намакшары (слоги внутреннего кольца) — деванагари и перевод (рус/укр/англ
   по языку сайта) в одну строку, по центру клетки по высоте: деванагари —
   левая половина, прижата к правому краю (к центру клетки), перевод —
   правая половина, прижата к левому краю (тоже к центру), зеркально, с
   отступом ~1 символ от центра у обоих — без разделительной линии, просто
   пробел. Несколько вариантов на клетку (до 4) — столбиком через <br>,
   каждая половина центрируется по высоте независимо (align-items:center). */
/* Размер — доля от ФАКТИЧЕСКОЙ ширины клетки (min(78vh,62vw)/9 — та же
   формула, что задаёт .sbc-grid, ×.13), а не просто vw: только так шрифт
   держит одну и ту же пропорцию к клетке на любом размере окна/экрана —
   на 16" full-screen и на маленьком MacBook Air одинаково. Чистый vw-clamp
   этого не даёт: если сетку ограничивает vh (не vw), vw-шрифт с ней не
   совпадает — то мелкий там, где сетка большая, то вылезает там, где
   маленькая. clamp() с крайними px — только страховка на патологические
   вьюпорты, не основной механизм. Шрифт — тот же сериф, что у вступительного
   текста калькулятора на главной (.calc-intro, наследует body — var(--serif)),
   не жирный, оба угла одним цветом.
   Эталон размера — 4-строчные клетки (d/bh/p): текстовый блок должен занимать
   90% высоты клетки без заезда за границы, не больше и не меньше. При
   line-height 1.15 и 4 строках это даёт коэффициент .9/(4×1.15) = .196 —
   именно он и стоит ниже. Однострочные/2-3-строчные (.sbc-syl-c и остальные)
   используют ТОТ ЖЕ коэффициент (тот же px, что и у 4-строчных, просто не
   заполняют клетку целиком) — так просили: не подгонять размер под каждую
   клетку отдельно, а один эталонный размер на всех. Исключение — 5-строчная
   клетка (k), для нее отдельный меньший коэффициент ниже (.sbc-syl-5). */
.sbc-cell.sbc-syl{flex-direction:row;gap:0}
/* Ось деванагари/перевода — не 50/50: 30/70 (сдвиг на 20% от центра влево).
   flex-basis:0% у обеих + разный flex-grow — ровно эта пропорция ширины, не
   завязано на конкретный px. Зазор между деванагари и переводом — в сумме
   1 символ (по 0.5ch с каждой стороны от оси), не по 1ch с каждой. */
.sbc-syl-dev{flex:30 1 0%;min-width:0;text-align:right;padding-right:.5ch;
  font-family:var(--serif);font-size:clamp(7px, calc(min(78vh, 62vw) / 9 * .196), 32px);line-height:1.15;
  font-weight:400;color:var(--text)}
.sbc-syl-tr{flex:70 1 0%;min-width:0;text-align:left;padding-left:.5ch;
  font-family:var(--serif);font-size:clamp(7px, calc(min(78vh, 62vw) / 9 * .196), 32px);line-height:1.15;
  font-weight:400;color:var(--text)}
/* Однострочные клетки (без стопки вариантов — один слог) — просто по центру
   клетки парой, без смещения оси: выравнивать по соседям (многострочным)
   там нечего, всё и так помещается. .sbc-cell уже justify-content:center —
   тут только снимаем растяжение flex:30/70 до auto-по-содержимому. */
.sbc-cell.sbc-syl-c .sbc-syl-dev,.sbc-cell.sbc-syl-c .sbc-syl-tr{flex:0 0 auto}
/* Единственная 5-строчная клетка (k) — эталон размера (4 строки, см. выше)
   на неё не налезет: тот же расчёт «90% высоты клетки», но на 5 строк вместо
   4 (0.9 / (5×line-height 1.15) = .157 вместо .196 у остальных) — специально
   мельче, а не auto-fit, чтобы не ломать одинаковый размер у 1-4-строчных. */
.sbc-cell.sbc-syl-5 .sbc-syl-dev,.sbc-cell.sbc-syl-5 .sbc-syl-tr{
  font-size:clamp(6px, calc(min(78vh, 62vw) / 9 * .157), 26px)}
.sbc-tithi-t{font-size:19px;font-weight:400;color:var(--text)}
.sbc-tithi-v{font-size:19px;color:var(--text2)}
/* Боковая панель — своим полем-карточкой, как .rc-fld2 везде на сайте.
   Ширина ×1.5 от исходной (была ~357px) — накшатры умещаются в одну строку.
   Кнопки опоры + группы-таблицы — колонкой, с отступом между ними. */
.sbc-side{flex:0 0 auto;min-width:535px;display:flex;flex-direction:column;gap:16px;
  background:var(--card-hi);border-radius:12px;padding:16px 18px;
  box-shadow:0 1px 2px rgba(89,59,59,.05),0 2px 8px rgba(89,59,59,.05)}
:root[data-theme="dark"] .sbc-side{box-shadow:0 1px 2px rgba(0,0,0,.22),0 2px 8px rgba(0,0,0,.24)}
/* Кнопки опоры (Луна/Солнце/Лагна) — как кнопки выбора стиля карты
   (.cp-sel .combo-pick на самих картах): скруглённая «стеклянная» пилюля,
   тот же градиент/тень/паддинг/шрифт. Активная — в инверсии с обычным
   текстом (var(--text) фоном, var(--card-hi) текстом): для светлой темы
   var(--text) тёмный → тёмная кнопка со светлым текстом, как просили; для
   тёмной темы автоматически наоборот — оба токена уже противоположны темой.
   Без роста на hover — это таб-переключатель, а не .btn-действие. */
.sbc-ref{display:flex;gap:8px}
.sbc-ref-btn{flex:1;border-radius:999px;padding:7px 13px;font-size:13px;
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  box-shadow:inset 0 1px 0 var(--glass-hi),0 3px 8px rgba(60,40,30,.10);
  border:0;color:var(--text2);font-family:var(--sans);font-weight:500;cursor:pointer;
  text-align:center;transition:background .15s,color .15s}
:root[data-theme="dark"] .sbc-ref-btn{box-shadow:inset 0 1px 0 var(--glass-hi),0 3px 8px rgba(0,0,0,.20)}
.sbc-ref-btn:hover{color:var(--text)}
.sbc-ref-btn.on{background:var(--text);color:var(--card-hi);box-shadow:none}
/* Три опоры рисуются разом (см. sarvatobhadra.js renderSide) и лежат друг
   на друге в одной grid-ячейке — невидимые варианты всё равно участвуют в
   подсчёте высоты трека, поэтому поле не меняет размер при переключении
   кнопок (высота всегда под самый длинный вариант — Солнце, 12 строк). */
.sbc-groups{display:grid}
.sbc-refpanel{grid-area:1/1;display:flex;flex-direction:column;gap:14px;min-width:0}
.sbc-refpanel:not(.active){visibility:hidden}
/* Таблица — якорь для глаза (в её собственном правом верхнем углу, см. ниже).
   Заголовок группы — подписью таблицы, мельче .cp-tt, без капса (см.
   no-caps-in-titles), в одну строку без переноса (запас справа под глаз). */
.sbc-table{position:relative}
.sbc-table caption{caption-side:top;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  font-size:13px;font-weight:700;color:var(--text2);padding:0 26px 6px 0}
.sbc-table td{white-space:normal}
.sbc-td-pos{text-align:center;width:1%}
/* Колонка названий накшатр (результат) — по правому краю, как просили. */
.sbc-td-nak{text-align:right}
/* Кнопка-глаз — точно в правом верхнем углу таблицы (не просто в конце
   строки заголовка — там текст мог не доходить до края). Без обводок и
   заливок — просто символ; активность/hover различаем только цветом. */
.sbc-eye{position:absolute;top:0;right:0;display:inline-flex;align-items:center;
  justify-content:center;flex:none;border:0;background:none;padding:0;
  color:var(--text3);font-size:13px;line-height:1;cursor:pointer;transition:color .15s}
.sbc-eye:hover{color:var(--text)}
.sbc-eye.on{color:var(--accent)}
.cp-sbc-back{align-self:flex-start}
/* ── Шапка транзита внутри СБЧ ──
   Тот же узел (#cpTBar), что и на обычном виде вкладки — переезжает сюда
   целиком через JS (openSBC/closeSBC), а не копия: чтобы не разъехались
   обработчики. На обычном виде у неё отрицательные поля под ПАДДИНГ карточки
   (22px) — здесь паддинг другой (32px/40px) и своего sticky-контекста нет,
   поэтому переопределяем на месте: без отлипания, без бридж-полей. */
/* width:100% — без него бар (флекс-item в колонке .cp-sbc с align-items:
   flex-start) сжимается до содержимого, а не тянется на весь экран, и ВД/ЧД
   (рассчитаны на полноширинный бар) обрезаются многоточием. */
.cp-sbc .rc-bar{position:relative;top:auto;width:100%;margin:0 0 18px;padding:0 0 18px}

/* ── «На этот транзит» (Джанма/Варшапхала → поле периода) ──
   Дата, по которой можно прыгнуть в Транзит; кнопка всплывает над ней через
   1.5с наведения (initDateJump в chart-page.js), тем же «стеклянным» стилем,
   что .chip. */
.cp-jump-date{cursor:default}
.cp-jump-btn{position:fixed;left:0;top:0;z-index:80;transform:translate(-50%,calc(-100% - 8px));
  white-space:nowrap;border:0;border-radius:999px;padding:7px 14px;
  font-family:var(--sans);font-size:12px;font-weight:600;color:var(--text);cursor:pointer;
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  -webkit-backdrop-filter:blur(8px) saturate(1.4);backdrop-filter:blur(8px) saturate(1.4);
  box-shadow:inset 0 1px 0 var(--glass-hi),0 3px 8px rgba(60,40,30,.12);
  opacity:0;pointer-events:none;transition:opacity .15s ease}
.cp-jump-btn.show{opacity:1;pointer-events:auto}
.cp-jump-btn:hover{transform:translate(-50%,calc(-100% - 8px)) scale(1.06)}

/* ── Ректификация ──
   Строка времени: сброс слева, сохранение справа, всё рабочее — по центру.
   --rc-h держит одну высоту у даты, времени, выбора шага и кнопок +/−:
   вразнобой они читались бы как разные по важности. */
/* Шапка времени липнет под шапкой сайта при скролле. Фон карты (--card) кроет
   строки, уезжающие под неё; отрицательные поля растягивают фон на всю ширину
   карты (у .cp-charts padding 22px), верхний отступ прячет содержимое над баром. */
.rc-bar{--rc-h:52px;position:sticky;top:56px;z-index:20;
  display:flex;align-items:center;gap:18px;
  margin:0 -22px 26px;padding:14px 22px 22px;background:var(--card)}
/* Разделитель под шапкой — не встык к краям поля, симметричный отступ 14px:
   тот же приём, что у строки модуля на главной (.module .num::after). */
.rc-bar::after{content:'';position:absolute;left:22px;right:22px;bottom:0;height:1px;
  background:var(--line)}
.rc-mid{display:flex;align-items:center;gap:10px}
/* даши по центру своих промежутков (flex:1 забирает свободное место слева/справа
   от центральной группы). ВД — накшатра-даша, ЧД — раши-даша. */
.rc-dasha{flex:1;min-width:0;text-align:center;font-family:var(--sans);
  font-size:21px;font-weight:600;color:var(--text2);font-variant-numeric:tabular-nums;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* ВД + НД (транзит) в одной ячейке в два ряда — своя строка мельче основной,
   чтобы обе уместились в высоту бара без переверстки flex:1-симметрии */
.rc-dasha-2l{font-size:15px;line-height:1.35}
/* Шапка транзита: слева и справа теперь не статичный текст, а комбо-выбор
   системы (Вимшоттари/Йогини слева, Чара/Нараяна справа) — тот же .combo-pick
   механизм (стрелка+меню), что и у стиля/варги карты, но без «пилюли»: просто
   крупный текст активного периода, стрелка — ПЕРЕД текстом (как просили), а
   не после. .rc-bar .rc-dashasel .combo-pick — специфичность нарочно выше
   .cp-sel .combo-pick (тот красит мелкой стеклянной пилюлей все прочие комбо
   на странице), иначе то правило перебивает это независимо от порядка в файле. */
.rc-dashasel{flex:1;min-width:0;display:flex;justify-content:center}
.rc-bar .rc-dashasel .combo-pick{padding:0;background:none;box-shadow:none;
  border-radius:0;gap:6px;min-width:0;max-width:100%;
  font-family:var(--sans);font-size:21px;font-weight:600;color:var(--text2);
  font-variant-numeric:tabular-nums}
.rc-bar .rc-dashasel .combo-pick:hover{color:var(--text)}
.rc-dashasel .combo-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rc-dashasel .combo-caret{flex:none;width:9px;height:9px}
/* позиционирование и ширина .rc-dashasel .combo-menu — ниже по файлу, сразу
   после .cp-sel .combo-menu (одинаковая специфичность, важен порядок) */
/* дата и время — раздельно; крупно и моноширинными цифрами */
.rc-date,.rc-time{display:flex;align-items:center;height:var(--rc-h);
  font-family:var(--sans);font-size:25px;font-weight:700;color:var(--text);
  font-variant-numeric:tabular-nums;letter-spacing:.01em;white-space:nowrap;
  border-radius:999px;padding:0 20px;
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  box-shadow:inset 0 1px 0 var(--glass-hi),0 3px 8px rgba(60,40,30,.10)}
/* выбор шага — та же капсула и та же высота, что у полей рядом */
.rc-step .combo-pick{height:var(--rc-h);border-radius:999px;padding:0 16px;font-size:14px}
/* + и − — то же стекло, ростом с поле времени */
.rc-pm{display:flex;align-items:center;justify-content:center;
  width:var(--rc-h);height:var(--rc-h);
  border:0;border-radius:999px;cursor:pointer;color:var(--text2);flex:none;
  font-family:var(--sans);font-size:22px;font-weight:600;line-height:1;
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  box-shadow:inset 0 1px 0 var(--glass-hi),0 3px 8px rgba(60,40,30,.10);
  transition:color .18s ease,transform .18s ease}
.rc-pm:hover{color:var(--accent);transform:scale(1.08)}
@media (prefers-reduced-motion:reduce){ .rc-pm{transition:none} }

/* Панчанга момента: 6 колонок по 2 строки, сразу под шапкой времени. Простой
   текст без полей-карточек (в отличие от .rc-fld2 у нижних блоков) — только
   подпись и значение. В отличие от .rc-bar выше — не закреплена при скролле.
   Разделитель снизу — та же линия, что у .rc-bar::after сверху. */
.rc-panch{display:flex;justify-content:space-between;gap:10px;
  position:relative;margin:0 12px 26px;padding-bottom:18px}
.rc-panch::after{content:'';position:absolute;left:0;right:0;bottom:0;height:1px;
  background:var(--line)}
.rc-panch-col{display:flex;flex-direction:column;gap:4px;min-width:0}
.rc-panch-col div{font-family:var(--sans);font-size:16px;font-weight:400;
  color:color-mix(in srgb, var(--text) 50%, var(--text2));
  font-variant-numeric:tabular-nums;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.rc-panch-col div strong{font-weight:700}
/* Управители года (варшапхала) — одна строка НАД панчангой, растянута на всю
   ширину (те же 6 элементов, что и колонки панчанги, только в один ряд, а не
   в два) той же породы. Общий инсет 12px берёт на себя обёртка, вложенный
   .rc-panch эти же 12px больше не повторяет.
   Отступ ОТ линии шапки ДО управителей = отступ ОТ линии управителей ДО
   панчанги = 7px (оба «после своей линии»; отступ .rc-bar переопределён под
   это ниже, см. #cpVBar). Под панчангой — та же линия, что и над ней (у
   управителей), с тем же отступом ДО неё (6px); гэп ПОСЛЕ нее до карт —
   родные 26px обёртки, как и было у панчанги до этого блока. */
.rc-panch-wrap{margin:0 12px 26px}
.rc-panch-wrap .rc-panch{margin:0;padding-bottom:6px;border-bottom:1px solid var(--line)}
.rc-panch-wrap .rc-panch::after{display:none}
.rc-panch-lords{display:flex;justify-content:space-between;gap:10px;
  padding-bottom:6px;margin-bottom:7px;border-bottom:1px solid var(--line)}
.rc-panch-lords div{font-family:var(--sans);font-size:16px;font-weight:400;
  color:color-mix(in srgb, var(--text) 50%, var(--text2));
  font-variant-numeric:tabular-nums;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;min-width:0}
.rc-panch-lords div strong{font-weight:700}
/* Шапка варшапхалы — тот же отступ после своей линии, что у управителей и
   панчанги ниже (7px вместо общих 26px у .rc-bar в других вкладках). */
#cpVBar{margin-bottom:7px}

/* ── Поле событий ──
   Кнопка всегда сверху, список под ней скроллится и вниз за поле не вылезает.
   Внутренний слой — absolute: иначе список тянул бы высоту ряда за собой, и
   поле росло бы вместо прокрутки. Высоту ряда задают карты, колонка её берёт
   растяжением грид-ячейки. */
.rc-ev-col{position:relative;min-width:0}
.rc-ev-inner{position:absolute;inset:0;display:flex;flex-direction:column;min-height:0}
.rc-ev-add{align-self:center;flex:none;width:50%;margin-bottom:14px;text-align:center}
.rc-ev-form{flex:none;margin-bottom:14px;padding:14px;border-radius:12px;
  background:var(--accent-soft)}
.rc-ev-form .field{margin-bottom:10px}
/* строку типа события — выше остальных полей */
.rc-ev-sel .combo-pick{width:100%;justify-content:space-between;min-height:48px;
  padding-top:12px;padding-bottom:12px}
.rc-ev-menu{min-width:0;width:100%}
/* дата и время — по половине строки */
.rc-ev-2col{display:flex;gap:12px}
.rc-ev-2col .field{flex:1;min-width:0;margin-bottom:10px}
/* подтверждение удаления — прямо в карточке */
.rc-ev-confirm{display:flex;align-items:center;justify-content:space-between;
  gap:10px;margin-top:8px}
.rc-ev-qn{font-family:var(--sans);font-size:14px;color:var(--text2)}
.rc-ev-cbtns{display:flex;gap:8px;flex:none}
.rc-ev-confirm .btn{padding:6px 14px;font-size:13.5px}
.rc-ev-yes{color:var(--err)}
/* По центру и с зазором 28px — тем же, что у .cp-acts: кнопка при наведении
   растёт на 20% (~12px в каждую сторону), с меньшим зазором они налезают. */
.rc-ev-acts{display:flex;align-items:center;justify-content:center;gap:28px;
  margin-top:18px}
/* тени карточек при наведении выходят за край — списку нужен запас, иначе он их срежет */
.rc-ev-list{flex:1;min-height:0;overflow-y:auto;display:grid;gap:10px;
  align-content:start;padding:4px 8px 8px 4px}
/* Карточка события — по рецепту карточек программы курса (.module.card):
   заливка, мягкая тень, наведение поднимает. Обводок здесь быть не должно.
   Заливка — --card-hi: карточка лежит НА поле цвета --card и на нём же была бы
   не видна. Тень своя, а не --shadow: та рассчитана на крупные карточки на
   фоне страницы и под мелкой карточкой на светлом поле читается грязным пятном. */
.rc-ev{border-radius:12px;padding:11px 14px;background:var(--card-hi);
  box-shadow:0 1px 2px rgba(89,59,59,.05),0 2px 8px rgba(89,59,59,.05);
  cursor:pointer;
  transition:transform .2s ease,box-shadow .2s ease;
  will-change:transform}
.rc-ev:hover{transform:translateY(-2px);
  box-shadow:0 2px 4px rgba(89,59,59,.06),0 6px 16px rgba(89,59,59,.09)}
/* Выбранная — тоже светлая: приподнята и подписана акцентом. Затемнять её
   заливкой нельзя, карточка должна оставаться светлее поля. */
.rc-ev.sel{transform:translateY(-2px);
  box-shadow:0 2px 4px rgba(89,59,59,.06),0 6px 16px rgba(89,59,59,.09)}
.rc-ev.sel .rc-ev-nm{color:var(--accent)}
:root[data-theme="dark"] .rc-ev{
  box-shadow:0 1px 2px rgba(0,0,0,.22),0 2px 8px rgba(0,0,0,.24)}
:root[data-theme="dark"] .rc-ev:hover,
:root[data-theme="dark"] .rc-ev.sel{
  box-shadow:0 2px 4px rgba(0,0,0,.26),0 6px 16px rgba(0,0,0,.32)}
.rc-ev-head{display:flex;align-items:center;gap:8px}
.rc-ev-nm{flex:1;min-width:0;font-family:var(--sans);font-size:16px;font-weight:600;
  color:var(--text)}
.rc-ev-btns{display:flex;align-items:center;gap:4px;flex:none}
/* значки — крупнее и по центру своей кнопки */
.rc-ev-ic{display:inline-flex;align-items:center;justify-content:center;
  width:30px;height:30px;padding:0;border:0;border-radius:999px;
  background:none;cursor:pointer;color:var(--text3);
  transition:color .15s ease,background .15s ease}
.rc-ev-ic:hover{color:var(--accent);background:var(--accent-soft)}
.rc-ev-del:hover{color:var(--err)}
/* строка под названием: дата слева, вимшоттари по центру, чара справа */
.rc-ev-sub{display:flex;align-items:baseline;gap:10px;margin-top:4px;
  font-family:var(--sans);font-size:13.5px;color:var(--text2);
  font-variant-numeric:tabular-nums}
.rc-ev-date{flex:none;white-space:nowrap}
.rc-ev-vd{flex:1;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rc-ev-cd{flex:none;white-space:nowrap}
@media (prefers-reduced-motion:reduce){ .rc-ev,.rc-ev-ic{transition:none} }
/* D-1 варгой не переключается — подпись на месте кнопки. Высота строго как у
   кнопки выбора рядом (30px): иначе строки кнопок разной высоты, и карты в
   колонках разъезжаются по вертикали. */
.rc-fixed{display:flex;align-items:center;height:30px;
  font-family:var(--sans);font-size:13px;font-weight:600;color:var(--text2)}
/* Поля показателей — во всю ширину карты, под строкой кнопок.
   Высота поля задана явно: от неё считается сдвиг второй колонки (--rc-fh),
   иначе карты разъехались бы по вертикали. */
.rc-flds{display:grid;gap:var(--rc-gap);margin-bottom:14px}
/* Фон — как у нижних полей (--card-hi), с той же мягкой тенью. Размер прежний. */
.rc-fld{--rc-fh:54px;--rc-gap:7px;
  display:flex;align-items:center;gap:6px;width:100%;height:var(--rc-fh);
  border-radius:10px;padding:0 6px;background:var(--card-hi);
  box-shadow:0 1px 2px rgba(89,59,59,.05),0 2px 8px rgba(89,59,59,.05);
  font-family:var(--sans)}
:root[data-theme="dark"] .rc-fld{box-shadow:0 1px 2px rgba(0,0,0,.22),0 2px 8px rgba(0,0,0,.24)}
.rc-flds{--rc-fh:54px;--rc-gap:7px}
/* У первой карты полей два, у второй одно — опускаем всю колонку ровно на
   одно поле с зазором. Негативное пространство остаётся сверху. */
.rc-col-2{padding-top:calc(54px + 7px)}
/* название и промежуток — в одну строку по центру, крупнее; размеры равны */
.rc-fld-c{flex:1;min-width:0;display:flex;align-items:baseline;justify-content:center;
  gap:12px;white-space:nowrap}
.rc-fld-nm{font-size:16px;font-weight:700;color:var(--text)}
.rc-fld-tm{font-size:16px;display:inline-flex;align-items:baseline;gap:5px}
.rc-dash{color:var(--text3)}
/* стрелки поля — как в приложении: шаг на соседний знак/накшатру */
.rc-arr{border:0;background:none;cursor:pointer;flex:none;
  width:24px;height:100%;padding:0;color:var(--text3);
  font-family:var(--sans);font-size:19px;line-height:1;
  transition:color .15s ease}
.rc-arr:hover{color:var(--accent)}
@media (prefers-reduced-motion:reduce){ .rc-arr{transition:none} }
/* Карты и поле событий — в карточках (фон, тень). Прозрачным делаем ТОЛЬКО сам
   SVG-график: снимаем его собственный фон, чтобы просвечивал фон карточки. */
#cpPaneRect .cp-chart,
#cpPaneRect .rc-ev-col{background:var(--card-hi);border-radius:12px;
  box-shadow:0 1px 2px rgba(89,59,59,.05),0 2px 8px rgba(89,59,59,.05)}
:root[data-theme="dark"] #cpPaneRect .cp-chart,
:root[data-theme="dark"] #cpPaneRect .rc-ev-col{
  box-shadow:0 1px 2px rgba(0,0,0,.22),0 2px 8px rgba(0,0,0,.24)}
#cpPaneRect .cp-chart{padding:14px 16px}
#cpPaneRect .rc-fld{background:var(--card-hi2);
  box-shadow:0 1px 2px rgba(89,59,59,.05),0 2px 8px rgba(89,59,59,.05)}
:root[data-theme="dark"] #cpPaneRect .rc-fld{
  box-shadow:0 1px 2px rgba(0,0,0,.22),0 2px 8px rgba(0,0,0,.24)}
/* события: внутренний слой отступает внутрь карточки */
#cpPaneRect .rc-ev-inner{inset:14px}
/* D-9 опускаем на одно поле — карты на одном уровне (см. rc-col-2) */
#cpPaneRect .rc-col-2{padding-top:14px;margin-top:61px}
/* режим транзита: карточка под кнопкой, заголовок, карта на уровне других карт.
   Контейнер растянут на всю колонку (flex:1); авто-отступ — на ЗАГОЛОВКЕ, а не
   на карте, поэтому именно он съедает свободное место и подтягивает связку
   «заголовок + карта» к низу. Нижний край карты остаётся там же, где и был
   (совпадает с нижним краем D-1/D-9) — само поле и карта в размере не меняются,
   кнопка «Назад» (над списком, вне этого блока) не затрагивается вовсе. */
.rc-ev-transit{display:flex;flex-direction:column;flex:1;min-height:0}
.rc-ev-selcard{margin-top:12px}
/* специфичнее .rc-fh (margin:0 0 12px ниже по файлу) — иначе margin-top:0
   из общего правила перебивал бы auto по порядку каскада */
.rc-ev-transit .rc-fh{margin-top:auto}
/* символ орбиты слева от текста — как у cpTIcon1 на вкладке «Транзит» */
.rc-ev-transit-h{display:flex;align-items:center;gap:6px}
/* +2px по бокам: у поля событий внутренний отступ 14px, у карт — 16px; так карта
   транзита совпадает по ширине с D-1/D-9, а значит и по верхнему краю */
.rc-ev-transit .chart-host{padding:0 2px}
/* прозрачный фон самого SVG-графика: его bg-прямоугольник fill="var(--card)" →
   transparent, чтобы под ним просвечивал фон карточки (card-hi). .chart-edge
   (восточный стиль) сюда не входит — эти узкие полоски маскируют шов клипа
   по краю карты и должны остаться НЕПРОЗРАЧНЫМИ, просто в тон карточки. */
#cpPaneRect .chart-host svg [fill="var(--card)"]:not(.chart-edge){fill:transparent}
#cpPaneRect .chart-host svg .chart-edge{fill:var(--card-hi)}

/* Нижние поля — раздельными карточками, ФИКСИРОВАННОЙ сеткой (пиксели, не fr):
   панча-таттва слева и тянется на всю высоту; сурья по центру (сдвинута
   вправо), под ней «Рождение невозможно»; пранапада справа, под ней кунда.
   Ширины в px — раскладка не переезжает при смене ширины окна. */
/* Три колонки ПРОПОРЦИОНАЛЬНОЙ ширины (fr в пропорции 390:756:532 — панча :
   сурья : кунда). Сетка заполняет контейнер целиком, поэтому левый край панчи и
   правый край кунды симметричны (поля = отступ карточек), ничего не вылезает за
   поле и нет горизонтального скролла. Так же ведут себя карты наверху.
   Колонки независимы по высоте (внутри flex), отступ между полями = 44px. */
/* Пропорции: панча и сурья шире, правая колонка уже. Пранапада и кунда — во всю
   ширину своей колонки, поэтому их правый край совпадает с правым краем поля
   (симметрично левому отступу панча-таттвы). */
.rc-lower{display:grid;margin-top:44px;gap:44px 26px;align-items:start;
  grid-template-columns:460fr 780fr 600fr}
.rc-col{display:flex;flex-direction:column;gap:44px;min-width:0}
.rc-col-a .rc-fld2{width:100%}
.rc-col-b .rc-area:first-child .rc-fld2{width:100%}     /* сурья — вся колонка */
.rc-col-b .rc-area:last-child  .rc-fld2{width:66.7%}    /* рождение невозможно — уже */
.rc-col-c .rc-area:first-child .rc-fld2{width:100%}     /* пранапада — вся колонка */
.rc-kunda-area .rc-fld2{width:100%}                     /* кунда — вся колонка */
.rc-area{min-width:0}
/* название поля — НАД карточкой; левый край по центру радиуса скругления (12px) */
.rc-fh{font-family:var(--sans);font-size:16px;font-weight:700;color:var(--text);
  margin:0 0 12px;padding-left:12px}
/* карточка поля — отдельным фоном, светлее поля, без обводок */
.rc-fld2{background:var(--card-hi);border-radius:12px;padding:12px 16px;min-width:0;
  box-shadow:0 1px 2px rgba(89,59,59,.05),0 2px 8px rgba(89,59,59,.05)}
:root[data-theme="dark"] .rc-fld2{box-shadow:0 1px 2px rgba(0,0,0,.22),0 2px 8px rgba(0,0,0,.24)}

.rc-tbl{font-size:13.5px;line-height:18px;width:100%}
.rc-tbl td,.rc-tbl th{padding:5px 8px}
/* без заголовков-строк верхняя граница первой строки — лишняя линия сверху */
#cpRYamas tbody tr:first-child td,
#cpRSurya tbody tr:first-child td,
#cpRDead  tbody tr:first-child td{border-top:0}
/* колонки по центру; первый столбец (название) — по левому краю */
.rc-tbl-c td,.rc-tbl-c th{text-align:center}
.rc-tbl-c td:first-child,.rc-tbl-c th:first-child{text-align:left}
.rc-tbl-c .cp-num{text-align:right;white-space:nowrap}
/* пранапада/кунда — фиксированная разметка колонок: шапка встаёт ровно над
   данными, а не «плывёт» по ширине содержимого */
.rc-tbl-fx{table-layout:fixed}
.rc-tbl-fx td,.rc-tbl-fx th{text-align:center;overflow:hidden}
.rc-tbl-fx td:first-child,.rc-tbl-fx th:first-child{text-align:left}
/* шапка таблицы — обычным регистром, приглушённая */
.rc-hd th{color:var(--text2);font-weight:600;font-size:11px;padding-bottom:8px;
  border:0;white-space:nowrap}
/* Выравнивание шапки задаём с повышенной специфичностью: базовое .cp-table th
   стоит в CSS позже и при равной специфичности перебивало center на left.
   Кунда: «Показатель» слева, «Дом» и «Время» по центру своих колонок. */
.rc-tbl-fx .rc-hd th{text-align:center}
.rc-tbl-fx .rc-hd th:first-child{text-align:left}
/* текущая строка — тёплой заливкой, без обводок */
.rc-tbl .rc-cur td{background:var(--accent-soft)}
.rc-tbl .rc-cur .cp-pl{color:var(--accent);font-weight:700}
/* заливка текущего пункта скругляется, если он верхний или нижний в поле —
   иначе острый угол заливки спорит со скруглением карточки */
.rc-tbl tr.rc-cur:first-child td:first-child{border-top-left-radius:8px}
.rc-tbl tr.rc-cur:first-child td:last-child{border-top-right-radius:8px}
.rc-tbl tr.rc-cur:last-child td:first-child{border-bottom-left-radius:8px}
.rc-tbl tr.rc-cur:last-child td:last-child{border-bottom-right-radius:8px}
/* знак по правилу, который в эту четверть реально не восходит */
/* знаки лагны — в одну строку без переноса (иногда их три) */
.rc-sgs{white-space:nowrap}
.rc-sg{color:var(--text);font-weight:600}
.rc-sg-off{color:var(--text3);opacity:.65}
.rc-sl{color:var(--text3);margin:0 4px}
.rc-no{color:var(--err)}
.rc-none{color:var(--text2);text-align:center}
/* таттвы текущей йамы — с отступом; без курсива, отступ чуть больше */
.rc-tbl .rc-tt td{border-top:0;padding-top:3px;padding-bottom:3px}
.rc-tbl .rc-tt .cp-pl{padding-left:34px;font-weight:400}
/* Кунда — «Дом»: число строго по центру колонки (значит и под заголовком «Дом»),
   галочка — абсолютом слева, на положение числа НЕ влияет. */
.rc-h{position:relative;display:inline-block;min-width:1.2em;text-align:center;font-weight:700}
.rc-h .num{font-weight:700}
.rc-h .chk{position:absolute;right:calc(100% + 5px);top:0;color:var(--ok);font-weight:700}

/* ── Пранапада: группировка по варге (как в приложении, app.js:14161) ──
   Метка варги вертикально по центру своей группы; многострочные группы
   подсвечены; тонкие разделители между строками внутри группы, между группами —
   линия потолще. Заголовок и три колонки — одна ширина в трети. */
.rc-pp2{font-family:var(--sans);font-size:13.5px}
.rc-pp2-head{display:grid;grid-template-columns:1fr 1fr 1fr;padding:0 0 8px}
.rc-pp2-head span{color:var(--text2);font-weight:600;font-size:11px}
.rc-pp2-head .k{text-align:center}
.rc-pp2-head .h{text-align:right;padding-right:6px}
/* группа варги: 1fr метка + 2fr строки; метка по центру группы по вертикали */
.rc-pp2-grp{display:grid;grid-template-columns:1fr 2fr;align-items:center;
  border-top:1px solid var(--line)}
.rc-pp2-grp.hl{background:var(--accent-soft)}
.rc-pp2-grp.hl-bot{border-radius:0 0 8px 8px}
.rc-pp2-v{padding-left:4px;color:var(--text2);font-weight:600}
.rc-pp2-rows{display:flex;flex-direction:column}
/* строка группы: карака по центру, дом справа */
/* межстрочный интервал сокращён, чтобы высота пранапады совпала с сурьёй */
.rc-pp2-sub{display:grid;grid-template-columns:1fr 1fr;align-items:center;
  padding:3.8px 0;position:relative}
/* тонкий разделитель между строками одной группы — со сдвигом, не под меткой */
.rc-pp2-sub + .rc-pp2-sub::before{content:'';position:absolute;top:0;left:6%;right:0;
  border-top:1px solid var(--line)}
.rc-pp2-k{text-align:center;color:var(--text);font-weight:600}
.rc-pp2-h{text-align:right;padding-right:6px;white-space:nowrap}
/* число дома right-aligned — позиция фиксирована; галочка слева не двигает его; жирное */
.rc-pp2-num{display:inline-block;min-width:1.2em;text-align:right;margin-left:8px;font-weight:700}
.rc-ok{color:var(--ok);font-weight:700}
/* координаты знака кунды — приглушённо, шрифт в 1.4 меньше, отступ от названия */
.rc-kc{color:var(--text2);font-variant-numeric:tabular-nums;font-weight:400;
  white-space:nowrap;margin-left:12px;font-size:0.71em}

/* время внутри поля — кнопка отскока: клик переносит момент на границу.
   Без подчёркиваний — простой акцентный текст. */
/* размер времени = размеру названия в той же строке (наследуем от ячейки) */
.rc-t{border:0;background:none;cursor:pointer;padding:0;
  font-family:var(--sans);font-size:inherit;font-weight:600;color:var(--accent);
  font-variant-numeric:tabular-nums;transition:color .15s ease}
.rc-t:hover{color:var(--text)}
.rc-sep{color:var(--text3)}
@media (prefers-reduced-motion:reduce){ .rc-t{transition:none} }

/* ── Транзит ──
   Шапка = строка ректификации без «Сохранить»: слева «Сбросить» (и её невидимый
   близнец справа — держит дату/время по центру), по центру дата/время/шаг/±.
   Две карты + таблица транзитов идут в той же сетке cp-row-two (три колонки
   вровень). Ниже — планеты на ширину двух карт и панчанга под таблицей. */

/* Карты И карточки-поля (таблица транзитов, планеты, панчанга) — в одном тоне:
   фон светлее поля (--card-hi, как «Панча-таттва» в ректификации), скругление,
   мягкая тень. Поля лагны/накшатры внутри карт — ещё на ступень светлее
   карточки (--card-hi2), с той же мягкой тенью. Всё — точно как в
   ректификации (тот же приём). «Варшапхала» оформлена так же (карты, планеты,
   мудда-даша) — тот же приём, тот же селектор; управители года используют
   .rc-fld2 напрямую (та же карточка, но класс уже глобальный, свой селектор
   тут не нужен). */
#cpPaneTransit .cp-chart,
#cpPaneTransit .tr-tablewrap,
#cpPaneVarsha .cp-chart,
#cpPaneVarsha .tr-tablewrap{background:var(--card-hi);border-radius:12px;
  box-shadow:0 1px 2px rgba(89,59,59,.05),0 2px 8px rgba(89,59,59,.05)}
#cpPaneTransit .cp-chart,
#cpPaneVarsha .cp-chart{padding:14px 16px}
:root[data-theme="dark"] #cpPaneTransit .cp-chart,
:root[data-theme="dark"] #cpPaneTransit .tr-tablewrap,
:root[data-theme="dark"] #cpPaneVarsha .cp-chart,
:root[data-theme="dark"] #cpPaneVarsha .tr-tablewrap{
  box-shadow:0 1px 2px rgba(0,0,0,.22),0 2px 8px rgba(0,0,0,.24)}
#cpPaneTransit .rc-fld{background:var(--card-hi2);
  box-shadow:0 1px 2px rgba(89,59,59,.05),0 2px 8px rgba(89,59,59,.05)}
:root[data-theme="dark"] #cpPaneTransit .rc-fld{
  box-shadow:0 1px 2px rgba(0,0,0,.22),0 2px 8px rgba(0,0,0,.24)}
/* прозрачный фон самого SVG-графика — просвечивает фон карточки.
   .chart-edge (восточный стиль) — исключение, см. #cpPaneRect выше:
   маскирует шов клипа, должен остаться непрозрачным, в тон карточки. */
#cpPaneTransit .chart-host svg [fill="var(--card)"]:not(.chart-edge),
#cpPaneVarsha .chart-host svg [fill="var(--card)"]:not(.chart-edge){fill:transparent}
#cpPaneTransit .chart-host svg .chart-edge,
#cpPaneVarsha .chart-host svg .chart-edge{fill:var(--card-hi)}
/* первая строка каждой таблицы внутри карточки — без верхней линии: заголовок
   уже отделён отступом, вторая линия сверху была бы лишней (как в rc-tbl) */
#cpTTable tbody tr:first-child td,
#cpTPlanets tbody tr:first-child td,
#cpTPanch tbody tr:first-child td,
#cpVPlanets tbody tr:first-child td,
#cpVDashas tbody tr:first-child td{border-top:0}
/* Мудда-даша: колонка дат — по правому краю */
#cpVDashas .cp-num{text-align:right}

/* Планеты: короткие колонки (планета, карака, координаты, шад-бала) —
   тесной шириной, без гуляющего негативного пространства; накшатра — с
   запасом под самое длинное имя без переноса. Значения и заголовки — по
   центру (кроме накшатры: длинной строке легче читаться от левого края). */
#cpTPlanets{table-layout:fixed}
#cpTPlanets th,#cpTPlanets td{text-align:center}
#cpTPlanets th:nth-child(5),#cpTPlanets td:nth-child(5){text-align:left}
#cpTPlanets th:nth-child(1),#cpTPlanets td:nth-child(1){width:11%}
#cpTPlanets th:nth-child(2),#cpTPlanets td:nth-child(2){width:10%}
#cpTPlanets th:nth-child(3),#cpTPlanets td:nth-child(3){width:15%}
#cpTPlanets th:nth-child(4),#cpTPlanets td:nth-child(4){width:14%}
#cpTPlanets th:nth-child(5),#cpTPlanets td:nth-child(5){width:37%}
#cpTPlanets th:nth-child(6),#cpTPlanets td:nth-child(6){width:13%}

/* Планеты варшапхалы — все колонки (включая накшатру) по центру, без
   исключений, в отличие от таблицы транзита выше. */
#cpVPlanets th,#cpVPlanets td{text-align:center}

/* строка кнопок карты (варга+символ слева, аштакаварга+стиль справа) —
   символ «чья карта» стоит рядом с кнопкой варги, а не по центру строки */
.tr-topleft{display:flex;align-items:center;gap:8px}
.tr-topright{display:flex;align-items:center;gap:10px}
/* аштакаварга — та же кнопка, что и варга/стиль рядом; активная подсвечивается */
.tr-av-btn.on .combo-name{color:var(--accent)}
/* меню аштакаварги — узкое, 2-буквенные метки по центру */
#cpTAvMenu{min-width:96px}
#cpTAvMenu .combo-opt{text-align:center}

/* Транзиты планет: название — НАД полем (как «Панча-таттва» и пр. в
   ректификации), переключатель режима — в той же строке, справа, кнопкой
   пониже обычной, чтобы не спорить высотой с заголовком. */
.tr-side{min-width:0}
.tr-thead{display:flex;align-items:center;justify-content:space-between;gap:12px;
  margin:0 0 12px;padding-left:12px}
.tr-fh{margin:0;padding:0}
.tr-mode-sel .combo-pick{padding:3px 11px;font-size:11.5px}
/* поле — карточка (та же порода, что rc-fld2 у нижних блоков ректификации) */
.tr-tablewrap{min-width:0}
/* таблица транзитов: планета слева, режим по центру, промежуток дат справа.
   Шрифт крупнее общего (line-height таблицы не трогаем — гоняем только
   размер символов, как везде на сайте), дата — крупнее и заметнее времени;
   секунды под датой — по центру относительно даты, а не по краю. */
.tr-table td{vertical-align:middle}
.tr-c2{text-align:center;color:var(--text2)}
.tr-dates{display:flex;align-items:center;justify-content:flex-end;gap:10px;white-space:nowrap}
.tr-sep{align-self:center}
.tr-dt{display:inline-flex;flex-direction:column;align-items:center;
  line-height:1.05;gap:1px;padding:2px 0}
.tr-dt-d{font-size:16.5px;font-weight:400;font-variant-numeric:tabular-nums}
.tr-dt-t{font-size:12.5px;font-weight:600;color:var(--text2);font-variant-numeric:tabular-nums}
.tr-dt:hover .tr-dt-t{color:var(--text)}

/* панчанга: параметр · значение · правитель · промежуток */
.tr-pval{color:var(--text)}
.tr-ruler{font-weight:700;color:var(--accent);white-space:nowrap}
/* нижний ряд: планеты и панчанга. Панчанге отдано больше доли — у планет
   (2-буквенные имена, DMS-координаты, шад-бала-проценты) много свободного
   места даже в узкой колонке, у панчанги строки длиннее и с промежутком дат. */
.tr-lower{display:grid;gap:44px 26px;margin-top:44px;align-items:start;
  grid-template-columns:minmax(0,55fr) minmax(0,45fr)}
.tr-planets{min-width:0}
.tr-panch{min-width:0}
.tr-tajika{min-width:0}
/* Таджака-йоги: список внутри поля-карточки .rc-fld2 — без своей карточки на
   каждую йогу, разделены линией (не во всю ширину поля, margin — как везде,
   см. .cp-set-hline). */
.taj-list{display:flex;flex-direction:column}
.taj-item{padding:12px 3px;margin:0 10px}
.taj-item+.taj-item{border-top:1px solid var(--line)}
.taj-head{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 10px;
  font-family:var(--sans);font-size:13.5px}
.taj-name{font-weight:700;color:var(--text)}
.taj-planets{color:var(--text)}
.taj-aspect{color:var(--accent);font-size:12.5px;font-weight:600}
.taj-gap{color:var(--text2);font-size:12px}
.taj-tag{font-family:var(--sans);font-size:11px;font-weight:600;color:var(--accent);
  background:var(--accent-soft);border-radius:999px;padding:2px 9px}
/* Описание блоками: условие (обычный текст, у модификаторов жирное имя) и под
   ним значение чуть крупнее. Оба обычным цветом (не приглушённым). */
.taj-desc{margin-top:8px;display:flex;flex-direction:column;gap:9px}
/* Строка формирования (условие) — от левого края, курсивом; название прямое */
.taj-cond{font-family:var(--sans);font-size:12.5px;line-height:17px;color:var(--text);font-style:italic}
.taj-cond strong{font-weight:700;font-style:normal}
/* Значение — с отступом слева и широким тире в начале */
.taj-res{font-family:var(--sans);font-size:15px;line-height:20px;color:var(--text);
  margin-top:3px;padding-left:3ch}
.taj-res::before{content:"— "}
.taj-sub{font-family:var(--sans);font-size:12px;font-weight:700;color:var(--text2);
  text-transform:none;margin:4px 0 0;padding-left:2px}
.taj-empty{font-family:var(--sans);font-size:13px;color:var(--text2);margin:0}
/* Левая колонка варшапхалы: планеты, под ними — сахамы, одним столбцом.
   Сахамы поднимаются прямо под планеты и не ждут высокий столбец таджака-йог. */
.tr-colL{min-width:0;display:flex;flex-direction:column;gap:44px}
/* Сахамы — без шапки и без обводок, различаем заливкой/наведением. Колонки:
   имя · значение · градусы · знак · накшатра. Значение отцентровано. Линию над
   первой строкой убираем — блок начинается сразу с данных. */
.tr-sahamas{min-width:0}
.cp-saham td{padding-top:5px;padding-bottom:5px;white-space:nowrap}
.cp-saham tbody tr:first-child td{border-top:none}
.cp-saham tbody tr:hover{background:var(--card-hi2)}
/* Упаграхи и Сахамы Джанмы — свой блок со своей шапкой (не приезжают следом
   за таблицей планет, как у Варшапхалы), поэтому линию под шапкой возвращаем. */
#cpUpagrahas tbody tr:first-child td,
#cpJanmaSahamas tbody tr:first-child td{border-top:1px solid var(--line)}
.sah-name{font-weight:600;color:var(--text)}
.sah-ru{color:var(--text2)}
/* Фиксированные пропорции колонок (иначе auto-layout раздувал «Сахаму» на
   пустое место): имя · значение · координаты · знак · накшатра. */
#cpJanmaSahamas,#cpVSahamas{table-layout:fixed}
.sah-deg{font-variant-numeric:tabular-nums;color:var(--text)}
.sah-sign{color:var(--text)}
.sah-nak{color:var(--text2)}
.cp-chart{min-width:0}
/* «2 карты + периоды» (Джанма): поле периодов ложится третьей картой поверх
   карты D-60 — тот же приём, что у Мудда-даши на Варшапхале (.cp-vside):
   абсолютно внутри relative-родителя, высоту берёт от ряда карт, скроллится
   само, соседние карты не двигая. */
.cp-chart-slot3{position:relative}
.cp-janma-periods{position:absolute;inset:0;display:flex;flex-direction:column;min-height:0}
/* Даты периода — по правому краю (тот же приём, что #cpVDashas у Мудда-даши
   на Варшапхале): у Чара/Нараяна знак теперь пишется полным именем и разной
   длины на разных языках, левый край дат «гулял» бы вместе с ним — правое
   выравнивание держит колонку дат ровной независимо от длины подписи знака. */
#cpJanmaPeriodsTable .cp-num{text-align:right}
/* Обрезаем ТОЛЬКО четвёртую карту, пока её колонка нулевой ширины: иначе её
   кнопки торчали бы наружу. На остальных overflow:hidden обрезал выпадающие
   списки (они выше карты) — из-за этого списки варг и «поломались».
   Класс .unclip снимает обрезку после раскрытия — его ставит JS по таймеру,
   потому что overflow не анимируется и снимать его сразу нельзя. */
.cp-row-main > .cp-chart:nth-child(4){overflow:hidden}
.cp-charts.unclip .cp-row-main > .cp-chart:nth-child(4){overflow:visible}
/* Раскрытый нижний ряд тоже перестаёт обрезать: иначе он режет выпадающие
   списки карт 5–8 (слой схлопывается через overflow, и в открытом виде он
   больше не нужен). */
.cp-charts.unclip .cp-extra-inner{overflow:visible}
.cp-chart-top{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:14px}
.cp-col{min-width:0}                       /* иначе таблица распирает колонку */
.cp-sel{position:relative}
.cp-sel .combo-pick{border-radius:999px;padding:7px 13px;font-size:13px;
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  box-shadow:inset 0 1px 0 var(--glass-hi),0 3px 8px rgba(60,40,30,.10)}
.cp-sel .combo-pick::after{content:none}   /* тут разделитель ни к чему */
/* список варг: шире — чтобы «Чатурвимшамша» не переносилась; без прокрутки —
   все 16 карт видны разом */
.cp-menu{min-width:232px}
/* Списки гаснут плавно: hidden убирает элемент мгновенно, поэтому сначала
   снимаем .show (затухание), а прячем уже после него — см. hideNow в chart-page.js */
.cp-sel .combo-menu{opacity:0;transform:translateY(-4px);
  transition:opacity .16s ease,transform .16s ease}
.cp-sel .combo-menu.show{opacity:1;transform:none}
.cp-sel .combo-menu.up{transform:translateY(4px)}
.cp-sel .combo-menu.up.show{transform:none}
@media (prefers-reduced-motion:reduce){
  .cp-sel .combo-menu{transition:none}
}
/* Меню выбора системы (.rc-dashasel, см. выше) — компактнее по ширине, там
   всего 2 коротких варианта, а не длинный список, как у обычных .cp-menu
   (min-width:232px). left не подобрать фиксированным в CSS — кнопка сама
   центрирована в широкой резиновой ячейке и меняет ширину от текста
   («Вимшоттари» ýже «Йогини»), поэтому левый край меню (по стрелке на
   кнопке) выставляет JS при каждом открытии — см. setOpen в chart-page.js.
   Шрифт пунктов — крупнее общего .combo-opt (14px): рядом с 21px-подписью
   в шапке мелкий текст терялся. */
.rc-dashasel .combo-menu{min-width:0;width:max-content}
.rc-dashasel .combo-menu .combo-opt{font-size:18px;padding:9px 14px}
.cp-menu-r{min-width:0;width:max-content}   /* стили короткие — меню по тексту */
/* меню открывается вверх, когда снизу не хватает места (класс ставит JS) */
.combo-menu.up{top:auto;bottom:100%;margin-top:0;margin-bottom:6px}
.cp-menu .combo-opt{white-space:nowrap}
.cp-menu-r{left:auto;right:0}              /* меню стиля не должно уезжать за край */
/* «Настройки»: айанамша, локация и продолжительность года — формой как поле
   ввода в шапке (10px, стеклянная заливка, крупный шрифт), во всю ширину ячейки */
.cp-set-sel{width:100%}
.cp-sel-rect .combo-pick{width:100%;justify-content:space-between;border-radius:10px;
  padding:12px 14px;font-size:16px;font-weight:500;
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  box-shadow:inset 0 1px 0 var(--glass-hi),0 4px 12px rgba(60,40,30,.12)}
.cp-sel-rect .combo-pick::after{content:none}
.cp-sel-rect .combo-name{white-space:normal;text-align:left}
/* длинные списки (аянамша — 15 строк) не должны уезжать за поле и обрезаться
   его overflow: держим высоту и даём прокрутку, ширина — по ячейке */
.cp-menu-scroll{left:0;right:0;min-width:0;width:100%;max-height:264px;overflow-y:auto}
.cp-menu-scroll .combo-opt{white-space:normal}
.cp-sel-inline{margin:0}
.cp-tt{font-size:20px;margin:30px 0 14px}

.cp-tablewrap{overflow-x:auto}             /* узкий экран: таблица скроллится сама */
/* шрифт крупнее, а межстрочный интервал прежний — поэтому line-height задан
   в пикселях (21.6px = прежние 13.5px × 1.6), а не множителем */
.cp-table{width:100%;border-collapse:collapse;font-family:var(--sans);font-size:15.5px;
  line-height:21.6px}
/* Шапки таблиц — обычным регистром, как все заголовки на странице.
   Разрядка была нужна капсу; без него она только рвёт слово. */
.cp-table th{text-align:left;font-size:12.5px;
  color:var(--text);font-weight:700;padding:0 10px 10px;white-space:nowrap}
.cp-table td{padding:9px 10px;color:var(--text);border-top:1px solid var(--line)}
/* планеты плотнее: у них разделитель под каждой строкой, и с прежним отступом
   таблица дышала заметно шире периодов */
#cpPlanets td{padding-top:5px;padding-bottom:5px}
.cp-table .cp-pl{color:var(--text);font-weight:600;white-space:nowrap}
/* даты и накшатры не переносим — строка должна читаться целиком */
.cp-table .cp-num{font-variant-numeric:tabular-nums;white-space:nowrap}
.cp-table .cp-nak{white-space:nowrap}
.cp-table .cp-kar{font-family:'Bitter';font-style:italic}
/* Бала — 3 карточки (см. .cp-cards3): Шад-бала (комплексная, шире остальных —
   скроллится сама внутри своей карточки), Вимшопака и Вайшешикамша+Варготтама. */
.cp-balawrap{overflow-x:auto}
.cp-baltable{min-width:900px}
.cp-baltable th,.cp-baltable td{text-align:right}
.cp-baltable th:first-child,.cp-baltable td:first-child{text-align:left}
.cp-baltable .cp-balmain{font-weight:600}
.cp-vimtable th,.cp-vimtable td,.cp-vaitable th,.cp-vaitable td{text-align:right}
.cp-vimtable th:first-child,.cp-vimtable td:first-child,
.cp-vaitable th:first-child,.cp-vaitable td:first-child{text-align:left}
.cp-r{color:var(--err);font-weight:700}
.cp-yrs{color:var(--text2);font-weight:400}
/* без <thead> — таблица начинается сразу с данных, линии над первой строкой
   быть не должно (см. память table-first-row-divider — сюда же .cp-saham). */
.cp-dasha tbody tr:first-child td{border-top:none}
.cp-dasha .cp-maha,.cp-dasha .cp-antar,.cp-dasha .cp-prat{cursor:pointer;transition:background .15s ease}
.cp-dasha .cp-maha:hover,.cp-dasha .cp-antar:hover,.cp-dasha .cp-prat:hover{background:var(--accent-soft)}
.cp-dasha .open > .cp-pl{color:var(--accent)}
/* текущий период (сейчас идёт) — стойкая заливка, не только по наведению */
.cp-dasha .cp-cur{background:var(--accent-soft)}
.cp-dasha .cp-cur .cp-pl{color:var(--accent);font-weight:700}
/* вложенность — отступом слева; цвет у всех уровней обычный, не приглушённый */
.cp-dasha .cp-antar td{border-top:0}
.cp-dasha .cp-antar .cp-pl{padding-left:26px}
.cp-dasha .cp-prat td{border-top:0}
.cp-dasha .cp-prat .cp-pl{padding-left:46px}
.cp-dasha .cp-sook td{border-top:0;padding-top:4px;padding-bottom:4px}
.cp-dasha .cp-sook .cp-pl{padding-left:66px;font-weight:400}
.cp-wait td{border-top:0;text-align:center}
.cp-ck{font-weight:600;color:var(--accent)}
.cp-r{font-size:.6em;font-weight:400;color:var(--err)}

/* плавное появление/исчезновение уровней периодов — не только прозрачность,
   но и лёгкое сползание сверху, иначе строки при мелком шаге фейда всё равно
   читаются как «выскочившие», а не раскрывшиеся. */
@keyframes cp-in{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}
.cp-dasha .cp-new{animation:cp-in .22s ease both}
.cp-dasha .cp-out{opacity:0;transform:translateY(-5px);transition:opacity .18s ease,transform .18s ease}
@media (prefers-reduced-motion:reduce){
  .cp-dasha .cp-new{animation:none}
  .cp-dasha .cp-out{transition:none}
}

/* Подвкладки Варшапхалы (4) и Транзита (5) — та же .cp-subtabs, что у Джанмы
   (repeat(6,1fr) по умолчанию), только со своим числом колонок. Подвкладки
   админки в личном кабинете (3) — тот же приём. */
#cpVSubtabs{grid-template-columns:repeat(4,1fr)}
#cpTSubtabs{grid-template-columns:repeat(5,1fr)}
#acctAdminSubtabs{grid-template-columns:repeat(3,1fr)}
/* кружок-уведомление у «Заявки»/«Пользователи» (см. updateSubtabFlag/
   markSubtabSeen в account.html) и у имени в шапке сайта (см.
   checkAdminHeaderFlag в auth.js) — одна и та же метка «просмотрено» */
.cp-subtab-flag{display:inline-block;width:6px;height:6px;margin-left:5px;
  margin-bottom:1px;border-radius:50%;background:var(--accent);vertical-align:middle}

/* События (вкладка «Транзит», третья колонка ряда карт — там же раньше стояли
   «Транзиты планет») — заголовок+поиск фиксированы, лента скроллится в
   .cp-vside-scroll (тот же приём, что у Мудда-даши на «Варшапхале»). */
.tr-ev-head{margin-bottom:10px}
.tr-ev-head .rc-fh{margin:0}
/* Поиск — на всю ширину карточки, крестик сброса появляется внутри поля
   справа, только когда есть ввод (см. cpEvSearchClear в chart-page.js). */
.tr-ev-search-wrap{position:relative;margin-bottom:14px}
.tr-ev-search{width:100%;border:0;border-radius:999px;padding:8px 34px 8px 14px;
  font-family:var(--sans);font-size:13px;color:var(--text);
  background:linear-gradient(180deg,var(--glass-top),var(--glass-bot));
  box-shadow:inset 0 1px 0 var(--glass-hi),0 3px 8px rgba(60,40,30,.10)}
.tr-ev-search::placeholder{color:var(--text2)}
.tr-ev-search-clear{position:absolute;right:5px;top:50%;transform:translateY(-50%);
  width:22px;height:22px;border:0;border-radius:50%;background:none;cursor:pointer;
  color:var(--text2);font-size:17px;line-height:1;display:flex;align-items:center;justify-content:center;
  transition:color .15s ease}
.tr-ev-search-clear:hover{color:var(--text)}
.tr-ev-search-clear[hidden]{display:none}
.tr-ev-list{display:flex;flex-direction:column}
.tr-ev-row{display:flex;align-items:center;gap:14px;padding:10px 2px}
.tr-ev-row+.tr-ev-row{border-top:1px solid var(--line)}
.tr-ev-row[hidden]{display:none}
.tr-ev-date{flex:none}
.tr-ev-body{min-width:0}
.tr-ev-name{display:flex;align-items:center;gap:6px;font-family:var(--sans);
  font-size:14px;font-weight:600;color:var(--text)}
.tr-ev-sub{margin-top:2px;font-family:var(--sans);font-size:12.5px;color:var(--text2)}

/* Метки в строке Титхи «подробной» панчанги транзита — пост на день экадаши,
   значок Солнца/Луны + «Затмение» на затменную дату. Пустая ячейка у
   остальных строк (см. tr-mark в chart-page.js) держит колонки на месте. */
.tr-mark{white-space:nowrap}
.tr-mark-fast,.tr-mark-ecl{display:inline-flex;align-items:center;gap:4px;
  font-family:var(--sans);font-size:11.5px;font-weight:700;font-style:italic;
  color:var(--accent);background:var(--accent-soft);border-radius:999px;padding:2px 10px}
.tr-mark-fast+.tr-mark-ecl,.tr-mark-ecl+.tr-mark-fast{margin-left:6px}

/* ── адаптив ──
   Страница расчётов (.chart-page) в адаптиве НЕ участвует: она скрыта ниже
   1024px (см. .cp-desktop-only), а выше раскладка фиксированная и ничего не
   переезжает. Правила ниже — только для лендинга. */
@media (max-width:860px){
  /* авто-скрытие шапки/футера при скролле вниз — см. js/page-transition.js
     (html.kja-scroll-down переключается там, по направлению скролла).
     Только мобильный брейкпоинт: на десктопе шапка/футер должны стоять
     жёстко неподвижно всегда (см. их основные правила выше) — там это
     обсуждали отдельно и специально просили без всякого движения. */
  .site-head,.site-foot{transition:transform .25s ease}
  html.kja-scroll-down .site-head{transform:translateY(-100%)}
  html.kja-scroll-down .site-foot{transform:translateY(100%)}

  section{padding:56px 0}
  .nav{display:none}
  .hero-grid,.app-grid,.cons-grid,.study-grid{grid-template-columns:1fr;gap:34px}
  .cons-photo-slot{display:none}
  .lunar-side{position:static;max-width:420px;margin:0 auto;border-left:0;padding-left:0}
  .reviews,.modules{grid-template-columns:1fr;max-width:none}
  /* мобильный .study-grid — 1 колонка, фото не fixed (незачем — на телефоне
     нет отдельной прокручивающейся рядом колонки текста) — просто блок
     сверху. order работает только внутри flex/grid-контейнера — .study-photo
     здесь вне .study-grid (сиблинг в .wrap), поэтому сам .wrap на мобильном
     становится flex-колонкой, а order уже переставляет фото перед сеткой
     текста. Слот-плейсхолдер (.study-photo-slot) на мобильном не нужен —
     фото больше не в сетке ни на одном брейкпоинте. */
  .study .wrap{display:flex;flex-direction:column}
  .study-photo-slot{display:none}
  /* явный порядок: заголовок(0, по умолчанию) → фото(1) → текст+модули(2) —
     без этого order:-1 у фото поставил бы его ДО заголовка «Обучение». */
  .study-grid{order:2}
  .study-photo{position:static;order:1;overflow:visible;
    display:flex;align-items:center;justify-content:center}
  .study-photo-img{max-height:60vh;max-width:100%}
  /* мобильная .app-gallery (заголовок+кнопка+скрин) — та же логика, что у
     .study-photo выше: не fixed (нет отдельной колонки текста рядом),
     плейсхолдер не нужен, просто блок в потоке.
     Порядок: галерея (заголовок+скрин+лента миниатюр под ним) — сверху,
     текст — под ней. .app-grid/.app-gallery/.app-shot-row-frame — сиблинги
     в .wrap (не внутри друг друга), поэтому сам .wrap на мобильном
     становится flex-колонкой, а order уже расставляет их по местам (тот же
     приём, что у .study .wrap выше). */
  .app .wrap{display:flex;flex-direction:column}
  .app-gallery-slot{display:none}
  .app-gallery{position:static;gap:14px;order:1}
  .app-shot-big{height:60vh;max-height:480px}
  /* лента миниатюр — тоже не fixed на мобильном (незачем — под скрином,
     не поверх футера): просто следующий блок в потоке, сразу под галереей,
     уезжает вместе со страницей при скролле (и вместе с прячущимся
     футером — см. html.kja-scroll-down выше — а не остаётся висеть). */
  .app-shot-row-frame{position:static;order:2;margin-top:16px}
  .app-grid{order:3;margin-top:34px}
  /* десктопный запас под fixed-ленту+футер (см. .app{padding-bottom} выше)
     здесь не нужен — на мобильном ни лента, ни галерея не fixed, обычный
     отступ секции достаточен (второе значение совпадает с section{padding}
     из общего мобильного правила выше). */
  .app{padding-bottom:56px}
  /* без column: колонкой в 6 строк футер съедал бы половину маленького
     экрана. Перенос (flex-wrap, см. .foot-grid) сам сложит лишнее в 2-3
     строки компактнее. */
  .foot-grid{gap:6px 16px;font-size:11.5px}
}
@media (max-width:480px){
  body{font-size:16px}
  .wrap{padding:0 18px}
  .form-row{grid-template-columns:1fr}
  .city-more{height:auto;justify-content:flex-start;margin-top:2px}
}
/* без мыши наведения не будет — «Подробно» показываем всегда */
@media (hover:none){
  .card-more{opacity:1;transform:none;pointer-events:auto}
}

/* ── плашка cookie (Фаза 7) ──
   Минимальная — текст + одна кнопка «Понятно», без выбора категорий (сайт
   не ставит ничего сверх необходимого для входа/расчётов). Строится и
   вставляется в body из auth.js (initCookieBanner) — грузится на всех
   9 страницах сайта, лишней разметки в HTML не нужно. Снизу, position:fixed,
   свой z-index выше шапки (50) — иначе на длинных страницах перекрывалась
   бы контентом при скролле. */
.cookie-banner{position:fixed;left:0;right:0;bottom:0;z-index:70;
  display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:16px;
  padding:16px 24px;background:var(--card);box-shadow:0 -4px 20px rgba(0,0,0,.12)}
.cookie-banner p{margin:0;font-family:var(--sans);font-size:13.5px;color:var(--text2);
  max-width:640px}
.cookie-banner p a{color:var(--text);text-decoration:underline}
.cookie-banner .btn{flex:none}

/* ── индикатор pull-to-refresh (см. js/page-transition.js) ──
   Кружок под шапкой, изначально невидим (opacity:0, ставит JS по тому,
   насколько оттянули) и без transition на transform — движение пальца
   должно быть 1-в-1 с оттяжкой, ЖИВОЙ отклик, не запаздывающая анимация.
   opacity — transition, только когда отпустили (плавно пропадает/переходит
   в спиннер), а не во время самой оттяжки. */
.kja-ptr{position:fixed;top:var(--header-h, 64px);left:50%;
  width:34px;height:34px;margin-top:-17px;
  display:flex;align-items:center;justify-content:center;
  border-radius:50%;background:var(--card);box-shadow:var(--shadow);
  color:var(--accent);z-index:60;pointer-events:none;opacity:0;
  transition:opacity .2s ease}
.kja-ptr-loading{transition:none}
.kja-ptr-loading svg{animation:kja-ptr-spin .7s linear infinite}
@keyframes kja-ptr-spin{to{transform:rotate(360deg)}}

/* PWA: iOS standalone
   Стили установленного веб-приложения (display:standalone, см.
   manifest.webmanifest). Этот css — общий для всего сайта, отдельного файла
   у страниц приложения нет, поэтому правила html/body действуют везде.
   env(safe-area-inset-*) — вырез и домашняя полоса iPhone: шапка и футер
   position:fixed и без отступов уехали бы под них. Их фактическую высоту
   меряет js/page-transition.js (--header-h/--footer-h), поэтому компенсация
   на body{padding-top/-bottom} подстроится сама. */
html, body{overscroll-behavior:none}
body{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}
.site-head{padding-top:calc(env(safe-area-inset-top, 0px) + 0px)}
.site-foot{padding-bottom:calc(env(safe-area-inset-bottom, 0px) + 14px)}
/* Внутренние скроллеры страницы расчётов: overscroll-behavior:contain не даёт
   скроллу «протечь» на страницу, когда список докручен до края. Сам документ
   здесь не назван намеренно — он и есть основной скролл, но у него выше уже
   overscroll-behavior:none, и contain поверх none был бы шагом назад. */
.cp-vside-scroll,.cp-menu-scroll,.mc-list,.rc-ev-list,
.cp-tablewrap,.cp-balawrap{-webkit-overflow-scrolling:touch;overscroll-behavior:contain}
/* Выделение текста глобально НЕ отключаем — панчангу и таблицы нужно уметь
   скопировать. Снимаем только на управляющих элементах, где двойной тап
   выделял бы подпись кнопки вместо нажатия. */
.btn,.gp-btn,.cp-tab,.cp-subtab{-webkit-user-select:none;user-select:none}

