/* ── ШРИФТЫ ─────────────────────────────────────────────────────────────────
   Лежат у нас, а не на Google Fonts. Причины две. Первая: аудитория российская,
   а внешний CDN - непредсказуемая доступность на критическом пути отрисовки;
   если он молчит, приложение открывается системным шрифтом и теряет лицо.
   Вторая важнее: прежние Instrument Serif и Fraunces НЕ содержат кириллицы -
   38 и 21 правило в этом файле ссылались на шрифты, которые для русского текста
   не работали вовсе, и всё это время заголовки рисовались запасным Georgia.

   unicode-range оставлен от Google: браузер скачает кириллицу и латиницу
   раздельно и возьмёт только те подмножества, которые реально встретил в тексте.
   font-display:swap - текст виден сразу системным шрифтом и подменяется, когда
   файл доехал: пустой экран хуже неидеального шрифта. */
@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url('/static/fonts/inter-400-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url('/static/fonts/inter-400-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:swap;src:url('/static/fonts/inter-500-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:swap;src:url('/static/fonts/inter-500-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url('/static/fonts/inter-600-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url('/static/fonts/inter-600-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:700;font-display:swap;src:url('/static/fonts/inter-700-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Inter';font-style:normal;font-weight:700;font-display:swap;src:url('/static/fonts/inter-700-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Literata';font-style:normal;font-weight:400;font-display:swap;src:url('/static/fonts/literata-400-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Literata';font-style:normal;font-weight:400;font-display:swap;src:url('/static/fonts/literata-400-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Literata';font-style:normal;font-weight:500;font-display:swap;src:url('/static/fonts/literata-500-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Literata';font-style:normal;font-weight:500;font-display:swap;src:url('/static/fonts/literata-500-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Playfair Display';font-style:italic;font-weight:400;font-display:swap;src:url('/static/fonts/playfair-display-400-italic-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Playfair Display';font-style:italic;font-weight:400;font-display:swap;src:url('/static/fonts/playfair-display-400-italic-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:400;font-display:swap;src:url('/static/fonts/playfair-display-400-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:400;font-display:swap;src:url('/static/fonts/playfair-display-400-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:700;font-display:swap;src:url('/static/fonts/playfair-display-700-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:700;font-display:swap;src:url('/static/fonts/playfair-display-700-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}

    :root,[data-theme="light"]{
      /* Фон и поверхность разведены заметнее: при ΔL≈1% карточки не читались
         как карточки - светлый экран выглядел одной плоской заливкой. */
      --color-bg:#efece4;--color-surface:#fffdf8;--color-surface-2:#fbf9f3;
      --color-surface-offset:#f3f0ec;--color-border:#d4d1ca;--color-divider:#dcd9d5;--color-field-border:#a29c90;
      --color-text:#28251d;--color-text-muted:#726f6a;--color-text-faint:#bab9b4;
      --color-primary:#01696f;--color-primary-hover:#0c4e54;--color-primary-highlight:#cedcd8;
      --color-btn:#01696f;--color-btn-hover:#0c4e54;
      --color-error:#a12c7b;
      --gold:#a8842f;--gold-soft:#c8a24e;
      --shadow-sm:0 1px 3px rgba(0,0,0,.06);--shadow-md:0 8px 24px rgba(0,0,0,.1);
      --shadow-lg:0 18px 48px rgba(40,37,29,.14);
    }
    [data-theme="dark"]{
      --color-bg:#171614;--color-surface:#1c1b19;--color-surface-2:#201f1d;
      --color-surface-offset:#252422;--color-border:#393836;--color-divider:#262523;--color-field-border:#605d57;
      --color-text:#cdccca;--color-text-muted:#979694;--color-text-faint:#6b6a68;
      --color-primary:#4f98a3;--color-primary-hover:#227f8b;--color-primary-highlight:#313b3b;
      /* Отдельный фон заливной тил-кнопки: глубже яркого --color-primary, чтобы белый
         текст проходил AA (4.7:1). Сам --color-primary остаётся светлым - он нужен
         как тил-ТЕКСТ на тёмном, где притемнение ухудшило бы читаемость. */
      --color-btn:#237e8b;--color-btn-hover:#1c7581;
      --color-error:#d163a7;
      --gold:#d8b968;--gold-soft:#e3c987;
      --shadow-sm:0 1px 3px rgba(0,0,0,.25);--shadow-md:0 12px 32px rgba(0,0,0,.4);
      --shadow-lg:0 20px 56px rgba(0,0,0,.55);
    }
    :root{
      --font-display:'Playfair Display',Georgia,serif;--font-body:'Inter',system-ui,sans-serif;
      /* Гарнитура длинного чтения: книги разделов набраны ею целиком. Inter
         хорош для интерфейса, который сканируют, а главу читают подряд. */
      --font-read:'Literata',Georgia,serif;
      --text-xs:clamp(.75rem,.7rem + .2vw,.875rem);--text-sm:clamp(.875rem,.8rem + .3vw,1rem);
      --text-base:clamp(1rem,.95rem + .2vw,1.125rem);--text-lg:clamp(1.2rem,1.1rem + .5vw,1.5rem);
      --text-xl:clamp(1.5rem,1.2rem + 1.2vw,2.2rem);
      --r-sm:.375rem;--r-md:.5rem;--r-lg:.75rem;--r-xl:1rem;--r-full:9999px;
      --s1:.25rem;--s2:.5rem;--s3:.75rem;--s4:1rem;--s5:1.25rem;--s6:1.5rem;--s8:2rem;
      /* Safe-area (нотч/домашний индикатор). Telegram отдаёт свои inset'ы через JS
         в --tg-* переменные; здесь - фолбэк на env() для обычного браузера. */
      --safe-top:env(safe-area-inset-top,0px);--safe-bottom:env(safe-area-inset-bottom,0px);
      --tabbar-h:60px;
    }
    /* ── ЭКРАН «ОТКРОЙТЕ В TELEGRAM» ─────────────────────────────────────────
       Показывается вместо приложения, когда страницу открыли вне Telegram.
       Держится на тех же токенах, что и остальной продукт. */
    .gate{position:fixed;inset:0;z-index:9999;display:grid;place-items:center;
      padding:var(--s8) var(--s6);background:var(--color-bg)}
    .gate-inner{max-width:21rem;text-align:center}
    .gate-mark{width:72px;height:72px;margin-bottom:var(--s6);overflow:visible}
    .gate-crescent{fill:oklch(from var(--gold) l c h / .42)}
    .gate-luminary{fill:var(--gold);transform-box:fill-box;transform-origin:center;
      filter:drop-shadow(0 0 12px rgba(216,185,104,.45));
      /* Светило разгорается рядом с серпом - знак собирается на глазах. */
      animation:gate-rise 1.6s cubic-bezier(.22,.61,.36,1) both}
    @keyframes gate-rise{from{transform:scale(.7);opacity:0}to{transform:scale(1);opacity:1}}
    .gate-title{font:400 var(--text-xl)/1.15 var(--font-display);color:var(--color-text);
      letter-spacing:-.01em;margin-bottom:var(--s3)}
    .gate-text{font-size:var(--text-sm);line-height:1.65;color:var(--color-text-muted);
      margin-bottom:var(--s6)}
    .gate-btn{display:inline-block;padding:var(--s3) var(--s6);border-radius:var(--r-full);
      background:var(--color-btn);color:#fff;font-size:var(--text-sm);font-weight:500;
      text-decoration:none;transition:background .18s ease}
    .gate-btn:hover{background:var(--color-btn-hover)}
    .gate-btn:focus-visible{outline:2px solid var(--gold);outline-offset:3px}
    @media (prefers-reduced-motion:reduce){.gate-luminary{animation:none}}

    *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
    html{background:var(--color-bg)}
    body{min-height:100dvh;background:transparent;color:var(--color-text);font:var(--text-base)/1.6 var(--font-body);-webkit-font-smoothing:antialiased}
    /* ── ATMOSPHERE - фирменный фон «ночного неба» под всем контентом ── */
    #atmos{position:fixed;inset:0;z-index:-1;pointer-events:none;
      background:
        radial-gradient(120% 60% at 50% -12%, rgba(1,105,111,.07), transparent 55%),
        radial-gradient(90% 55% at 86% 4%, rgba(168,132,47,.06), transparent 55%),
        var(--color-bg);}
    [data-theme="dark"] #atmos{
      background:
        radial-gradient(125% 65% at 50% -12%, rgba(79,152,163,.18), transparent 55%),
        radial-gradient(95% 60% at 85% 6%, rgba(216,185,104,.10), transparent 55%),
        radial-gradient(120% 80% at 50% 120%, rgba(79,152,163,.08), transparent 55%),
        var(--color-bg);}
    /* Звёзды - только в тёмной теме, повторяющийся разреженный слой */
    [data-theme="dark"] #atmos::before{content:'';position:absolute;inset:0;
      background-image:
        radial-gradient(1.5px 1.5px at 15% 22%, rgba(255,255,255,.55), transparent 60%),
        radial-gradient(1.2px 1.2px at 62% 12%, rgba(227,201,135,.5), transparent 60%),
        radial-gradient(1px 1px at 82% 38%, rgba(255,255,255,.4), transparent 60%),
        radial-gradient(1.3px 1.3px at 35% 55%, rgba(255,255,255,.42), transparent 60%),
        radial-gradient(1px 1px at 88% 72%, rgba(227,201,135,.4), transparent 60%),
        radial-gradient(1.4px 1.4px at 22% 82%, rgba(255,255,255,.4), transparent 60%),
        radial-gradient(1px 1px at 55% 90%, rgba(255,255,255,.32), transparent 60%),
        radial-gradient(1.1px 1.1px at 70% 66%, rgba(255,255,255,.4), transparent 60%);
      background-size:680px 680px;background-repeat:repeat;}
    /* Плёночное зерно - убирает бандинг градиентов, даёт «материал» */
    #atmos::after{content:'';position:absolute;inset:0;opacity:.035;mix-blend-mode:overlay;
      background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");}
    [data-theme="dark"] #atmos::after{opacity:.06}
    @media (prefers-reduced-motion: no-preference){
      [data-theme="dark"] #atmos{animation:atmosBreathe 18s ease-in-out infinite}
      @keyframes atmosBreathe{0%,100%{opacity:1}50%{opacity:.9}}
    }
    /* ── Премиальные акценты (золото + глубина, сдержанно) ─────────── */
    .balance-pill svg{color:var(--gold-soft)}
    .result-card{box-shadow:var(--shadow-lg)}
    .home-daily{box-shadow:var(--shadow-md)}
    /* Тёплый край у геройских поверхностей - только в тёмной теме */
    /* «Свет сверху» на карточках в тёмной теме - материал, не плоскость */
    [data-theme="dark"] .numero-card,[data-theme="dark"] .radio-card,[data-theme="dark"] .dream-item{background:linear-gradient(180deg,oklch(from var(--color-surface-2) calc(l + .015) c h),var(--color-surface-2))}
    /* Геройская карта дня - центр «наслаждения»: тёплый градиент, золотой кант, свечение */
    [data-theme="dark"] .home-daily{background:linear-gradient(135deg,#24241f,#1a1b19 62%);box-shadow:0 16px 40px rgba(0,0,0,.5),inset 0 1px 0 oklch(from var(--gold-soft) l c h / .16)}
    [data-theme="dark"] .home-daily-card{box-shadow:0 8px 22px rgba(0,0,0,.4),0 0 0 1px oklch(from var(--gold) l c h / .25)}

    /* ── Тот же канон для светлой темы ───────────────────────────────────────
       Раньше золото, «свет сверху» и тёплые тени жили только под
       [data-theme="dark"]: в светлой карта дня превращалась в почти белый
       прямоугольник на почти белом фоне (ΔL≈1%), а тень под миниатюрой
       оставалась чёрной от тёмной темы и давала грязный ореол на бежевом.
       Здесь золото темнее и тени тёплые - иначе на светлом их попросту не видно. */
    [data-theme="light"] .result-card,[data-theme="light"] .home-daily{
      border-color:oklch(from var(--gold) l c h / .38)}
    [data-theme="light"] .numero-card,
    [data-theme="light"] .radio-card,[data-theme="light"] .dream-item{
      background:linear-gradient(180deg,#fff,var(--color-surface-2))}
    [data-theme="light"] .home-daily{
      background:linear-gradient(135deg,#fffdf6,#f4f1e8 64%);
      box-shadow:0 10px 26px rgba(74,60,30,.12),inset 0 1px 0 rgba(255,255,255,.8)}
    [data-theme="light"] .home-daily-card{
      box-shadow:0 6px 16px rgba(74,60,30,.16),0 0 0 1px oklch(from var(--gold) l c h / .34)}
    /* Герой-число нумерологии стилизуется в блоке «Альманах чисел» (корневой акцент) */
    button,input,textarea,select{font:inherit;color:inherit;border:none}
    button{cursor:pointer;background:none}
    ::selection{background:oklch(from var(--color-primary) l c h / .2)}
    :focus-visible{outline:2px solid var(--color-primary);outline-offset:3px;border-radius:var(--r-sm)}
    /* In-app кнопка «назад» дублирует нативную в реальном Telegram - там скрываем */
    .in-tg .ib-back{display:none}
    /* TOPBAR - компактная мобильная шапка со стеклянным фоном */
    .topbar{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);padding:calc(var(--safe-top) + var(--s3)) var(--s5) var(--s3);border-bottom:1px solid var(--color-divider);background:oklch(from var(--color-surface) l c h / .82);backdrop-filter:saturate(180%) blur(14px);-webkit-backdrop-filter:saturate(180%) blur(14px);position:sticky;top:0;z-index:50}
    .brand{display:flex;align-items:center;gap:var(--s2);text-decoration:none;color:inherit;min-width:0}
    .brand svg{flex-shrink:0;color:var(--gold)}
    .brand-title{font-family:var(--font-display);font-style:italic;font-size:var(--text-lg);white-space:nowrap}
    /* Контекстная шапка: стрелка и название экрана вместо бренда. Тот же кегль,
       что у бренда, - шапка не должна прыгать по высоте при переходах. */
    .topbar-back{display:flex;align-items:center;gap:var(--s2);min-width:0;flex:1;
      color:var(--color-text);background:none;cursor:pointer;padding:0;min-height:44px}
    .topbar-back svg{width:20px;height:20px;flex:none;color:var(--color-text-muted)}
    .topbar-back span{font-family:var(--font-display);font-style:italic;font-size:var(--text-lg);
      white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
    .topbar-back:active svg{color:var(--color-primary)}
    .topbar-right{display:flex;align-items:center;gap:var(--s3);justify-content:flex-end}
    /* Пилюля баланса токенов - быстрый доступ к главному ресурсу приложения */
    .balance-pill{display:inline-flex;align-items:center;gap:6px;padding:8px 12px 8px 10px;border-radius:var(--r-full);background:var(--color-primary-highlight);color:var(--color-primary);font-size:var(--text-xs);font-weight:600;border:1px solid transparent;cursor:pointer;transition:transform .15s,border-color .18s;font-variant-numeric:tabular-nums;white-space:nowrap}
    .balance-pill:hover{border-color:var(--color-primary)}
    .balance-pill:active{transform:scale(.95)}
    .balance-pill svg{width:14px;height:14px}
    .balance-pill .bp-plus{margin-left:2px;opacity:.7;font-weight:700}
    /* BUTTONS */
    .btn{display:inline-flex;align-items:center;gap:var(--s2);padding:var(--s2) var(--s5);border-radius:var(--r-full);font-size:var(--text-sm);font-weight:500;border:1px solid transparent;cursor:pointer;transition:background .18s,color .18s,border-color .18s,box-shadow .18s}
    .btn:active{transform:scale(.97)}
    .btn-primary{background:var(--color-btn);border-color:var(--color-btn);color:#fff}
    .btn-primary:hover{background:var(--color-btn-hover);border-color:var(--color-btn-hover)}
    .btn-ghost{border-color:var(--color-border);color:var(--color-text-muted)}
    .btn-ghost:hover{background:var(--color-surface-offset);color:var(--color-text)}
    .btn-sm{padding:var(--s1) var(--s3);font-size:var(--text-xs)}
    .btn-block{width:100%;justify-content:center}
    /* Кнопка со знаком вместо эмодзи: глиф наследует цвет текста и масштабируется с ним. */
    .btn-ico svg{width:1.05em;height:1.05em;flex:none}
    .btn:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}
    .icon-btn{width:36px;height:36px;display:grid;place-items:center;border-radius:var(--r-md);color:var(--color-text-muted)}
    .icon-btn:hover{background:var(--color-surface-offset);color:var(--color-text)}
    /* LAYOUT
       Боковой отступ вынесен в переменную: элементы, которым нужно выйти на всю
       ширину экрана (полоса прочитанного в книге раздела), вычитают его точно.
       Через 100vw это делать нельзя - на десктопе в ширину попадает и полоса
       прокрутки, и страница начинает ездить по горизонтали. */
    main{--main-pad-x:var(--s6);max-width:700px;margin:0 auto;padding:var(--s6) var(--main-pad-x) calc(var(--tabbar-h) + var(--safe-bottom) + var(--s8))}
    /* ── BOTTOM TAB BAR - нативная мобильная навигация ────────────── */
    .tabbar{position:fixed;left:0;right:0;bottom:0;z-index:60;display:flex;justify-content:center;gap:2px;padding:6px max(var(--s3),env(safe-area-inset-left)) calc(6px + var(--safe-bottom));background:oklch(from var(--color-surface) l c h / .9);backdrop-filter:saturate(180%) blur(18px);-webkit-backdrop-filter:saturate(180%) blur(18px);border-top:1px solid var(--color-divider)}
    .tab{flex:1 1 0;max-width:96px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;padding:6px 2px;border-radius:var(--r-lg);color:var(--color-text-faint);background:none;transition:color .2s;-webkit-tap-highlight-color:transparent;position:relative}
    .tab svg{width:23px;height:23px;transition:transform .25s cubic-bezier(.34,1.56,.64,1)}
    .tab-lbl{font-size:10px;font-weight:600;letter-spacing:.01em;line-height:1}
    .tab.active{color:var(--color-primary)}
    .tab.active svg{transform:translateY(-1px) scale(1.06)}
    .tab:active svg{transform:scale(.88)}
    .tab-dot{position:absolute;top:2px;width:4px;height:4px;border-radius:50%;background:var(--color-primary);opacity:0;transform:scale(0);transition:opacity .25s,transform .25s cubic-bezier(.34,1.56,.64,1)}
    .tab.active .tab-dot{opacity:1;transform:scale(1)}
    /* ── SECTION BANNER - художественный заголовок раздела ────────── */
    .sec-banner{position:relative;height:132px;border-radius:var(--r-xl);overflow:hidden;margin-bottom:var(--s6);border:1px solid var(--color-border);background:var(--color-surface-offset)}
    .sec-banner img{width:100%;height:100%;object-fit:cover;display:block}
    .sec-banner::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,oklch(from var(--color-bg) l c h / .78) 0%,oklch(from var(--color-bg) l c h / .35) 48%,oklch(from var(--color-bg) l c h / 0) 100%)}
    .sec-banner-txt{position:absolute;left:var(--s5);bottom:var(--s4);right:var(--s5);z-index:2}
    .sec-banner-guide{position:absolute;right:10px;top:10px;z-index:2;width:34px;height:34px;
      border-radius:50%;display:grid;place-items:center;color:var(--gold-soft);
      background:rgba(23,22,20,.55);border:1px solid oklch(from var(--gold) l c h / .3);
      backdrop-filter:blur(4px);cursor:pointer}
    .sec-banner-guide svg{width:17px;height:17px}
    .sec-banner-guide:active{background:rgba(23,22,20,.8)}
    [data-theme="light"] .sec-banner-guide{background:rgba(255,253,248,.75);color:var(--gold)}
    .sec-banner-kicker{font-size:var(--text-xs);letter-spacing:.08em;text-transform:uppercase;color:var(--color-primary);font-weight:600;margin-bottom:2px}
    .sec-banner-title{font-family:var(--font-display);font-style:italic;font-size:var(--text-xl);line-height:1.05;color:var(--color-text)}
    @media(min-width:520px){.sec-banner{height:150px}}
    /* ── HOME «СЕГОДНЯ» ───────────────────────────────────────────── */
    .home-greet{margin-bottom:var(--s5)}
    .home-hello{font-family:var(--font-display);font-style:italic;font-size:var(--text-xl);line-height:1.1}
    /* capitalize поднимал каждое слово и давал «Суббота, 25 Июля» - в русском месяц
       со строчной. Заглавной становится только первая буква строки. */
    .home-date{font-size:var(--text-sm);color:var(--color-text-muted);margin-top:2px}
    .home-date::first-letter{text-transform:uppercase}
    .home-chips{display:flex;gap:var(--s2);flex-wrap:wrap;margin-bottom:var(--s5)}
    /* У нового пользователя чипов нет вовсе (нет снов, нет карты неба) - пустой
       контейнер оставлял под приветствием необъяснимую дыру. */
    .home-chips:empty{display:none}
    .home-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:var(--r-full);background:var(--color-surface-2);border:1px solid var(--color-border);font-size:var(--text-xs);color:var(--color-text-muted);white-space:nowrap}
    .home-chip b{color:var(--color-text);font-weight:600}
    .home-chip .hc-emoji{font-size:1rem;line-height:1}
    .home-chip .hc-ico{display:inline-flex;color:var(--gold-soft)}
    .home-chip .hc-ico svg{width:14px;height:14px}
    /* Фаза Луны - рисунок из угла Солнце-Луна (moonPhaseSvg), а не эмодзи. */
    .home-chip .hc-moon{display:inline-flex;color:var(--gold-soft)}
    .home-section-lbl{font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-faint);font-weight:600;margin:var(--s6) 0 var(--s3)}
    .home-section-lbl:first-of-type{margin-top:var(--s2)}
    /* Герой - карта дня Таро */
    .home-daily{display:flex;gap:var(--s4);align-items:center;padding:var(--s4);border:1px solid var(--color-border);border-radius:var(--r-xl);background:linear-gradient(135deg,var(--color-surface-2),var(--color-surface));cursor:pointer;transition:transform .15s,border-color .18s,box-shadow .18s;box-shadow:var(--shadow-sm)}
    .home-daily:hover{border-color:var(--color-primary);box-shadow:var(--shadow-md)}
    .home-daily:active{transform:scale(.99)}
    .home-daily-card{flex:none;width:78px;aspect-ratio:500/838;border-radius:var(--r-md);overflow:hidden;box-shadow:0 6px 18px rgba(0,0,0,.28);background:var(--color-surface-offset)}
    /* Рубашка карты дня: гильош и золотой кант - как на рубашке колоды. Пока карту
       не перевернули, на главной нечего «открывать», и ритуал дня остаётся здесь. */
    .home-daily-back{display:grid;place-items:center;position:relative;
      background:linear-gradient(155deg,#1e2a31,#14191d);color:var(--gold-soft);
      border:1px solid oklch(from var(--gold) l c h / .5)}
    .home-daily-back::before{content:'';position:absolute;inset:4px;border-radius:5px;
      border:1px solid oklch(from var(--gold) l c h / .3)}
    .home-daily-back::after{content:'';position:absolute;inset:0;opacity:.7;
      background:repeating-conic-gradient(from 0deg at 50% 50%,oklch(from var(--gold) l c h / .16) 0deg 1deg,transparent 1deg 7deg)}
    .home-daily-back svg{width:32px;height:32px;position:relative;z-index:1}
    .home-daily--closed{cursor:pointer}
    .home-daily--closed .home-daily-go{color:var(--gold-soft);font-weight:600}
    .home-daily--flip{animation:dailyFlip .62s cubic-bezier(.2,.7,.2,1) both}
    @keyframes dailyFlip{from{transform:rotateY(14deg) scale(.97);opacity:.35}to{transform:none;opacity:1}}
    @media (prefers-reduced-motion:reduce){.home-daily--flip{animation:none}}
    .home-daily-card img{width:100%;height:100%;object-fit:cover;display:block}
    .home-daily-card img.rev{transform:rotate(180deg)}
    .home-daily-body{min-width:0;flex:1}
    .home-daily-lbl{font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-faint)}
    .home-daily-name{font-family:'Literata',Georgia,serif;font-weight:500;font-size:var(--text-lg);color:var(--color-primary);margin:2px 0}
    .home-daily-kw{font-size:var(--text-sm);color:var(--color-text-muted);line-height:1.4}
    .home-daily-go{display:inline-flex;align-items:center;gap:4px;margin-top:var(--s2);font-size:var(--text-xs);font-weight:600;color:var(--color-primary)}
    .home-daily-skeleton{height:110px;border-radius:var(--r-xl);background:linear-gradient(100deg,var(--color-surface-2) 30%,var(--color-surface-offset) 50%,var(--color-surface-2) 70%);background-size:200% 100%;animation:shimmer 1.3s linear infinite}
    @keyframes shimmer{from{background-position:200% 0}to{background-position:-200% 0}}
    /* Карточка-задача: единственный блок главной с тиловым кантом - он должен
       читаться как приглашение к действию, а не как ещё одна плитка раздела. */
    .home-task{display:flex;gap:var(--s3);align-items:flex-start;width:100%;text-align:left;
      padding:var(--s4);margin-bottom:var(--s5);cursor:pointer;
      border:1px solid oklch(from var(--color-primary) l c h / .42);border-radius:var(--r-lg);
      background:linear-gradient(150deg,oklch(from var(--color-primary) l c h / .12),var(--color-surface-2) 62%);
      transition:transform .15s,border-color .15s}
    .home-task:active{transform:scale(.99);border-color:var(--color-primary)}
    .home-task-ico{flex:none;width:36px;height:36px;border-radius:var(--r-md);display:grid;
      place-items:center;color:var(--color-primary);background:oklch(from var(--color-primary) l c h / .16)}
    .home-task-ico svg{width:19px;height:19px}
    .home-task-body{min-width:0;display:flex;flex-direction:column;gap:3px}
    .home-task-ttl{font-weight:600;font-size:var(--text-sm)}
    .home-task-sub{font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.45}
    .home-task-cta{margin-top:var(--s1);font-size:var(--text-xs);font-weight:600;color:var(--color-primary)}
    /* ── НАМЕРЕНИЯ ───────────────────────────────────────────────────────────
       Реестр вместо сетки плиток: разделы продукта давно говорят строками
       (оглавление «Альманаха чисел», каталог раскладов, главы книг), и Главная
       была единственным экраном, где навигация выглядела панелью управления.

       Голоса разделов объявлены здесь локально: --sec-accent живёт на вьюхах
       разделов, а Главная стоит НАД ними и показывает все четыре цвета сразу. */
    .v-wine{--iv:#7C3A52}
    .v-night{--iv:#2E4374}
    .v-brass{--iv:#7A611D}
    .v-amethyst{--iv:#5B4B7A}
    [data-theme="dark"] .v-wine{--iv:#C08AA0}
    [data-theme="dark"] .v-night{--iv:#7B93D1}
    [data-theme="dark"] .v-brass{--iv:#C6A25A}
    [data-theme="dark"] .v-amethyst{--iv:#A08CC0}

    /* Рубрика набрана фразой, а не надкикером: список читается как ответ на
       вопрос. Кегль обязан быть от 24 px: ниже Playfair italic на кириллице
       читается курсивной сноской, а не заголовком (--text-lg давал 19,5). */
    .home-ask{font-family:var(--font-display);font-style:italic;font-size:var(--text-xl);
      line-height:1.16;letter-spacing:-.01em;color:var(--color-text-muted);
      margin:var(--s6) 0 var(--s2)}
    #homeIntents{border-top:1px solid var(--color-divider)}
    .int-row{display:flex;align-items:flex-start;gap:var(--s3);width:100%;text-align:left;
      padding:var(--s4) 2px;border:0;border-bottom:1px solid var(--color-divider);
      background:none;color:var(--color-text);cursor:pointer;transition:background .15s}
    .int-row:active{background:oklch(from var(--iv) l c h / .07)}
    .int-row:focus-visible{outline:2px solid var(--iv);outline-offset:-2px}
    .int-g{flex:0 0 26px;padding-top:3px;color:var(--iv)}
    .int-g svg{width:22px;height:22px;display:block}
    .int-b{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}
    .int-t{font-family:var(--font-read);font-weight:500;font-size:var(--text-base);line-height:1.2}
    .int-s{font-size:var(--text-xs);line-height:1.5;color:var(--color-text-muted)}
    /* Состав темы словами, окрашенными голосами разделов: человек читает охват
       темы до того, как в неё вошёл. */
    .int-s .v-wine,.int-s .v-night,.int-s .v-brass,.int-s .v-amethyst{color:var(--iv);font-weight:500}
    .int-n{flex:0 0 auto;text-align:right;padding-top:1px}
    .int-v{font-family:var(--font-display);font-size:1.5rem;line-height:1;color:var(--iv);
      font-variant-numeric:lining-nums}
    .int-f{font-size:.68rem;font-weight:600;color:var(--color-primary);margin-top:3px;white-space:nowrap}
    .int-f--muted{color:var(--color-text-muted);font-weight:400}
    .int-quick{margin-top:var(--s4);font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.5}
    .int-quick-btn{border:0;background:none;padding:0;cursor:pointer;font:inherit;font-weight:500;
      color:var(--color-primary);border-bottom:1px solid oklch(from var(--color-primary) l c h / .4)}

    /* ── ЭКРАН НАМЕРЕНИЯ ─────────────────────────────────────────────────── */
    .intent-banner{position:relative;overflow:hidden;padding:var(--s4);border-radius:var(--r-lg);
      background:var(--color-surface);border:1px solid var(--color-border);
      border-left:2px solid var(--iv)}
    .intent-banner-g{position:absolute;right:-10px;bottom:-16px;width:96px;height:96px;
      color:var(--iv);opacity:.09;pointer-events:none}
    .intent-banner-g svg{width:100%;height:100%}
    .intent-kicker{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--iv)}
    .intent-h{font-family:var(--font-display);font-style:italic;font-size:var(--text-xl);
      line-height:1.12;margin-top:var(--s1)}
    .intent-sub{font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.55;
      margin-top:var(--s2);max-width:34ch}
    .intent-stat{display:flex;margin-top:var(--s3);border:1px solid var(--color-border);
      border-radius:var(--r-md);overflow:hidden;background:var(--color-surface)}
    .intent-stat>div{flex:1;padding:var(--s2) var(--s3);text-align:center}
    .intent-stat>div+div{border-left:1px solid var(--color-divider)}
    .intent-stat .v{font-family:var(--font-read);font-weight:500;font-size:1.15rem;line-height:1;
      font-variant-numeric:tabular-nums}
    .intent-stat .v.free{color:var(--color-primary)}
    .intent-stat .k{font-size:.66rem;letter-spacing:.08em;text-transform:uppercase;
      color:var(--color-text-faint);margin-top:4px}
    .intent-start{margin-top:var(--s4);padding:var(--s3);border-radius:var(--r-md);
      border:1px solid oklch(from var(--color-primary) l c h / .3);
      background:oklch(from var(--color-primary) l c h / .05)}
    .intent-start-h{font-size:.7rem;font-weight:600;letter-spacing:.13em;text-transform:uppercase;
      color:var(--color-primary);margin-bottom:var(--s2)}
    .intent-start .intent-row{border-left-color:oklch(from var(--color-primary) l c h / .35)}
    .intent-grp{margin-top:var(--s5)}
    .intent-grp-h{display:flex;align-items:center;gap:var(--s2);padding-bottom:var(--s2);
      border-bottom:1px solid oklch(from var(--iv) l c h / .3)}
    .intent-grp-h b{flex:1;font-size:var(--text-xs);font-weight:600;letter-spacing:.06em;
      text-transform:uppercase;color:var(--iv)}
    .intent-grp-h .cnt{font-family:var(--font-read);font-weight:500;font-size:1.05rem;
      color:var(--iv);font-variant-numeric:tabular-nums}
    /* Отметка о данных рождения стоит один раз на группу: под каждой из пяти
       строк подряд она читалась как шум, а не как условие. */
    .intent-lock{display:flex;align-items:center;gap:6px;width:100%;text-align:left;
      padding:var(--s2) 0 var(--s2) var(--s3);border:0;border-bottom:1px solid var(--color-divider);
      background:none;cursor:pointer;font-size:.72rem;color:var(--color-text-muted)}
    .intent-lock svg{width:12px;height:12px;flex:none}
    .intent-row{display:flex;align-items:flex-start;gap:var(--s3);width:100%;text-align:left;
      padding:var(--s3) 2px var(--s3) var(--s3);border:0;
      border-bottom:1px solid var(--color-divider);
      border-left:2px solid oklch(from var(--iv) l c h / .35);
      background:none;color:var(--color-text);cursor:pointer;transition:background .15s}
    .intent-row:last-child{border-bottom:0}
    .intent-row:active{background:oklch(from var(--iv) l c h / .08)}
    .intent-row:focus-visible{outline:2px solid var(--iv);outline-offset:-2px}
    .intent-row-b{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
    .intent-row-t{font-size:var(--text-sm);font-weight:500;line-height:1.35}
    .intent-row-s{font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.45}
    .intent-p{flex:none;padding-top:2px;font-size:.74rem;font-weight:600;white-space:nowrap;
      font-variant-numeric:tabular-nums}
    .intent-p.paid{color:var(--gold);display:inline-flex;align-items:center;gap:2px}
    .intent-p.paid .tok-ico{width:12px;height:12px}
    .intent-p.muted{color:var(--color-text-faint)}
    /* ── SKELETON (загрузка) ──────────────────────────────────────── */
    .skel{position:relative;overflow:hidden;background:var(--color-surface-2);border-radius:var(--r-md)}
    .skel::after{content:'';position:absolute;inset:0;background:linear-gradient(100deg,transparent 20%,oklch(from var(--color-surface-offset) l c h / .7) 50%,transparent 80%);background-size:200% 100%;animation:shimmer 1.3s linear infinite}
    .skel-card{border:1px solid var(--color-border);border-radius:var(--r-lg);background:var(--color-surface);padding:var(--s4)}
    .skel-card + .skel-card{margin-top:var(--s3)}
    .skel-line{height:12px;border-radius:var(--r-full)}
    .skel-line.sk-lg{height:16px}
    .skel-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(232px,1fr));gap:var(--s3)}
    .skel-tile{height:88px}
    /* ── EMPTY STATE (пусто) ──────────────────────────────────────── */
    .empty-state{display:flex;flex-direction:column;align-items:center;text-align:center;padding:var(--s8) var(--s4);animation:fadeUp .3s ease}
    .empty-ill{width:148px;height:148px;object-fit:cover;border-radius:var(--r-xl);margin-bottom:var(--s5);box-shadow:var(--shadow-md);border:1px solid var(--color-border)}
    .empty-title{font-family:'Literata',Georgia,serif;font-weight:500;font-size:var(--text-lg);margin-bottom:var(--s2)}
    .empty-sub{font-size:var(--text-sm);color:var(--color-text-muted);line-height:1.5;max-width:32ch;margin-bottom:var(--s5)}
    /* ── MOTION - переходы и «живость» (уважает reduced-motion) ────── */
    @media (prefers-reduced-motion: no-preference){
      .view-enter{animation:viewEnter .3s cubic-bezier(.22,.61,.36,1)}
      @keyframes viewEnter{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
      /* Каскадное появление карточек в сетках/списках */
      .stagger>*{animation:cardIn .42s cubic-bezier(.22,.61,.36,1) both}
      .stagger>*:nth-child(1){animation-delay:.02s}
      .stagger>*:nth-child(2){animation-delay:.06s}
      .stagger>*:nth-child(3){animation-delay:.10s}
      .stagger>*:nth-child(4){animation-delay:.14s}
      .stagger>*:nth-child(5){animation-delay:.18s}
      .stagger>*:nth-child(6){animation-delay:.22s}
      .stagger>*:nth-child(7){animation-delay:.26s}
      .stagger>*:nth-child(8){animation-delay:.30s}
      .stagger>*:nth-child(n+9){animation-delay:.34s}
      @keyframes cardIn{from{opacity:0;transform:translateY(12px) scale(.985)}to{opacity:1;transform:none}}
    }
    /* ── ONBOARDING (экран-приветствие нового пользователя) ────────── */
    .onb{position:fixed;inset:0;z-index:200;background:var(--color-bg);display:flex;flex-direction:column;padding:calc(var(--safe-top) + var(--s5)) var(--s6) calc(var(--safe-bottom) + var(--s5));overflow-y:auto;animation:viewEnter .35s ease}
    .onb.leaving{animation:onbLeave .32s ease forwards}
    @keyframes onbLeave{to{opacity:0;transform:scale(1.02)}}
    .onb-inner{flex:1;display:flex;flex-direction:column;align-items:center;text-align:center;justify-content:center;gap:var(--s4);max-width:440px;margin:0 auto;width:100%}
    /* Герой ограничен по высоте, а не только по ширине: при 3/4 он съедал ~400px,
       и решение (галочка + «Начать») уезжало под сгиб - на первом экране приложения
       не было видно ни одной кнопки. */
    /* Медальон со знаком: круг с мягким свечением внутри, знак - контуром.
       Занимает вдвое меньше высоты, чем прежняя картинка 3:4, поэтому согласие
       и «Начать» видны в первом кадре без прокрутки. */
    .onb-mark{width:min(46vw,168px);aspect-ratio:1;border-radius:50%;display:grid;place-items:center;
      color:var(--gold-soft);border:1px solid oklch(from var(--gold) l c h / .3);
      background:radial-gradient(circle at 42% 34%,oklch(from var(--gold) l c h / .16),transparent 62%),
        linear-gradient(160deg,var(--color-surface-2),var(--color-bg));
      box-shadow:inset 0 1px 0 oklch(from var(--gold) l c h / .12)}
    .onb-mark svg{width:52%;height:52%}
    .onb-later{text-align:center;margin-top:var(--s3);line-height:1.5}
    .onb-brand{font-family:var(--font-display);font-style:italic;font-size:var(--text-xl);margin-top:var(--s2)}
    .onb-tagline{font-size:var(--text-sm);color:var(--color-text-muted);line-height:1.55;max-width:34ch}
    /* ── ОПАСНАЯ ЗОНА ───────────────────────────────────────────────────────────
       Удаление аккаунта. Цветом выделена только сама операция, а не весь блок:
       кричащая секция в спокойном профиле выглядит угрозой, хотя это штатное
       право пользователя. Подтверждение раскрывается на месте - модальное окно
       поверх экрана на телефоне легко закрыть случайным тапом. */
    .danger-row .link-row-label{color:var(--color-error)}
    .danger-row .link-row-ico{color:var(--color-error)}
    .danger-zone{display:none;padding:var(--s4);border-top:1px solid var(--color-divider)}
    .danger-zone.open{display:block}
    .danger-text{font-size:var(--text-sm);line-height:1.6;color:var(--color-text-muted);margin-bottom:var(--s3)}
    .danger-final{color:var(--color-text);font-weight:500}
    /* Срок хранения: пояснение к карточке, а не её часть - поэтому за рамкой. */
    /* Подсказка о приватности под свободным полем: тише счётчика символов,
       читается при заполнении, не спорит с лейблом за внимание. */
    .field-privacy{margin-top:var(--s2);line-height:1.5}
    .account-retention{padding:var(--s3) var(--s4) 0;margin:0}
    .account-retention:empty{display:none}
    .danger-actions{display:flex;gap:var(--s3);justify-content:flex-end;flex-wrap:wrap}
    .danger-confirm{background:var(--color-error);color:#fff;border-color:transparent}
    .danger-error{display:none;margin-top:var(--s3);font-size:var(--text-xs);color:var(--color-error)}
    .danger-error.visible{display:block}
    .onb-consent-legal a{color:var(--color-primary);text-decoration:underline;text-underline-offset:2px}
    .onb-error{display:none;font-size:var(--text-xs);color:var(--color-error);text-align:center;margin-bottom:var(--s2)}
    .onb-error.visible{display:block}
    .onb-cta[disabled]{opacity:.45;cursor:default}
    /* Футер прибит к низу экрана: согласие и «Начать» обязаны быть видны сразу,
       иначе первый кадр приложения не предлагает ни одного действия. Фон сплошной -
       под ним проезжает контент. */
    .onb-footer{flex:none;position:sticky;bottom:0;z-index:2;max-width:440px;margin:var(--s5) auto 0;width:100%;
      background:var(--color-bg);padding-top:var(--s4);
      box-shadow:0 -12px 20px -12px var(--color-bg),0 -1px 0 var(--color-divider)}
    .onb-cta{width:100%;justify-content:center;padding:var(--s3) var(--s5);font-size:var(--text-base)}
    .onb-consent{display:flex;align-items:center;gap:var(--s2);justify-content:center;margin-bottom:var(--s3);font-size:var(--text-xs);color:var(--color-text-muted);cursor:pointer}
    /* Необязательное предложение отделено от юридического блока волосяной линией:
       рядом они читались как одно согласие. */
    .onb-consent-optional{padding-top:var(--s3);border-top:1px solid var(--color-divider)}
    .onb-consent-optional em{font-style:normal;color:var(--color-text-faint)}
    .onb-gift{display:inline-flex;align-items:center;gap:7px;margin-top:var(--s1);
      padding:6px 13px;border-radius:var(--r-full);font-size:var(--text-xs);
      color:var(--gold-soft);border:1px solid oklch(from var(--gold) l c h / .34)}
    .onb-gift svg{width:14px;height:14px;flex:none}
    .onb-consent input{width:16px;height:16px;accent-color:var(--color-primary)}
    .onb-skip{display:block;margin:var(--s3) auto 0;background:none;color:var(--color-text-faint);font-size:var(--text-xs)}
    /* Аватар аккаунта в шапке */
    .avatar-btn{width:34px;height:34px;border-radius:var(--r-full);background:var(--color-primary-highlight);color:var(--color-primary);display:grid;place-items:center;font-family:var(--font-display);font-style:italic;font-size:var(--text-sm);flex-shrink:0;border:1px solid transparent;transition:border-color .18s,transform .15s}
    .avatar-btn:hover{border-color:var(--color-primary)}
    .avatar-btn:active{transform:scale(.92)}
    .avatar-btn img{width:100%;height:100%;object-fit:cover;border-radius:inherit}

/* ── ЗОНА КАСАНИЯ ───────────────────────────────────────────────────────────
   Пальцем попадают не по пикселям, а по площади: мобильные гайдлайны просят
   минимум 44×44 для всего нажимаемого. Наши элементы шапки визуально мельче
   (аватар 34, иконка 36, пилюля баланса ~28), и увеличивать их значит перекроить
   шапку - она держится на воздухе вокруг заголовка.

   Поэтому растим НЕВИДИМУЮ зону псевдоэлементом: внешний вид и раскладка те же,
   промахов меньше. Псевдоэлемент лежит внутри кнопки, поэтому клик по нему -
   клик по кнопке, дополнительных обработчиков не нужно. */
.icon-btn,.avatar-btn,.balance-pill,.tcar-btn,.btn-sm,.btn-block,.sec-banner-guide{position:relative}
.icon-btn::after,.avatar-btn::after,.balance-pill::after,.tcar-btn::after,.btn-sm::after,
.btn-block::after,.sec-banner-guide::after,
.chip::after,.enc-chip::after{
  content:'';position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:max(100%,44px);height:max(100%,44px)}

    /* STEP INDICATOR */
    .step-indicator{display:flex;align-items:center;gap:var(--s2);margin-bottom:var(--s6)}
    .step-indicator .step-pip{flex:1}
    /* Счётчик оставшихся шагов внутри вторичной кнопки - приглушённо, как цена
       уточнения: «сколько ещё, если захочу подробнее». */
    .step-nav-count{margin-left:auto;padding-left:var(--s3);color:var(--color-text-faint);
      font-weight:400;white-space:nowrap}
    .draft-line{display:flex;align-items:center;gap:var(--s2);margin-top:var(--s3);
      font-size:var(--text-xs);color:var(--color-text-faint)}
    .draft-line svg{width:13px;height:13px;flex:none;color:var(--color-primary)}
    .step-pip{height:4px;border-radius:2px;background:var(--color-border);transition:background .3s,width .3s}
    .step-pip.active{background:var(--color-primary);box-shadow:0 0 8px oklch(from var(--color-primary) l c h /.55)}
    .step-pip.done{background:var(--color-primary);opacity:.4}
    .step-num{font-size:var(--text-xs);color:var(--color-text-muted);margin-left:var(--s2)}
    /* STEP VIEWS */
    /* Форма тянется на всю доступную высоту, поэтому кнопки стоят внизу экрана
       и на коротком шаге, и на длинном: положение главного действия не должно
       зависеть от того, сколько полей на текущем шаге. */
    #v-form{display:flex;flex-direction:column;min-height:calc(100dvh - 136px)}
    .form-sheet{flex:1}
    .step-view{display:none}
    .step-view.active{display:block;animation:fadeUp .2s ease}
    @keyframes fadeUp{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}
    /* Форма создания сна - единый премиум-лист (собранность полей) */
    /* Запас под липким футером: без него прилипшие кнопки накрывают конец шага
       (последние чипы эмоций резались посередине), пока не доскроллишь до низа. */
    .form-sheet{background:none;border:0;border-radius:0;padding:0;box-shadow:none;
      padding-bottom:calc(var(--step-foot-h,120px) + var(--s4))}

    
    .step-title{font-family:var(--font-display);font-style:italic;font-size:var(--text-xl);margin-bottom:var(--s2)}
    .step-subtitle{color:var(--color-text-muted);font-size:var(--text-sm);margin-bottom:var(--s6)}
    /* FIELDS */
    .field{margin-bottom:var(--s5)}
    .field-row{display:flex;justify-content:space-between;align-items:baseline;gap:var(--s4);margin-bottom:var(--s2)}
    .label{font-size:var(--text-sm);font-weight:600}
    /* Читаемый тег «необязательно» вместо бледных скобок */
    .opt-tag{display:inline-block;font-weight:500;font-size:.68rem;color:var(--color-text-muted);background:var(--color-surface-offset);border:1px solid var(--color-divider);padding:1px 8px;border-radius:var(--r-full);letter-spacing:.01em;vertical-align:middle;margin-left:4px}
    .label sup{color:var(--color-error);font-size:.8em}
    .counter{font-size:var(--text-xs);color:var(--color-text-faint)}
    .counter.near{color:var(--color-primary)}
    .counter.full{color:var(--color-error)}
    .hint{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:var(--s2);line-height:1.5}
    textarea,input[type="text"]{width:100%;background:var(--color-surface-2);border:1px solid var(--color-field-border);border-radius:var(--r-md);padding:var(--s3) var(--s4);resize:vertical;line-height:1.6;transition:border-color .18s,box-shadow .18s}
    textarea:focus,input[type="text"]:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 3px oklch(from var(--color-primary) l c h / .15)}
    textarea::placeholder,input::placeholder{color:var(--color-text-faint)}
    /* CHIPS */
    .chips{display:flex;flex-wrap:wrap;gap:var(--s3)}
    .chip{padding:10px var(--s3);position:relative;border:1px solid var(--color-border);border-radius:var(--r-full);background:var(--color-surface-2);font-size:var(--text-sm);cursor:pointer;transition:all .15s;user-select:none}
    .chip:hover{border-color:var(--color-primary);color:var(--color-primary)}
    .chip.active{background:var(--color-primary-highlight);border-color:var(--color-primary);color:var(--color-primary);font-weight:600}
    .chip.disabled{opacity:.35;cursor:not-allowed;pointer-events:none}
    /* STYLE HINT INLINE */
    .style-hint{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:var(--s2);min-height:1.4em;transition:opacity .2s}
    /* SELECT */
    .styled-select{width:100%;appearance:none;background:var(--color-surface-2) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23797876' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") no-repeat right 12px center;border:1px solid var(--color-field-border);border-radius:var(--r-md);padding:var(--s3) 36px var(--s3) var(--s4);transition:border-color .18s,box-shadow .18s;cursor:pointer}
    .styled-select:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 3px oklch(from var(--color-primary) l c h / .15)}
    /* RADIO CARDS */
    .radio-cards{display:flex;flex-direction:column;gap:var(--s2)}
    .radio-card{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s4);border:1px solid var(--color-border);border-radius:var(--r-lg);background:var(--color-surface-2);cursor:pointer;transition:all .18s}
    /* Луна золотая, а выбор - тиловый: рядом с круглым радио серые фазы читались
       как второй набор переключателей, особенно полная (сплошной круг). */
    .radio-card-ico{flex:none;display:inline-flex;color:oklch(from var(--gold) l c h / .5);
      transition:color .18s}
    .radio-card-ico svg{width:21px;height:21px;display:block}
    .radio-card.selected .radio-card-ico{color:var(--gold-soft)}
    .radio-card:hover{border-color:var(--color-primary-highlight)}
    .radio-card.selected{border-color:var(--color-primary);background:var(--color-primary-highlight)}
    .radio-card input[type="radio"]{accent-color:var(--color-primary)}
    .radio-card-label{font-size:var(--text-sm)}
    /* OTHER BOX */
    .other-box{display:none;margin-top:var(--s3)}
    .other-box.visible{display:block}
    /* STEP FOOTER */
    /* «Далее» держится над таб-баром, а не уезжает в конец длинного шага: на первом
       шаге контент выше экрана, и кнопку приходилось искать скроллом. */
    /* Футер формы: сверху разбор (он доступен уже с первого шага), под ним -
       шаговая навигация. На последнем шаге ранняя кнопка скрыта, и футер
       возвращается к обычной строке «Назад / Проанализировать». */
    .step-alt{width:100%;justify-content:center}
    /* Зазор между «Разобрать сейчас» и «Просто записать»: это две разные развилки,
       а не одна кнопка в две строки. Отступ висит на верхней - на последнем шаге
       она скрыта, и «Просто записать» остаётся прижатой к верху футера. */
    #btnSubmitNow{margin-bottom:var(--s2)}
    .step-alt-hint{text-align:center;margin:var(--s2) 0 0;line-height:1.5}
    .step-nav{display:flex;justify-content:space-between;align-items:center;gap:var(--s3);
      margin-top:var(--s3)}
    .step-nav #btnNext{flex:1;justify-content:flex-start;text-align:left;gap:0}
    .step-footer{display:flex;flex-direction:column;margin-top:var(--s5);
      position:sticky;bottom:calc(var(--tabbar-h) + var(--safe-bottom));z-index:3;
      padding:var(--s3) 0;background:var(--color-bg);
      box-shadow:0 -12px 18px -12px var(--color-bg),0 -1px 0 var(--color-divider)}
    .step-footer .btn-primary{min-width:160px;justify-content:center}
    /* ALERT */
    /* Ошибка рядом с полем, а не общим блоком наверху: так видно, ЧТО именно
   исправлять, и не нужно искать проблемное поле глазами. Общий .alert остаётся
   для ошибок, не привязанных к конкретному полю (сбой отправки). */
    .field-error{display:block;margin-top:var(--s2);font-size:var(--text-xs);color:var(--color-error);line-height:1.4}
    [aria-invalid="true"]{border-color:var(--color-error)}
    [aria-invalid="true"]:focus{box-shadow:0 0 0 3px oklch(from var(--color-error) l c h / .15)}
    .alert{display:none;padding:var(--s3) var(--s4);border-radius:var(--r-md);font-size:var(--text-sm);margin-bottom:var(--s4)}
    .alert.visible{display:block}
    .alert-error{background:rgba(161,44,123,.1);border:1px solid rgba(161,44,123,.3);color:var(--color-error)}
    .alert-info{background:var(--color-primary-highlight);border:1px solid var(--color-primary);color:var(--color-primary)}
    /* RESULT */
    .result-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--r-xl);overflow:hidden;box-shadow:var(--shadow-md)}
    .result-card-header{padding:var(--s5) var(--s6);border-bottom:1px solid var(--color-divider);display:flex;justify-content:space-between;align-items:flex-start;gap:var(--s4)}
    .result-card-title{font-family:var(--font-display);font-style:italic;font-size:var(--text-lg)}
    .result-card-badge{font-size:var(--text-xs);padding:3px 10px;border-radius:var(--r-full);background:var(--color-primary-highlight);color:var(--color-primary);font-weight:600;white-space:nowrap}
    .result-card-body{padding:var(--s6)}
    .result-text{white-space:pre-wrap;line-height:1.8;font-size:var(--text-base)}
    /* PYTHAGOREAN SQUARE - гравированная латунная решётка 3×3 («Альманах чисел»).
       Заполненность ячейки (pyth-l1..l4) - лестница латунных тонов, а не бирюза. */
    .pyth-visual{margin-bottom:var(--s6)}
    .pyth-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;max-width:340px;margin:0 auto;background:oklch(from var(--num-brass) l c h / .38);border:1px solid oklch(from var(--num-brass) l c h / .5)}
    .pyth-cell{aspect-ratio:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--s2);text-align:center;background:var(--color-surface-2);transition:background .15s}
    .pyth-digits{font-family:var(--font-num);font-weight:500;font-size:var(--text-lg);line-height:1;letter-spacing:.1em;word-break:break-all;font-variant-numeric:tabular-nums lining-nums}
    .pyth-cap{font-size:.62rem;line-height:1.15;color:var(--color-text-muted);margin-top:5px}
    .pyth-cell.pyth-empty{background:var(--color-surface)}
    .pyth-cell.pyth-empty .pyth-digits{color:var(--color-text-faint);letter-spacing:0}
    .pyth-cell.pyth-l2{background:oklch(from var(--num-brass) l c h / .09)}
    .pyth-cell.pyth-l3{background:oklch(from var(--num-brass) l c h / .17)}
    .pyth-cell.pyth-l2 .pyth-digits,.pyth-cell.pyth-l3 .pyth-digits{color:var(--num-brass)}
    .pyth-cell.pyth-l4{background:oklch(from var(--num-brass) l c h / .27);box-shadow:inset 0 0 0 1px oklch(from var(--num-brass) l c h / .55)}
    .pyth-cell.pyth-l4 .pyth-digits{color:var(--num-btn)}   /* light: глубокая латунь; dark: см. ниже */
    [data-theme="dark"] .pyth-cell.pyth-l4 .pyth-digits{color:var(--num-gold)}
    .pyth-foot{text-align:center;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:var(--s3)}
    /* Рендер Markdown из ответа модели (заголовки, выделение, разделители). */
    .result-md{white-space:normal;line-height:1.85;font-size:var(--text-base)}
    .result-md p{margin:0 0 1rem}
    .result-md p:last-child{margin-bottom:0}
    /* Заголовки секций трактовки - сериф-италик с бирюзовым акцентом (премиум-язык) */
    .result-md .md-h{font-family:var(--font-display);font-style:italic;font-weight:400;font-size:var(--text-lg);color:var(--color-primary);margin:1.8rem 0 .7rem;letter-spacing:.01em}
    .result-md .md-h:first-child{margin-top:0}
    /* Разделитель - центрированный золотой орнамент вместо серой линии */
    .result-md strong{font-weight:600;color:var(--color-text)}
    /* Списки: раньше рендерер их не знал и «- пункт» приходил абзацем с дефисом. */
    .result-md .md-ul{margin:0 0 1rem;padding:0;list-style:none}
    .result-md .md-ol{margin:0 0 1rem;padding-left:1.4em}
    .result-md .md-li{position:relative;margin-bottom:.4rem}
    .result-md .md-ul>.md-li{padding-left:1.1em}
    .result-md .md-ul>.md-li::before{content:"";position:absolute;left:.15em;top:.68em;width:5px;height:5px;
      border:1px solid var(--color-primary);border-radius:1px;transform:rotate(45deg)}
    .result-md .md-ol>.md-li{list-style:decimal}
    /* Завершающий орнамент трактовки */
    .md-end{text-align:center;color:var(--gold);opacity:.75;margin-top:1.5rem;font-size:1.05rem;letter-spacing:.5em;animation:cardIn .5s ease}
    /* Премиальная тематическая загрузка генерации (до первого символа стриминга) */
    .ai-wait{display:flex;flex-direction:column;align-items:center;gap:var(--s5);padding:56px 0;color:var(--color-text-muted)}
    /* Реплика этапа - не заголовок: курсив Playfair в мелком кегле на кириллице
       разваливается в сноску (см. типографический порог ниже). */
    .ai-wait p{font-family:var(--font-body);font-size:var(--text-sm);text-align:center;
      color:var(--color-text-muted);animation:awText 2.6s ease-in-out infinite}
    /* Ход генерации: волосяная линия вместо процентов - точное время неизвестно,
       а цифра обещала бы точность, которой нет. */
    .aw-line{display:block;width:min(180px,60%);height:1px;background:var(--color-divider);
      overflow:hidden;border-radius:1px}
    .aw-line i{display:block;height:100%;width:0;background:var(--gold-soft);opacity:.45;
      transition:width 1s linear}
    @keyframes awText{0%,100%{opacity:.6}50%{opacity:1}}
    .aw{position:relative;width:70px;height:70px;display:grid;place-items:center}
    @keyframes awSpin{to{transform:rotate(360deg)}}
    /* Сон - полумесяц + мерцающие звёзды */
    .aw-dream .awd-moon{width:36px;height:36px;border-radius:50%;box-shadow:inset -11px -5px 0 0 var(--gold-soft);filter:drop-shadow(0 0 7px oklch(from var(--gold-soft) l c h /.5));animation:awMoon 3s ease-in-out infinite}
    @keyframes awMoon{0%,100%{transform:rotate(-9deg)}50%{transform:rotate(9deg)}}
    .aw-dream .awd-star{position:absolute;width:5px;height:5px;border-radius:50%;background:var(--gold-soft);box-shadow:0 0 5px var(--gold-soft);opacity:0;animation:awTwinkle 1.9s ease-in-out infinite}
    .aw-dream .s1{top:4px;right:12px}.aw-dream .s2{top:20px;right:1px;animation-delay:.55s}.aw-dream .s3{bottom:6px;right:16px;animation-delay:1.1s}
    @keyframes awTwinkle{0%,100%{opacity:0;transform:scale(.4)}50%{opacity:1;transform:scale(1)}}
    /* Таро - три карты веером, «тасуются» */
    .aw-tarot{width:76px}
    .aw-tarot .awt-card{position:absolute;left:50%;top:50%;width:26px;height:40px;margin:-20px 0 0 -13px;border-radius:4px;background:linear-gradient(160deg,#26415a,#111a2e);border:1px solid oklch(from var(--gold) l c h /.55);box-shadow:0 3px 9px rgba(0,0,0,.45);transform-origin:bottom center}
    .aw-tarot .c1{animation:awFan1 2.1s ease-in-out infinite}.aw-tarot .c3{animation:awFan3 2.1s ease-in-out infinite}.aw-tarot .c2{animation:awFan2 2.1s ease-in-out infinite}
    @keyframes awFan1{0%,100%{transform:rotate(0)}50%{transform:rotate(-24deg) translateX(-3px)}}
    @keyframes awFan3{0%,100%{transform:rotate(0)}50%{transform:rotate(24deg) translateX(3px)}}
    @keyframes awFan2{0%,100%{transform:translateY(-1px)}50%{transform:translateY(-6px)}}
    /* Натальная - планета на орбите вокруг ядра */
    .aw-natal .awn-ring{position:absolute;inset:10px;border-radius:50%;border:1.5px solid oklch(from var(--color-primary) l c h /.5)}
    .aw-natal .awn-ring2{position:absolute;inset:20px;border-radius:50%;border:1px solid oklch(from var(--gold) l c h /.35)}
    .aw-natal .awn-core{width:9px;height:9px;border-radius:50%;background:var(--color-primary);box-shadow:0 0 8px oklch(from var(--color-primary) l c h /.7)}
    .aw-natal .awn-orbit{position:absolute;inset:10px;animation:awSpin 3.2s linear infinite}
    .aw-natal .awn-planet{position:absolute;top:-4px;left:50%;width:8px;height:8px;margin-left:-4px;border-radius:50%;background:var(--gold-soft);box-shadow:0 0 8px var(--gold-soft)}
    /* Совместимость - две ауры «бьются» навстречу */
    .aw-compat .awc-o{position:absolute;top:50%;width:32px;height:32px;margin-top:-16px;border-radius:50%;border:1.5px solid;animation:awBeat 1.9s ease-in-out infinite}
    .aw-compat .o1{left:6px;border-color:var(--color-primary)}
    .aw-compat .o2{right:6px;border-color:var(--gold);animation-delay:.45s}
    @keyframes awBeat{0%,100%{transform:scale(.78);opacity:.55}50%{transform:scale(1.06);opacity:1}}
    /* Гороскоп - солнце, излучающее импульсы */
    .aw-horo .awh-sun{width:15px;height:15px;border-radius:50%;background:radial-gradient(circle,var(--gold-soft),var(--gold));box-shadow:0 0 12px var(--gold-soft);z-index:2}
    .aw-horo .awh-pulse{position:absolute;inset:24px;border-radius:50%;border:2px solid var(--gold-soft);animation:awRadiate 1.9s ease-out infinite}
    @keyframes awRadiate{0%{transform:scale(.4);opacity:.85}100%{transform:scale(2.5);opacity:0}}
    /* Карта пары - два круга сходятся в общую точку: из двух карт рождается третья.
       У compat круги остаются двумя, здесь они встречаются - разница читается. */
    .aw-composite .awm-o{position:absolute;top:50%;width:34px;height:34px;margin-top:-17px;border-radius:50%;border:1.5px solid}
    .aw-composite .o1{left:2px;border-color:var(--color-primary);animation:awMergeL 2.6s ease-in-out infinite}
    .aw-composite .o2{right:2px;border-color:var(--gold);animation:awMergeR 2.6s ease-in-out infinite}
    .aw-composite .awm-core{width:7px;height:7px;border-radius:50%;background:var(--gold-soft);
      box-shadow:0 0 9px var(--gold-soft);opacity:0;animation:awMergeCore 2.6s ease-in-out infinite}
    @keyframes awMergeL{0%,100%{transform:translateX(0);opacity:.5}45%,60%{transform:translateX(16px);opacity:.95}}
    @keyframes awMergeR{0%,100%{transform:translateX(0);opacity:.5}45%,60%{transform:translateX(-16px);opacity:.95}}
    @keyframes awMergeCore{0%,32%{opacity:0;transform:scale(.3)}50%{opacity:1;transform:scale(1)}70%,100%{opacity:0;transform:scale(.3)}}
    /* Погода пары - небо недели проходит поверх обеих карт: волны идут над двумя точками */
    .aw-weather .aww-wave{position:absolute;left:6px;right:6px;height:1.5px;border-radius:2px;
      background:linear-gradient(90deg,transparent,var(--gold-soft),transparent);opacity:0;animation:awDrift 2.4s linear infinite}
    .aw-weather .w1{top:16px}
    .aw-weather .w2{top:26px;animation-delay:.5s}
    .aw-weather .w3{top:36px;animation-delay:1s}
    .aw-weather .aww-dot{position:absolute;bottom:14px;width:8px;height:8px;border-radius:50%;animation:awBeat 2.4s ease-in-out infinite}
    .aw-weather .d1{left:18px;background:var(--color-primary);box-shadow:0 0 8px oklch(from var(--color-primary) l c h /.7)}
    .aw-weather .d2{right:18px;background:var(--gold);box-shadow:0 0 8px oklch(from var(--gold) l c h /.6);animation-delay:.6s}
    @keyframes awDrift{0%{transform:translateX(-40%);opacity:0}25%,60%{opacity:.9}100%{transform:translateX(40%);opacity:0}}
    @media (prefers-reduced-motion:reduce){.aw *{animation:none!important}.ai-wait p{animation:none}}
    /* Внутри модуля пары ожидание живёт в узкой карточке - полный отступ разгонял её на пол-экрана */
    .pair-mod-body .ai-wait{padding:34px 0;gap:var(--s4)}
    .result-card-meta{padding:var(--s3) var(--s6);border-top:1px solid var(--color-divider);display:flex;gap:var(--s5);font-size:var(--text-xs);color:var(--color-text-muted);background:var(--color-surface-offset);flex-wrap:wrap}
    /* LOADER */
    .loader{display:flex;flex-direction:column;align-items:center;gap:var(--s4);padding:60px 0;color:var(--color-text-muted)}
    .loader-ring{width:40px;height:40px;border:3px solid var(--color-border);border-top-color:var(--color-primary);border-radius:50%;animation:spin .8s linear infinite}
    @keyframes spin{to{transform:rotate(360deg)}}
    /* DREAM LIST */
    .dream-item{padding:var(--s4);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--r-lg);cursor:pointer;transition:all .18s}
    .dream-item:hover{border-color:var(--color-primary);box-shadow:var(--shadow-sm)}
    .dream-item:active{transform:scale(.99);border-color:var(--color-primary);
      background:oklch(from var(--color-primary) l c h / .08)}
    .dream-item + .dream-item{margin-top:var(--s3)}
    .dream-item-top{display:flex;justify-content:space-between;align-items:flex-start;
      gap:var(--s3);margin-bottom:var(--s2)}
    /* Состояние словом и чипы эмоций: по ним сны потом и узнаются в списке. */
    .dream-state{flex:none;font-size:10.5px;padding:3px 9px;border-radius:var(--r-full);
      white-space:nowrap;color:var(--color-primary);
      border:1px solid oklch(from var(--color-primary) l c h / .42)}
    .dream-state.wait{color:var(--gold-soft);border-color:oklch(from var(--gold) l c h / .42)}
    .dream-chip{font-size:10.5px;color:var(--color-text-faint);border:1px solid var(--color-border);
      border-radius:var(--r-full);padding:3px 9px}
    .dream-chip.on{color:var(--color-primary);border-color:oklch(from var(--color-primary) l c h / .42)}
    /* Корешок группы со счётчиком - тот же приём, что в оглавлении «Чисел» и в
       каталоге таро: видно, сколько записей в корзине, а линовка держит ритм. */
    .diary-day{display:flex;align-items:center;gap:var(--s3);
      font-size:var(--text-xs);font-weight:600;letter-spacing:.06em;text-transform:uppercase;
      color:var(--color-text-muted);margin:var(--s6) 0 var(--s2)}
    .diary-day::after{content:'';flex:1;height:1px;background:var(--sec-rule)}
    .diary-day i{order:3;font-style:normal;font-size:11px;color:var(--color-text-faint);
      font-variant-numeric:tabular-nums;letter-spacing:0}
    .diary-day:first-child{margin-top:0}

    /* Голос раздела доводится до элементов, которые по умолчанию красятся тилом
       навигации: заливные кнопки, кикер баннера, строки-переходы и цена. Так же
       сделано в астрологии (#v-natal .btn-primary) и в таро. */
    #v-list .btn-primary,#v-form .btn-primary,#v-result .btn-primary,#v-dreambook .btn-primary{
      background:var(--sec-btn);border-color:var(--sec-btn);color:var(--sec-btn-ink)}
    #v-list .btn-primary:hover,#v-form .btn-primary:hover,
    #v-result .btn-primary:hover,#v-dreambook .btn-primary:hover{
      background:var(--sec-btn-hover);border-color:var(--sec-btn-hover)}
    #v-list .sec-banner-kicker{color:var(--sec-accent)}
    #v-list .diary-guide svg,#v-list .diary-guide em,
    #v-dreambook .diary-guide svg,#v-dreambook .diary-guide em{color:var(--sec-accent)}
    #v-list .diary-step-n{border-color:oklch(from var(--sec-accent) l c h / .45);
      color:var(--sec-accent)}
    #v-list .draft-go,#v-list .dream-state,#v-list .dream-chip.on{color:var(--sec-accent)}
    #v-list .dream-item:hover,#v-list .dream-item:active{border-color:var(--sec-accent)}
    /* Цена внутри строки записи - без плашки: рядом стоит текст действия, и
       заливной прямоугольник в этой строке читался отдельной кнопкой. */
    #v-list .tarot-premium,#v-form .tarot-premium,#v-result .tarot-premium{
      display:inline-flex;align-items:center;gap:3px;background:none;padding:0;margin-left:2px;
      color:inherit;font-weight:600;font-variant-numeric:tabular-nums}
    #v-list .tok-ico,#v-form .tok-ico,#v-result .tok-ico{width:12px;height:12px}
    #v-form .badge-free,#v-list .badge-free{color:var(--sec-accent);
      border-color:oklch(from var(--sec-accent) l c h / .5)}
    /* Заголовок шага - гарнитурой чтения, как в макете: форма записи сна
       принадлежит тетради, а не витрине. Playfair остаётся баннерам и бренду. */
    #v-form .step-title{font-family:var(--font-read);font-style:normal;font-weight:500;
      font-size:1.15rem;line-height:1.3}
    #v-form .step-pip.active{background:var(--sec-accent);
      box-shadow:0 0 8px oklch(from var(--sec-accent) l c h /.55)}
    #v-form .step-pip.done{background:var(--sec-accent)}
    #v-form .chip.on,#v-form .radio-card.selected{border-color:var(--sec-accent)}
    #v-form .radio-card.selected .radio-card-ico{color:var(--sec-accent)}
    #v-form .counter.near,#v-form .counter.full{color:var(--sec-accent)}

    /* ── Дневник как тетрадь ─────────────────────────────────────────────
       Сон - это текст, который человек написал сам, поэтому запись набрана
       гарнитурой длинного чтения и отделена линовкой, а не рамкой карточки.
       Раньше от полутора тысяч знаков на экране оставалось 110. */
    .leaf{padding:var(--s5) 0 var(--s4);border-bottom:1px solid var(--sec-rule);
      cursor:pointer;transition:background .15s}
    .leaf:active{background:oklch(from var(--sec-accent) l c h / .06)}
    .leaf:last-of-type{border-bottom:none}
    .leaf-d{display:flex;align-items:baseline;gap:var(--s2);margin-bottom:var(--s2)}
    .leaf-d b{font-family:var(--font-read);font-weight:500;font-size:13px;
      color:var(--sec-accent);letter-spacing:.01em}
    .leaf-d span{font-size:11px;color:var(--color-text-faint)}
    .leaf-moon{margin-left:auto;display:inline-flex;color:var(--color-text-faint);flex:none}
    .leaf-moon svg{display:block}
    .leaf-p{font-family:var(--font-read);font-size:14.5px;line-height:1.62;margin:0;
      color:var(--color-text)}
    .leaf-more{color:var(--sec-accent);white-space:nowrap}
    .leaf-f{display:flex;align-items:center;gap:var(--s3);margin-top:var(--s3);font-size:11.5px}
    .leaf-marg{font-family:var(--font-read);font-style:italic;color:var(--color-text-faint);
      overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
    .leaf-go{margin-left:auto;color:var(--sec-accent);white-space:nowrap;flex:none;
      display:inline-flex;align-items:center;gap:4px}
    .leaf-go.wait{color:var(--gold-soft)}
    .diary-more{display:flex;align-items:center;justify-content:center;gap:var(--s2);
      width:100%;margin-top:var(--s4);padding:var(--s3);border-radius:var(--r-lg);
      border:1px solid var(--color-border);background:none;color:var(--color-text);
      font-size:var(--text-xs);cursor:pointer}
    .diary-more i{font-style:normal;color:var(--color-text-faint);
      font-variant-numeric:tabular-nums}
    .diary-more:active{background:var(--color-surface-offset)}
    .diary-more:disabled{opacity:.6}
    .diary-error{color:var(--color-error);font-size:var(--text-sm);line-height:1.5}
    .diary-guide-top{margin-top:0;margin-bottom:var(--s5)}
    .diary-pattern{margin-top:var(--s5)}
    .diary-pattern span i,.dsym-diary span i{display:block;font-style:normal;font-size:11px;
      color:var(--color-text-faint);margin-top:1px}

    /* ── Запись целиком ──────────────────────────────────────────────────
       Здесь наконец видно всё, что человек вводил: до этого семь полей из
       девяти не показывались ни на одном экране - их видела только модель. */
    .entry-head{padding-bottom:var(--s4);border-bottom:1px solid var(--sec-rule);
      margin-bottom:var(--s4)}
    .entry-k{display:flex;align-items:center;gap:var(--s2);font-size:10.5px;
      letter-spacing:.1em;text-transform:uppercase;color:var(--sec-accent);font-weight:600}
    /* Метка справа (ночь недели, стиль трактовки) не должна выдавливать дату:
       она сжимается и обрезается многоточием, а не упирается в край экрана. */
    .entry-k i{font-style:normal;margin-left:auto;letter-spacing:0;text-transform:none;
      color:var(--color-text-faint);font-weight:400;font-size:11px;
      min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
    .entry-k>span{flex:none}
    /* Разбор сна набран как текст на странице, а не как карточка в рамке:
       это чтение, а не сводка, и кант вокруг длинного текста только сужает
       строку. Класс .result-card общий с нумерологией и астрологией, поэтому
       снимаем оформление точечно - на вьюхе разбора. */
    #v-result .result-card{background:none;border:none;box-shadow:none;
      border-radius:0;overflow:visible}
    #v-result .result-card-body{padding:var(--s4) 0 0}
    #v-result .entry-head{padding:0 0 var(--s4);margin-bottom:0}
    .entry-k .leaf-moon{margin-left:0;color:var(--sec-accent)}
    /* Глиф в кикере обязан иметь размер: SVG с одним viewBox растягивается по
       ширине контейнера, и знак раздела занимал пол-экрана. */
    .entry-k>svg{width:15px;height:15px;flex:none;color:var(--sec-accent)}
    .entry-h{font-family:var(--font-read);font-weight:500;font-size:16px;line-height:1.4;
      margin:var(--s2) 0 0}
    .entry-body{font-family:var(--font-read);font-size:14.5px;line-height:1.68;
      color:var(--color-text);margin:0 0 var(--s5)}
    .entry-empty{font-size:var(--text-sm);color:var(--color-text-muted);
      margin:0 0 var(--s4);line-height:1.5}
    .entry-hint{text-align:center;margin-top:var(--s2)}
    .fields{display:grid;gap:1px;background:var(--sec-rule);border-radius:var(--r-lg);
      overflow:hidden;border:1px solid var(--sec-rule);margin-bottom:var(--s5)}
    .fld{background:var(--color-surface);padding:var(--s3) var(--s4)}
    .fld-l{font-size:10px;letter-spacing:.09em;text-transform:uppercase;
      color:var(--color-text-faint);font-weight:600;margin-bottom:3px}
    .fld-v{font-size:13px;line-height:1.5;color:var(--color-text)}
    .fld-v.serif{font-family:var(--font-read);font-size:13.5px}
    /* Пара «во сне → после пробуждения»: обе группы чувств спрашивались на
       втором шаге формы и ни разу не сопоставлялись. */
    .emo-pair{display:grid;grid-template-columns:1fr 20px 1fr;gap:var(--s2);align-items:center}
    .emo-side{display:grid;gap:3px;min-width:0}
    .emo-side-l{font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;
      color:var(--color-text-faint);font-weight:600}
    .emo-side b{font-size:12.5px;font-weight:500;color:var(--color-text);line-height:1.35}
    .emo-arrow{display:grid;place-items:center;color:var(--sec-accent)}
    .emo-arrow svg{width:16px;height:16px}

    /* ── Разбор по разделам ──────────────────────────────────────────────
       Промпт заказывает четыре именованных раздела; на экране они схлопывались
       в одну простыню. Навигация вверху - по тем же разделам. */
    .an-nav{display:flex;gap:6px;margin-bottom:var(--s4);flex-wrap:wrap}
    .an-pill{font-size:11px;padding:5px 11px;border-radius:var(--r-full);
      border:1px solid var(--sec-rule);color:var(--color-text-muted);background:none;
      cursor:pointer}
    .an-pill.on{border-color:var(--sec-accent);color:var(--sec-accent)}
    .an-sec{padding:var(--s4) 0;border-bottom:1px solid var(--color-divider)}
    .an-sec:last-child{border-bottom:none}
    .an-sec:first-of-type{padding-top:0}
    .an-h{display:flex;align-items:center;gap:var(--s2);margin-bottom:var(--s2)}
    .an-h svg{width:17px;height:17px;color:var(--sec-accent);flex:none}
    .an-h b{font-family:var(--font-read);font-weight:500;font-size:14.5px}
    /* Вопросы рефлексии - не абзацы, а нумерованный ряд: это список к себе,
       а не продолжение трактовки. Номер набран гарнитурой чтения. */
    .an-q{display:grid;grid-template-columns:16px 1fr;gap:var(--s3);padding:6px 0;
      font-size:13px;line-height:1.55;color:var(--color-text)}
    .an-q i{font-style:normal;font-family:var(--font-read);color:var(--sec-accent);
      font-size:13px;font-variant-numeric:tabular-nums}
    /* Подзаголовки внутри ответа модели: Playfair italic здесь давал 19.5 px -
       ниже порога, на котором он читается заголовком, а не сноской. */
    #v-result .result-md .md-h{font-family:var(--font-read);font-style:normal;
      font-weight:500;font-size:14px}
    /* Дата и ночь недели под именем разбора. */
    .entry-sub{font-size:11.5px;color:var(--color-text-faint);margin:var(--s2) 0 0}

    /* Символы из разбора - ссылками в сонник: раньше разбор говорил об образах,
       словарь хранил статьи о тех же образах, и они не встречались ни разу. */
    .sym-links{display:flex;flex-wrap:wrap;gap:7px;margin-top:var(--s3)}
    .sym-link{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;
      border:1px solid var(--sec-accent);color:var(--sec-accent);border-radius:var(--r-full);
      padding:4px 10px 4px 7px;background:none;cursor:pointer}
    .sym-link svg{width:14px;height:14px}
    .sym-link:active{background:oklch(from var(--sec-accent) l c h / .12)}
    .result-foot{margin-top:var(--s5);display:grid;gap:var(--s2)}
    .analysis-error{padding:var(--s6) 0;display:grid;gap:var(--s2);text-align:center}
    .analysis-error-t{color:var(--color-error);margin:0;font-size:var(--text-sm)}
    /* Нехватка токенов - не сбой, а цена: заголовок гейта набран цветом текста.
       Красным здесь оставалось бы «сломалось», хотя ломаться нечему. */
    .analysis-error-t.soft{color:var(--color-text);font-family:var(--font-read);
      font-weight:500;font-size:var(--text-base)}
    .analysis-error-s{color:var(--color-text-muted);margin:0 0 var(--s2);font-size:var(--text-xs);
      line-height:1.5}

    /* ── Что будет в разборе ─────────────────────────────────────────────
       Собрано из того же реестра разделов, что задаёт структуру ответа модели. */
    .inside{border:1px solid var(--sec-rule);border-radius:var(--r-lg);
      padding:var(--s4);background:var(--color-surface-2);margin:var(--s5) 0 0}
    .inside-k{font-size:10px;letter-spacing:.12em;text-transform:uppercase;
      color:var(--sec-accent);font-weight:600;margin-bottom:var(--s2)}
    .inside-i{display:grid;grid-template-columns:16px 1fr;gap:var(--s3);padding:5px 0;
      font-size:12.5px;line-height:1.45}
    .inside-i svg{width:16px;height:16px;color:var(--sec-accent);margin-top:1px}
    .inside-i b{font-weight:600;display:block}
    .inside-i span span{color:var(--color-text-muted);font-size:11.5px}

    /* ── Когда приснилось ────────────────────────────────────────────────
       Две ближайшие ночи одним тапом, остальное - датой. Третий вариант несёт
       нативный date-picker, поэтому он label с невидимым input внутри. */
    .night-pick{display:flex;gap:var(--s2);flex-wrap:wrap}
    .night-opt{flex:1 1 0;min-width:92px;display:inline-flex;align-items:center;
      justify-content:center;gap:6px;padding:9px 12px;border-radius:var(--r-lg);
      border:1px solid var(--color-border);background:var(--color-surface);
      font-size:13px;color:var(--color-text);cursor:pointer;white-space:nowrap}
    .night-opt.on{border-color:var(--sec-accent);color:var(--sec-accent);
      background:oklch(from var(--sec-accent) l c h / .09)}
    .night-opt-date{position:relative;overflow:hidden}
    .night-opt-date input{position:absolute;inset:0;opacity:0;width:100%;height:100%;
      border:none;padding:0;cursor:pointer}

    /* ── Карточки стиля трактовки ────────────────────────────────────────
       Вместо системного <select> - единственного во всём продукте. */
    .f-styles{display:grid;gap:var(--s2)}
    .f-style{display:grid;gap:2px;border:1px solid var(--color-border);
      border-radius:var(--r-lg);padding:var(--s3) var(--s4);background:var(--color-surface);
      text-align:left;cursor:pointer;transition:border-color .15s,background .15s}
    .f-style.on{border-color:var(--sec-accent);
      background:oklch(from var(--sec-accent) l c h / .09)}
    .f-style b{font-size:13px;font-weight:600}
    .f-style span{font-size:11.5px;color:var(--color-text-muted);line-height:1.45}

    /* ── Узор дневника ───────────────────────────────────────────────────
       Считается из введённых полей, без модели - и это сказано на экране. */
    .pat-hero{text-align:center;padding:0 0 var(--s5);border-bottom:1px solid var(--sec-rule);
      margin-bottom:var(--s5)}
    .pat-hero-k{font-size:10.5px;letter-spacing:.13em;text-transform:uppercase;
      color:var(--sec-accent);font-weight:600;margin-bottom:var(--s3)}
    .pat-hero-h{font-family:var(--font-display);font-size:26px;line-height:1.2;
      margin:0 0 var(--s2);font-weight:400}
    .pat-hero-s{font-size:12.5px;color:var(--color-text-muted);line-height:1.5;margin:0}
    .pat-block{margin-bottom:var(--s6)}
    .pat-h{display:flex;align-items:center;gap:var(--s3);margin-bottom:var(--s3);
      font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;font-weight:600;
      color:var(--color-text-muted)}
    .pat-h::after{content:'';flex:1;height:1px;background:var(--sec-rule)}
    .pat-say{font-family:var(--font-read);font-size:14px;line-height:1.55;
      color:var(--color-text);margin:0 0 var(--s3)}
    .pat-say b{color:var(--sec-accent);font-weight:500}
    .pat-say.muted{font-size:12.5px;color:var(--color-text-muted)}
    .motifs{display:flex;flex-wrap:wrap;gap:7px}
    .motif{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--sec-rule);
      border-radius:var(--r-full);padding:4px 10px 4px 7px;font-size:11.5px;
      background:none;color:var(--color-text);cursor:pointer}
    .motif svg{width:14px;height:14px;color:var(--sec-accent);flex:none}
    .motif i{font-style:normal;color:var(--color-text-faint);font-variant-numeric:tabular-nums}
    .motif:active{background:oklch(from var(--sec-accent) l c h / .1)}
    /* Полосы - насыщенностью одного тона, а не светофором: интенсивность
       показывает величину, а не оценку. */
    .bars{display:grid;gap:6px}
    .bar{display:grid;grid-template-columns:80px 1fr 22px;gap:var(--s2);align-items:center;
      font-size:11.5px}
    .bar-t{color:var(--color-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
    .bar-l{height:5px;border-radius:3px;background:var(--color-surface-offset);overflow:hidden}
    .bar-l span{display:block;height:100%;border-radius:3px;background:var(--sec-accent)}
    .bar-n{text-align:right;color:var(--color-text-faint);font-variant-numeric:tabular-nums}
    .lunar{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--s2)}
    .lunar-c{border:1px solid var(--sec-rule);border-radius:var(--r-lg);padding:var(--s3) 4px;
      text-align:center;background:var(--color-surface)}
    /* Глиф фазы - блочный (.moon-ph), поэтому text-align на него не действует
       и луна прижималась к левому краю карточки. Центрируем полями. */
    .lunar-c svg{color:var(--sec-accent);display:block;margin:0 auto 4px}
    .lunar-c b{display:block;font-size:14px;font-weight:600;font-variant-numeric:tabular-nums}
    .lunar-c span{font-size:9.5px;color:var(--color-text-faint);line-height:1.3;display:block;
      margin-top:2px}

    /* ── Сонник: поиск и листание ────────────────────────────────────────*/
    .dsym-search{margin-bottom:var(--s3)}
    .dsym-empty{font-size:var(--text-sm);color:var(--color-text-muted);line-height:1.5;
      padding:var(--s5) 0;text-align:center}
    .dsym-btn{width:38px;height:38px;border-radius:var(--r-full);display:grid;
      place-items:center;border:1px solid var(--sec-rule);background:none;
      color:var(--sec-accent);cursor:pointer}
    .dsym-btn svg{width:17px;height:17px}
    .dsym-btn:disabled{opacity:.35;color:var(--color-text-faint)}
    .dsym-btn:not(:disabled):active{background:oklch(from var(--sec-accent) l c h / .12)}
    .dsym-diary{margin-top:var(--s4)}
    /* Ключевые слова статьи: по ним же работает поиск, поэтому они кликабельны -
       тап уводит в список статей с тем же словом. */
    .dsym-kw{margin-top:var(--s4);justify-content:center}
    .dsym-kw .motif{padding:4px 10px;color:var(--color-text-muted)}

    /* ── Пустой дневник ──────────────────────────────────────────────────── */
    .diary-empty-title{font-family:'Literata',Georgia,serif;font-weight:500;
      font-size:var(--text-lg);margin-bottom:var(--s2)}
    .diary-empty-sub{font-size:var(--text-sm);color:var(--color-text-muted);line-height:1.6;
      margin-bottom:var(--s4)}
    .diary-steps{display:flex;flex-direction:column;margin-bottom:var(--s5)}
    .diary-step{display:flex;gap:var(--s3);align-items:flex-start;padding:var(--s3) 0;
      border-bottom:1px solid var(--color-divider)}
    .diary-step:last-child{border-bottom:none}
    .diary-step-n{flex:none;width:22px;height:22px;border-radius:50%;display:grid;place-items:center;
      border:1px solid oklch(from var(--color-primary) l c h / .45);color:var(--color-primary);
      font-size:11px;font-weight:600;font-variant-numeric:tabular-nums}
    .diary-step b{display:block;font-size:var(--text-sm);font-weight:600;margin-bottom:2px}
    .diary-step span span{font-size:var(--text-xs);color:var(--color-text-faint);line-height:1.45}
    .diary-nudge{display:flex;gap:var(--s2);align-items:flex-start;margin-top:var(--s4);
      padding:var(--s3);border-radius:var(--r-lg);
      border:1px solid oklch(from var(--gold) l c h / .26);
      background:linear-gradient(150deg,oklch(from var(--gold) l c h / .07),transparent 65%)}
    .diary-nudge svg{width:15px;height:15px;flex:none;color:var(--gold-soft);margin-top:2px}
    .diary-nudge p{margin:0;font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.5}
    .diary-guide{display:flex;align-items:center;gap:var(--s2);width:100%;margin-top:var(--s3);
      padding:var(--s3);border:1px solid var(--color-border);border-radius:var(--r-lg);
      font-size:var(--text-xs);color:var(--color-text);text-align:left;cursor:pointer}
    .diary-guide svg{width:16px;height:16px;flex:none;color:var(--color-primary)}
    .diary-guide em{margin-left:auto;font-style:normal;color:var(--color-primary)}
    .diary-guide:active{background:var(--color-surface-offset)}
    /* Черновик - не запись, а приглашение вернуться: латунный кант вместо обычного
       и явный призыв, чтобы карточка не читалась как ещё один разобранный сон. */
    .dream-draft{border-color:oklch(from var(--gold) l c h / .38);
      background:linear-gradient(160deg,oklch(from var(--gold) l c h / .07),transparent 62%),var(--color-surface);
      margin-bottom:var(--s3)}
    .draft-head{display:flex;align-items:center;gap:var(--s2);margin-bottom:var(--s2)}
    .draft-ico{display:inline-flex;color:var(--gold-soft)}
    .draft-ico svg{width:15px;height:15px}
    .draft-label{font-size:var(--text-xs);font-weight:600;color:var(--gold-soft);
      letter-spacing:.02em}
    /* Черновик живёт в браузере, а не на сервере: его можно потерять со сменой
       устройства, и сказать об этом надо там же, где он показан. */
    .draft-label i{font-style:normal;font-weight:400;color:var(--color-text-faint);
      letter-spacing:0;margin-left:6px}
    .draft-drop{margin-left:auto;width:26px;height:26px;border-radius:var(--r-full);
      background:none;color:var(--color-text-faint);font-size:1.1rem;line-height:1;cursor:pointer}
    .draft-drop:active{background:var(--color-surface-offset);color:var(--color-text)}
    .draft-go{margin-top:var(--s2);font-size:var(--text-xs);font-weight:600;color:var(--color-primary)}
    .dream-item-desc{font-size:var(--text-sm);margin-bottom:var(--s2)}
    .dream-item-meta{display:flex;gap:var(--s3);font-size:var(--text-xs);color:var(--color-text-muted);flex-wrap:wrap}
    .badge{padding:2px 8px;border-radius:var(--r-full);font-size:var(--text-xs);font-weight:500}
    .badge-analyzed{background:var(--color-primary-highlight);color:var(--color-primary)}
    .badge-draft{background:var(--color-surface-offset);color:var(--color-text-muted)}
    /* ── СВЕТИЛА (Big Three) - сетка в домене профиля ─────────────── */
    /* Тематический бэкдроп (солнце/луна/созвездия) - только в тёмной теме, тихо под контентом */
    .cosmo-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s2);margin:var(--s3) 0;position:relative;z-index:1}
    .cosmo-cell{text-align:center;padding:var(--s3) var(--s1);border:1px solid var(--color-border);border-radius:var(--r-md);background:var(--color-surface-2)}
    .cosmo-cell-glyph{font-size:1.3rem;line-height:1;font-variant-emoji:text;color:var(--sec-accent,var(--color-primary))}
    .cosmo-cell-role{font-size:.62rem;text-transform:uppercase;letter-spacing:.08em;color:var(--color-text-muted);margin-top:4px}
    /* Literata, а не Playfair italic: на этом кегле курсив читается сноской
       (порог Playfair - 24px). Цвет - голос раздела, а не навигационный тил. */
    .cosmo-cell-sign{font-family:var(--font-read);font-weight:500;font-size:var(--text-sm);
      color:var(--sec-accent,var(--color-primary));margin-top:2px}
    .account-section{margin-bottom:var(--s6)}
    .account-section-title{font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:var(--s3);padding-left:var(--s1)}
    .form-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--s4)}
    .form-grid .field-full{grid-column:1/-1}
    input[type="date"],input[type="time"]{width:100%;background:var(--color-surface-2);border:1px solid var(--color-field-border);border-radius:var(--r-md);padding:var(--s3) var(--s4);transition:border-color .18s,box-shadow .18s;color-scheme:light dark}
    input[type="date"]:focus,input[type="time"]:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 3px oklch(from var(--color-primary) l c h / .15)}
    /* Нативный пикер оставляем (лучший UX для даты рождения), но перекрашиваем
       системную иконку календаря/часов под палитру, чтобы не выбивалась. */
    input[type="date"]::-webkit-calendar-picker-indicator,input[type="time"]::-webkit-calendar-picker-indicator{cursor:pointer;opacity:.5;transition:opacity .15s}
    input[type="date"]:hover::-webkit-calendar-picker-indicator,input[type="time"]:hover::-webkit-calendar-picker-indicator{opacity:.85}
    [data-theme="dark"] input[type="date"]::-webkit-calendar-picker-indicator,[data-theme="dark"] input[type="time"]::-webkit-calendar-picker-indicator{filter:invert(1);opacity:.55}
    /* Группы формы «Данные рождения»: Имя (нумерология) / Рождение (карта неба) */
    /* SEGMENTED CONTROL */
    .segmented{display:flex;gap:4px;background:var(--color-surface-offset);border-radius:var(--r-md);padding:4px}
    .seg-btn{flex:1;padding:var(--s2) var(--s3);border-radius:calc(var(--r-md) - 2px);font-size:var(--text-sm);font-weight:500;color:var(--color-text-muted);transition:all .15s}
    .seg-btn.active{background:var(--color-surface);color:var(--color-text);box-shadow:var(--shadow-sm)}
    /* CITY AUTOCOMPLETE */
    .city-ac{position:relative}
    .city-dropdown{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:20;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--r-md);box-shadow:var(--shadow-md);max-height:220px;overflow-y:auto;display:none}
    .city-dropdown.visible{display:block}
    .city-opt{padding:var(--s3) var(--s4);font-size:var(--text-sm);cursor:pointer;border-bottom:1px solid var(--color-divider)}
    .city-opt:last-child{border-bottom:none}
    .city-opt:hover,.city-opt.active{background:var(--color-surface-offset)}
    .city-opt-sub{font-size:var(--text-xs);color:var(--color-text-muted)}
    .city-empty{padding:var(--s3) var(--s4);font-size:var(--text-xs);color:var(--color-text-muted)}
    /* LINK ROWS */
    /* Уведомления */
    .switch{flex:none;width:46px;height:28px;border-radius:var(--r-full);background:var(--color-border);position:relative;transition:background .2s;cursor:pointer;border:none;padding:0}
    .switch[aria-checked="true"]{background:var(--color-primary)}
    .switch-knob{position:absolute;top:3px;left:3px;width:22px;height:22px;border-radius:var(--r-full);background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.3);transition:transform .2s}
    .switch[aria-checked="true"] .switch-knob{transform:translateX(18px)}
    .notif-time{display:flex;align-items:center;justify-content:space-between;margin-top:var(--s4);padding-top:var(--s4);border-top:1px solid var(--color-divider)}
    .notif-time-label{font-size:var(--text-sm)}
    .notif-time-input{background:var(--color-surface-offset);border:1px solid var(--color-border);border-radius:var(--r-md);padding:var(--s2) var(--s3);color:inherit;font-size:max(16px,var(--text-sm));font-family:inherit}
    .link-row{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) 0;border-bottom:1px solid var(--color-divider);text-decoration:none;color:inherit;cursor:pointer;width:100%;text-align:left}
    .link-row:last-child{border-bottom:none}
    .link-row:hover .link-row-label{color:var(--color-primary)}
    .link-row:hover .link-row-ico{color:var(--color-primary);border-color:oklch(from var(--color-primary) l c h /.4)}
    .link-row-ico{width:36px;height:36px;flex:none;border-radius:var(--r-md);display:grid;place-items:center;background:var(--color-surface-offset);color:var(--color-text-muted);border:1px solid transparent;transition:color .15s,border-color .15s}
    .link-row-label{font-size:var(--text-sm);flex:1;min-width:0}
    .link-row-arrow{color:var(--color-text-faint);flex:none}
    /* NUMEROLOGY - CATALOG (базовые .numero-intro/.numero-grid/.numero-card
       ПЕРЕИСПОЛЬЗУЮТСЯ хабами астрологии и таро - их не менять; облик самой
       нумерологии задают scoped-оверрайды #v-numero ниже, блок «Альманах чисел») */
    .numero-intro{font-size:var(--text-sm);color:var(--color-text-muted);margin:0 0 var(--s6);line-height:1.6;max-width:62ch}
    .numero-section{margin-bottom:var(--s8)}
    .numero-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(232px,1fr));gap:var(--s3)}
    .numero-card{display:flex;gap:var(--s3);align-items:flex-start;text-align:left;width:100%;padding:var(--s4);border:1px solid var(--color-border);border-radius:var(--r-lg);background:var(--color-surface-2);cursor:pointer;transition:transform .15s,border-color .15s,box-shadow .15s}
    .numero-card:hover{transform:translateY(-2px);border-color:var(--color-primary);box-shadow:var(--shadow-md)}
    .numero-card:active{transform:scale(.985);border-color:var(--color-primary);
      background:oklch(from var(--color-primary) l c h / .1)}
    .numero-card:active{transform:translateY(0)}
    .numero-card>span{min-width:0}
    .numero-card-ico{width:40px;height:40px;border-radius:var(--r-md);display:grid;place-items:center;font-size:1.2rem;background:var(--color-primary-highlight);color:var(--color-primary);flex-shrink:0}
    .numero-card-ico svg{width:20px;height:20px;display:block}
    .numero-card-label{display:block;font-weight:600;font-size:var(--text-sm)}
    .numero-card-desc{display:block;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:3px;line-height:1.4}
    /* ═══ NUMEROLOGY - «АЛЬМАНАХ ЧИСЕЛ» ═════════════════════════════════
       Латунь + чернила, табличные цифры Literata, тонкие линовки.
       Токены живут на #v-numero; бирюза внутри раздела не используется. */
    #v-numero{
      --sec-accent:#7A611D;--sec-rule:#d9d3c4;
      --num-brass:#7A611D;--num-gold:#B8933F;--num-rule:#d9d3c4;
      --num-btn:#7d6423;--num-btn-hover:#6d5719;--num-btn-ink:#fff;
      --font-num:'Literata',Georgia,serif;
      /* Спектр корневых чисел. Один набор на обе темы не работал: на светлом фоне
         пять из девяти не добирали 3:1, а тройка давала 1.83 - цифра высотой в
         сотню пикселей почти исчезала. Здесь тот же тон при сниженной светлоте. */
      --n1:#A63C1B;--n2:#9E5A17;--n3:#8A6A12;--n4:#5A6E1E;--n5:#0F6E55;
      --n6:#175E74;--n7:#3A4F9E;--n8:#5C42A0;--n9:#93357A;
    }
    [data-theme="dark"] #v-numero{
      --sec-accent:#C6A25A;--sec-rule:#3a352c;
      --num-brass:#C6A25A;--num-gold:#D8B968;--num-rule:#3a352c;
      --num-btn:#C6A25A;--num-btn-hover:#D8B968;--num-btn-ink:#1c1b19;
      --n1:#D9603B;--n2:#E08A4B;--n3:#D9A93E;--n4:#8FA84E;--n5:#46A98A;
      --n6:#4593A8;--n7:#5B7FC7;--n8:#8A6FD0;--n9:#C264A6;
    }
    /* Кнопки/сегменты/заголовки раздела - латунный голос вместо бирюзы и курсива */
    #v-numero .btn-primary{background:var(--num-btn);border-color:var(--num-btn);color:var(--num-btn-ink)}
    #v-numero .btn-primary:hover{background:var(--num-btn-hover);border-color:var(--num-btn-hover)}
    #v-numero .seg-btn.active{background:var(--num-btn);color:var(--num-btn-ink)}
    #v-numero .seg{border-color:var(--num-rule);background:none}
    #v-numero .result-card-title{font-family:var(--font-num);font-style:normal;font-weight:500;letter-spacing:.01em}
    /* Форма метода - «лист альманаха»: латунная линовка сверху, надзаголовок-группа,
       титул Literata; поля - подчёркивания с латунным фокусом, без коробок и бирюзы. */
    #v-numero .numero-sheet{padding-top:var(--s5);border-top:2px solid var(--num-brass)}
    #v-numero .numero-sheet-head{margin-bottom:var(--s6)}
    #v-numero .numero-sheet-kicker{font-size:var(--text-xs);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:var(--s2)}
    #v-numero .numero-sheet-title{font-family:var(--font-num);font-style:normal;font-weight:500;font-size:var(--text-xl);line-height:1.05;letter-spacing:.01em;color:var(--color-text)}
    #v-numero .numero-sheet-desc{margin-top:var(--s3);font-size:var(--text-sm);line-height:1.5;color:var(--color-text-muted);max-width:48ch}
    #v-numero .numero-field{margin-bottom:var(--s5)}
    #v-numero .numero-pair{display:grid;grid-template-columns:1fr 1fr;gap:var(--s4)}
    #v-numero .numero-label{display:block;font-size:.7rem;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--num-brass);margin-bottom:var(--s2)}
    #v-numero .numero-label sup{color:var(--color-error);font-size:.9em}
    #v-numero #numeroInputs input[type="date"],#v-numero #numeroInputs input[type="text"]{background:none;border:0;border-bottom:1px solid var(--num-rule);border-radius:0;padding:var(--s2) 0;min-height:44px}
    #v-numero #numeroInputs input[type="date"]:focus,#v-numero #numeroInputs input[type="text"]:focus{outline:none;border-bottom-color:var(--num-brass);box-shadow:0 1px 0 0 var(--num-brass)}
    #v-numero #numeroInputs input:focus-visible{outline:2px solid var(--num-brass);outline-offset:2px}
    #v-numero .numero-run{margin-top:var(--s6)}
    /* Доступность: цели касания ≥44px и видимый фокус клавиатуры */
    #v-numero .seg-btn{min-height:40px}
    #v-numero .seg-btn:focus-visible,#v-numero .numero-card:focus-visible,#v-numero .numero-hist-item:focus-visible{outline:2px solid var(--num-brass);outline-offset:2px}
    /* Результат - плоский лист (как форма): без скруглённой карточки и тени */
    #v-numero .result-card{background:none;border:0;border-radius:0;box-shadow:none;overflow:visible}
    #v-numero .result-card-body{padding:var(--s4) 0}
    #v-numero .result-card-meta{background:none;border-top:1px solid var(--num-rule);padding:var(--s3) 0;color:var(--color-text-muted)}
    #v-numero .res-meta-lbl{font-size:.66rem;font-weight:600;letter-spacing:.13em;text-transform:uppercase;color:var(--color-text-muted)}
    /* История метода - строки-реестра в айдентике раздела (не .dream-item) */
    #v-numero .numero-hist-item{padding:var(--s3) var(--s2);border-bottom:1px solid var(--num-rule);border-left:2px solid oklch(from var(--num-brass) l c h / .35);cursor:pointer;transition:background .15s,border-color .15s}
    #v-numero .numero-hist-item:hover{border-left-color:var(--num-brass);background:oklch(from var(--num-brass) l c h / .06)}
    #v-numero .numero-hist-when{font-variant-numeric:tabular-nums lining-nums;color:var(--color-text)}
    /* Скелетон каталога - под финальный линовочный список (не плитки → без layout shift) */
    #v-numero .numero-skel-row{display:flex;gap:var(--s3);align-items:center;padding:var(--s3) var(--s2);border-bottom:1px solid var(--num-rule)}
    #v-numero .numero-skel-ico{width:34px;height:34px;border-radius:var(--r-sm);flex-shrink:0}
    #v-numero .numero-skel-txt{flex:1;min-width:0}
    /* Баннер раздела говорит латунью, не бирюзой; заголовок - Literata, не курсив */
    #v-numero .sec-banner-kicker{color:var(--num-brass)}
    #v-numero .sec-banner-title{font-family:var(--font-num);font-style:normal;font-weight:500;letter-spacing:.01em}
    /* Каталог - «оглавление альманаха»: линовка секции, счётчик крупной цифрой */
    .numero-section-head{display:flex;align-items:baseline;gap:var(--s3);margin-bottom:0;padding-bottom:var(--s2);border-bottom:1px solid var(--num-rule)}
    .numero-section-title{font-size:var(--text-xs);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--color-text-muted)}
    .numero-section-count{margin-left:auto;font-family:var(--font-num);font-weight:500;font-size:1.35rem;line-height:1;color:var(--num-brass);font-variant-numeric:tabular-nums lining-nums}
    /* Кластер «Сферы жизненного пути» - пояснение-подводка под заголовком */
    .numero-section-lead{margin:var(--s3) 0 0;font-size:var(--text-xs);line-height:1.5;color:var(--color-text-muted);max-width:52ch}
    /* Карточки методов - строки реестра: линовка + левый латунный кант */
    #v-numero .numero-grid{display:block}
    .cat-rail .numero-card,#v-numero .numero-card{padding:var(--s3) var(--s2);border:0;border-bottom:1px solid var(--sec-rule,var(--color-divider));border-left:2px solid oklch(from var(--sec-accent,var(--color-primary)) l c h / .35);border-radius:0;background:none;box-shadow:none;transition:background .15s,border-color .15s}
    .cat-rail .numero-card:hover,#v-numero .numero-card:hover{transform:none;border-color:var(--sec-rule,var(--color-divider));border-left-color:var(--sec-accent,var(--color-primary));background:oklch(from var(--sec-accent,var(--color-primary)) l c h / .06);box-shadow:none}
    /* В «Альманахе» отклик латунный, а не тиловый: раздел держит свой акцент. */
    .cat-rail .numero-card:active,#v-numero .numero-card:active{transform:none;border-color:var(--sec-rule,var(--color-divider));border-left-color:var(--sec-accent,var(--color-primary));
      background:oklch(from var(--sec-accent,var(--color-primary)) l c h / .12);box-shadow:none}
    #v-numero .numero-card:active{transform:none;background:oklch(from var(--num-brass) l c h / .1)}
    .cat-rail .numero-card-ico,#v-numero .numero-card-ico{width:34px;height:34px;border-radius:var(--r-sm);color:var(--sec-accent,var(--color-primary));background:oklch(from var(--sec-accent,var(--color-primary)) l c h / .1);border:1px solid oklch(from var(--sec-accent,var(--color-primary)) l c h / .28)}
    .cat-rail .numero-card-ico svg,#v-numero .numero-card-ico svg{width:18px;height:18px;display:block}
    /* Результат - СИГНАТУРА «Печать числа»: одна крупная корневая цифра как
       гравированная печать/медаль. Двойной обод + насечки-гурт по краю; цвет -
       из спектра корневых чисел (--root-accent приходит inline с контейнера).
       Мастер-числа 11/22/33 - латунь с усиленным ободом. Уравнения нет. */
    .res-hero{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--s4);padding:var(--s3) 0 var(--s6);max-width:100%;overflow:hidden}
    .res-hero-ring{--seal:clamp(116px,38vw,152px);width:var(--seal);height:var(--seal);border-radius:50%;display:grid;place-items:center;position:relative;border:1px solid var(--num-rule);background:radial-gradient(circle at 50% 40%,oklch(from var(--root-accent,var(--num-brass)) l c h / .08),transparent 72%)}
    /* Насечки по краю - «рифлёный гурт» печати (кольцевая маска оставляет только обод) */
    .res-hero-ring::before{content:'';position:absolute;inset:-1px;border-radius:50%;background:repeating-conic-gradient(from 0deg,oklch(from var(--root-accent,var(--num-brass)) l c h / .55) 0 .55deg,transparent .55deg 6deg);-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 7px),#000 calc(100% - 7px));mask:radial-gradient(farthest-side,transparent calc(100% - 7px),#000 calc(100% - 7px));pointer-events:none}
    /* Внутреннее акцентное кольцо */
    .res-hero-ring::after{content:'';position:absolute;inset:13px;border-radius:50%;border:1px solid var(--root-accent,var(--num-brass));opacity:.5}
    .res-hero-num{font-family:var(--font-num);font-weight:500;font-size:clamp(3.2rem,17vw,4.8rem);line-height:1;color:var(--root-accent,var(--num-brass));font-variant-numeric:tabular-nums lining-nums}
    /* Рождение числа: кольцо затягивается по кругу, а не появляется готовым. */
    .res-hero-ring--seal::before{animation:sealDraw .85s cubic-bezier(.22,.61,.36,1) both}
    @keyframes sealDraw{from{-webkit-mask-image:conic-gradient(#000 0deg,transparent 0deg);mask-image:conic-gradient(#000 0deg,transparent 0deg)}
      to{-webkit-mask-image:conic-gradient(#000 360deg,transparent 360deg);mask-image:conic-gradient(#000 360deg,transparent 360deg)}}
    .res-hero-num--master-in{animation:masterIn .42s cubic-bezier(.22,.61,.36,1) both}
    @keyframes masterIn{from{opacity:.35;letter-spacing:-.08em}to{opacity:1;letter-spacing:0}}
    @media (prefers-reduced-motion:reduce){
      .res-hero-ring--seal::before,.res-hero-num--master-in{animation:none}
    }
    .res-hero--master .res-hero-ring{border-color:oklch(from var(--num-brass) l c h / .6)}
    .res-hero--master .res-hero-ring::after{box-shadow:0 0 0 3px oklch(from var(--num-brass) l c h / .22)}
    .res-hero-cap{display:flex;align-items:center;gap:var(--s3);max-width:100%;font-size:.68rem;font-weight:600;color:var(--color-text-muted);letter-spacing:.16em;text-transform:uppercase}
    .res-hero-cap::before,.res-hero-cap::after{content:'';height:1px;width:24px;background:var(--num-rule);flex-shrink:0}
    .res-hero--master .res-hero-cap::before,.res-hero--master .res-hero-cap::after{height:4px;background:none;border-top:1px solid var(--num-brass);border-bottom:1px solid var(--num-brass)}
    @media (prefers-reduced-motion: no-preference){
      /* Тихое появление печати - без поэтапной анимации */
      .res-hero{animation:numSealIn .55s cubic-bezier(.22,.7,.3,1) both}
      @keyframes numSealIn{from{opacity:0;transform:scale(.96)}to{opacity:1;transform:none}}
    }
    /* Блоки трактовки - тихие: линовки-разделители, заголовки капс-латунью. Эмодзи нет. */
    .numero-body{font-size:var(--text-base)}
    /* Эпитет числа - крупный сериф по центру под печатью (титул трактовки) */
    .res-epithet{font-family:var(--font-num);font-style:normal;font-weight:500;font-size:var(--text-xl);line-height:1.15;color:var(--num-brass);text-align:center;margin:calc(-1 * var(--s2)) 0 var(--s5)}
    .res-block{padding:var(--s5) 0;border-top:1px solid var(--num-rule)}
    .res-block:first-child{border-top:0;padding-top:0}
    .res-block-title{font-size:.72rem;font-weight:600;letter-spacing:.13em;text-transform:uppercase;color:var(--num-brass);margin-bottom:var(--s3)}
    .res-block-body{line-height:1.8}
    .res-para{line-height:1.85;margin:var(--s3) 0}
    .res-para:first-child{margin-top:0}
    .res-subhead{font-family:var(--font-num);font-style:normal;font-weight:500;font-size:var(--text-lg);color:var(--num-brass);margin:var(--s5) 0 var(--s2);font-variant-numeric:lining-nums}
    .res-subhead:first-child{margin-top:0}
    /* «О числах» - кнопка-закладка (латунь + line-иконка книги вместо ghost+эмодзи) */
    /* Гайд «О числах» - лонгрид в языке альманаха (scoped: не трогает таро/астро) */
    /* Главы гайда - читательская последовательность 01→07: каждую открывает
       длинная линовка-правило сверху (граница блока), номер и заголовок - под ней. */

    /* ── СИГНАТУРА РАЗДЕЛА: РЕДУКЦИЯ ────────────────────────────────────
       Как из даты получается одна цифра - главное, что нумерология умеет
       показать. Раньше это было рассказано словами в лонгриде и не
       показано там, где служит доказательством: над самим числом. */
    .num-red{font-family:var(--font-num);font-variant-numeric:tabular-nums lining-nums;
      display:flex;flex-direction:column;gap:4px}
    .num-red-line{display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-size:var(--text-sm);
      color:var(--color-text-muted);letter-spacing:.02em}
    .num-red-line.is-final{font-size:var(--text-base)}
    /* Слагаемые приглушены, но не до --color-text-faint: на светлой теме он даёт
       1.93 против фона - цифры формулы становятся почти невидимы. */
    .num-red-src{color:var(--color-text-muted)}
    .num-red-sum{color:var(--color-text)}
    .num-red-root{color:var(--num-root,var(--num-brass));font-weight:500}
    .num-red-arrow{width:12px;height:12px;color:var(--color-text-muted);flex:none;opacity:.7}
    /* Рамка редукции на результате: та же линовка, что у остальных листов */
    .num-red-box{margin-top:var(--s5);padding:var(--s4);border:1px solid var(--num-rule);border-radius:var(--r-lg);
      background:var(--color-surface)}
    .num-red-lbl{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted);margin-bottom:var(--s3)}

    /* ── РАЗВОРОТ: три базовых числа сразу ──────────────────────────────
       Раздел открывался списком из 22 равнозначных строк. Теперь сверху -
       числа, которые у человека уже есть: расчёты бесплатны и мгновенны. */
    .num-trio{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;margin-top:var(--s4);
      background:var(--num-rule);border:1px solid var(--num-rule);border-radius:var(--r-lg);overflow:hidden}
    .num-trio-cell{background:var(--color-surface);padding:var(--s3) var(--s2);display:flex;flex-direction:column;
      align-items:center;gap:5px;text-align:center;border:0;cursor:pointer;font:inherit;color:inherit;
      transition:background .15s;-webkit-tap-highlight-color:transparent;min-height:44px}
    .num-trio-cell:active{background:oklch(from var(--num-brass) l c h / .1)}
    .num-trio-num{font-family:var(--font-num);font-weight:500;font-size:2.5rem;line-height:1;
      color:var(--num-root,var(--num-brass));font-variant-numeric:lining-nums}
    .num-trio-word{font-family:var(--font-num);font-weight:500;font-size:var(--text-sm);color:var(--color-text);
      line-height:1.2}
    .num-trio-name{font-size:.69rem;line-height:1.25;color:var(--color-text-muted)}
    .num-trio-cell:focus-visible{outline:2px solid var(--num-brass);outline-offset:-2px}
    /* Скелетон разворота - та же сетка, чтобы не прыгала вёрстка */
    .num-trio-skel{height:26px;width:60%;margin:0 auto}

    /* Строка «сегодня» - личный день, единственное живое число раздела */
    .num-today{margin-top:var(--s4);border:1px solid var(--num-rule);border-radius:var(--r-lg);
      padding:var(--s3) var(--s4);display:flex;align-items:center;gap:var(--s3);background:var(--color-surface);
      width:100%;text-align:left;font:inherit;color:inherit;cursor:pointer;transition:background .15s;
      -webkit-tap-highlight-color:transparent}
    .num-today:active{background:oklch(from var(--num-brass) l c h / .08)}
    .num-today:focus-visible{outline:2px solid var(--num-brass);outline-offset:2px}
    .num-today-num{font-family:var(--font-num);font-weight:500;font-size:2.1rem;line-height:1;
      color:var(--num-root,var(--num-brass));flex:none;width:30px;text-align:center;
      font-variant-numeric:lining-nums}
    .num-today-txt{min-width:0;display:flex;flex-direction:column}
    .num-today-lbl{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted)}
    .num-today-body{font-size:var(--text-sm);line-height:1.45;margin-top:3px;color:var(--color-text)}

    /* ── ОГЛАВЛЕНИЕ: главы вместо ленты ────────────────────────────────
       19 оставшихся методов свёрнуты в главы. Раскрытая глава показывает
       свои методы; поиск разворачивает всё в плоский список. */
    .num-toc{margin-top:var(--s6)}
    .num-toc-group{border-bottom:1px solid var(--num-rule)}
    .num-toc-row{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) 2px;width:100%;background:none;
      border:0;color:inherit;text-align:left;font:inherit;cursor:pointer;min-height:44px;
      -webkit-tap-highlight-color:transparent}
    .num-toc-row:focus-visible{outline:2px solid var(--num-brass);outline-offset:-2px}
    .num-toc-idx{font-family:var(--font-num);font-weight:500;font-size:var(--text-base);color:var(--num-brass);
      font-variant-numeric:tabular-nums;width:24px;flex:none}
    .num-toc-txt{display:flex;flex-direction:column;min-width:0}
    .num-toc-name{font-size:var(--text-base);color:var(--color-text)}
    .num-toc-sub{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px;line-height:1.4}
    .num-toc-n{margin-left:auto;font-size:var(--text-xs);color:var(--color-text-muted);
      font-variant-numeric:tabular-nums;flex:none}
    .num-toc-chev{width:15px;height:15px;color:var(--color-text-faint);flex:none;margin-left:var(--s2);
      transition:transform .2s}
    .num-toc-group.is-open .num-toc-chev{transform:rotate(90deg)}
    .num-toc-items{padding:0 0 var(--s2) 32px;display:none}
    .num-toc-group.is-open .num-toc-items{display:block}

    /* ── ЛИСТ МЕТОДА: что нужно знать до нажатия ────────────────────── */
    .num-src{margin-top:var(--s5);border-top:1px solid var(--num-rule);border-bottom:1px solid var(--num-rule);
      padding:var(--s3) 0}
    .num-src-lbl{font-size:.64rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--num-brass)}
    .num-src-val{display:flex;align-items:baseline;gap:var(--s3);margin-top:6px}
    .num-src-date{font-family:var(--font-num);font-weight:500;font-size:var(--text-lg);
      font-variant-numeric:tabular-nums;color:var(--color-text)}
    .num-src-from{margin-left:auto;font-size:.64rem;letter-spacing:.1em;text-transform:uppercase;
      color:var(--color-text-faint)}
    .num-preview{margin-top:var(--s5)}
    .num-preview-lbl,.num-inside-lbl{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted);margin-bottom:var(--s2)}
    .num-inside{margin-top:var(--s5)}
    .num-inside-row{display:flex;align-items:baseline;gap:var(--s3);padding:9px 0;
      border-bottom:1px solid var(--num-rule);font-size:var(--text-sm);color:var(--color-text)}
    .num-inside-row:first-of-type{border-top:1px solid var(--num-rule)}
    .num-inside-dot{width:5px;height:5px;border-radius:var(--r-full);background:var(--num-brass);flex:none;
      transform:translateY(-3px)}
    .num-inside-hint{margin-left:auto;font-size:var(--text-xs);color:var(--color-text-muted);flex:none}
    /* Цена на кнопке - приглушённым довеском, как «· 1 токен» в дневнике снов */
    .num-btn-free{font-weight:400;opacity:.75}
    .num-after{margin-top:var(--s3);font-size:var(--text-xs);color:var(--color-text-muted);text-align:center}

    /* ── ПОСЛЕ РАСЧЁТА: следующие числа вместо тупика ───────────────── */
    .num-next{margin-top:var(--s6);border-top:1px solid var(--num-rule);padding-top:var(--s4)}
    .num-next-lbl{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted);margin-bottom:var(--s2)}
    .num-next-row{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) 2px;
      border-bottom:1px solid var(--num-rule);width:100%;background:none;border-left:0;border-right:0;border-top:0;
      color:inherit;text-align:left;font:inherit;cursor:pointer;min-height:44px;
      -webkit-tap-highlight-color:transparent}
    .num-next-row:active{background:oklch(from var(--num-brass) l c h / .08)}
    .num-next-row:focus-visible{outline:2px solid var(--num-brass);outline-offset:-2px}
    .num-next-num{font-family:var(--font-num);font-weight:500;font-size:1.35rem;color:var(--num-brass);
      width:26px;flex:none;text-align:center;font-variant-numeric:lining-nums}
    /* Иконка вместо числа там, где число повторяет исходное (сферы жизненного пути) */
    .num-next-ico{width:26px;flex:none;display:grid;place-items:center;color:var(--num-brass)}
    .num-next-ico svg{width:20px;height:20px}
    .num-next-txt{display:flex;flex-direction:column;min-width:0}
    .num-next-name{font-size:var(--text-sm);color:var(--color-text)}
    .num-next-sub{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px}
    .num-next-chev{margin-left:auto;width:15px;height:15px;color:var(--color-text-faint);flex:none}
    /* Уже прочитанный связанный метод — та же галочка, что в оглавлении */
    .num-next-seen{margin-left:auto;flex:none;width:18px;height:18px;display:grid;place-items:center;
      color:var(--num-brass)}
    .num-next-seen svg{width:15px;height:15px}
    .num-next-row.is-seen .num-next-name{color:var(--color-text-muted)}

    /* ── БАННЕР РАЗДЕЛА: цифра вместо фотографии ────────────────────── */
    #v-numero .num-banner{position:relative;margin-bottom:var(--s5);padding:var(--s4);border-radius:var(--r-lg);
      border:1px solid var(--num-rule);overflow:hidden;
      background:linear-gradient(120deg,oklch(from var(--num-brass) l c h / .1),var(--color-surface) 62%)}
    #v-numero .num-banner-digit{position:absolute;right:-6px;top:-18px;font-family:var(--font-num);font-weight:500;
      font-size:6rem;line-height:1;color:oklch(from var(--num-brass) l c h / .16);letter-spacing:-.04em;
      pointer-events:none;user-select:none;font-variant-numeric:lining-nums}
    #v-numero .num-banner-kicker{font-size:.66rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
      color:var(--num-brass)}
    #v-numero .num-banner-title{font-family:var(--font-num);font-weight:500;font-size:1.62rem;line-height:1.06;
      margin-top:5px;letter-spacing:.01em;color:var(--color-text)}
    #v-numero .num-banner-free{margin-top:9px;font-size:var(--text-xs);color:var(--color-text-muted);
      position:relative}
    #v-numero .num-banner-free b{color:var(--color-text);font-weight:600}
    /* Вход в лонгрид - строка-ссылка из пустого дневника снов (.diary-guide),
       но латунью: бирюза внутри раздела не используется. */
    #v-numero .num-guide{margin-top:var(--s4);margin-bottom:var(--s5);min-height:44px;
      border-color:var(--num-rule)}
    #v-numero .num-guide svg,#v-numero .num-guide em{color:var(--num-brass)}
    #v-numero .num-guide:active{background:oklch(from var(--num-brass) l c h / .08)}

    /* Уже открытый метод: галочка справа и чуть тише название. Не «сделано» —
       расчёты бесплатны и повторяемы, поэтому метка сообщает «вы это видели»,
       а не закрывает пункт: приглушение слабое, без вычёркивания. */
    #v-numero .numero-card{position:relative}
    #v-numero .numero-card.is-seen .numero-card-label{color:var(--color-text-muted)}
    #v-numero .numero-card-seen{position:absolute;right:var(--s2);top:50%;
      transform:translateY(-50%);width:18px;height:18px;display:grid;place-items:center;
      color:var(--num-brass);pointer-events:none}
    #v-numero .numero-card-seen svg{width:15px;height:15px}
    /* Место под галочку, чтобы длинное название не заезжало под неё */
    #v-numero .numero-card.is-seen > span:nth-child(2){padding-right:24px}

    /* Данные из профиля на листе метода - строка реестра, а не поле ввода:
       менять их здесь нельзя, и коробка обещала обратное. Класс общий с профилем,
       поэтому переопределяем строго внутри раздела. */
    #v-numero .ssot-field{background:none;border:0;border-bottom:1px solid var(--num-rule);
      border-radius:0;padding:var(--s2) 0 var(--s3)}
    #v-numero .ssot-field-val{font-family:var(--font-num);font-weight:500;font-size:var(--text-lg);
      color:var(--color-text);font-variant-numeric:tabular-nums lining-nums}
    #v-numero .ssot-field-tag{font-weight:600;letter-spacing:.1em;color:var(--color-text-muted)}
    /* В паре «Вы / Партнёр» колонка вдвое уже - значение и подпись не помещаются
       в строку и налезают друг на друга, поэтому там подпись уходит под значение. */
    #v-numero .numero-pair .ssot-field{flex-direction:column;align-items:flex-start;gap:2px}
    #v-numero .numero-pair .ssot-field-val{font-size:var(--text-base)}

    /* ── ПАРА: сигнатура совместимости ─────────────────────────────────
       Метод сопоставляет два числа, но на экране их не было: слева дата из
       профиля, справа пустой инпут. Своё число известно заранее (посчитано в
       развороте), число партнёра появляется, как только введена дата. */
    .num-duo{display:grid;grid-template-columns:1fr auto 1fr;align-items:stretch;margin-top:var(--s5);
      border:1px solid var(--num-rule);border-radius:var(--r-lg);overflow:hidden;background:var(--color-surface)}
    .num-duo-side{padding:var(--s4) var(--s3) var(--s3);display:flex;flex-direction:column;align-items:center;
      gap:5px;text-align:center;min-width:0}
    .num-duo-role{font-size:.62rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted)}
    .num-duo-num{font-family:var(--font-num);font-weight:500;font-size:2.9rem;line-height:1;
      color:var(--num-root,var(--num-brass));font-variant-numeric:lining-nums}
    .num-duo-word{font-family:var(--font-num);font-weight:500;font-size:var(--text-sm);color:var(--color-text);
      line-height:1.2}
    .num-duo-date{font-size:.72rem;color:var(--color-text-muted);font-variant-numeric:tabular-nums}
    /* Связка - узел из двух дуг, а не сердце: тема бывает и деловая */
    .num-duo-link{width:52px;display:grid;place-items:center;position:relative;
      background:linear-gradient(180deg,transparent,oklch(from var(--num-brass) l c h / .09),transparent)}
    .num-duo-link::before,.num-duo-link::after{content:'';position:absolute;top:0;bottom:0;width:1px;
      background:var(--num-rule)}
    .num-duo-link::before{left:0} .num-duo-link::after{right:0}
    .num-duo-link svg{width:26px;height:26px;color:var(--num-brass)}
    /* Пустая половина - приглашение, а не поломанное поле */
    .num-duo-side.is-empty .num-duo-num{color:var(--color-text-faint)}
    .num-duo-hint{font-size:var(--text-xs);color:var(--num-brass);font-weight:600}

    /* Дата тремя полями: нативный date показывает mm/dd/yyyy - американский
       порядок в русском интерфейсе, и на «Браке» это единственное поле листа. */
    .num-date{display:grid;grid-template-columns:1fr 1.5fr 1fr;gap:var(--s2)}
    #v-numero .num-date input{border:0;border-bottom:1px solid var(--num-rule);border-radius:0;background:none;
      padding:9px 2px;min-height:44px;text-align:center;font-family:var(--font-num);font-size:var(--text-base);
      color:var(--color-text);font-variant-numeric:tabular-nums}
    #v-numero .num-date input:focus{outline:none;border-bottom-color:var(--num-brass);
      box-shadow:0 1px 0 0 var(--num-brass)}
    #v-numero .num-date input:focus-visible{outline:2px solid var(--num-brass);outline-offset:2px}
    .num-date-cap{display:grid;grid-template-columns:1fr 1.5fr 1fr;gap:var(--s2);margin-top:5px;
      font-size:.66rem;color:var(--color-text-muted);text-align:center}
    /* Тема - чипы: сегменты во всю ширину выглядели второй навигацией */
    #v-numero .num-theme{display:flex;gap:var(--s2);flex-wrap:wrap;margin-top:var(--s2);
      border:0;background:none;padding:0}
    /* flex:1 достаётся от .seg-btn и растягивает чипы до наложения - сбрасываем */
    #v-numero .num-theme .seg-btn{flex:0 0 auto;border:1px solid var(--num-rule);border-radius:var(--r-full);
      padding:9px var(--s4);background:none;color:var(--color-text-muted);font-size:var(--text-sm);min-height:44px;
      box-shadow:none}
    #v-numero .num-theme .seg-btn.active{background:var(--num-btn);border-color:var(--num-btn);
      color:var(--num-btn-ink);font-weight:600}
    /* Плашка темы на результате: текст написан под конкретную тему */
    .num-theme-tag{display:inline-flex;align-items:center;gap:6px;margin-top:var(--s4);padding:6px var(--s3);
      border-radius:var(--r-full);border:1px solid var(--num-rule);font-size:var(--text-xs);
      color:var(--color-text-muted)}

    /* ── ШКАЛА СОВМЕСТИМОСТИ ПО КВАДРАТАМ ──────────────────────────────
       Сервер присылает пять зон с уровнем каждого партнёра; до этого они
       жили только внутри прозы. Две полосы рядом показывают расхождение. */
    .num-scale{margin-top:var(--s5)}
    .num-scale-lbl{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted)}
    .num-scale-legend{display:flex;gap:var(--s4);margin-top:var(--s2);font-size:var(--text-xs);
      color:var(--color-text-muted)}
    .num-lg{display:inline-flex;align-items:center;gap:6px}
    .num-lg-key{width:16px;height:3px;border-radius:2px;background:var(--num-brass)}
    .num-lg-key.is-b{background:var(--n7)}
    .num-scale-row{padding:var(--s3) 0;border-bottom:1px solid var(--num-rule)}
    .num-scale-row:first-of-type{border-top:1px solid var(--num-rule)}
    .num-scale-name{font-size:var(--text-sm);margin-bottom:var(--s2)}
    .num-bar{display:grid;grid-template-columns:38px 1fr;align-items:center;gap:9px;margin-top:5px}
    .num-bar-who{font-size:.62rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
      color:var(--color-text-muted)}
    .num-bar-track{height:7px;border-radius:4px;background:oklch(from var(--num-rule) l c h / .7);
      position:relative;overflow:hidden}
    .num-bar-fill{position:absolute;left:0;top:0;bottom:0;border-radius:4px;background:var(--num-brass)}
    .num-bar.is-b .num-bar-fill{background:var(--n7)}

    /* ── ЛЕНТА ОТРЕЗКОВ: пики и вызовы ─────────────────────────────────
       У этих методов нет одного числа - есть четыре, каждое на своём куске
       жизни. Раньше они существовали только внутри прозы. */
    .num-periods{margin-top:var(--s5)}
    .num-per-lbl{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted);margin-bottom:var(--s2)}
    .num-per-row{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s2);
      border-bottom:1px solid var(--num-rule);border-left:2px solid transparent}
    .num-per-row:first-of-type{border-top:1px solid var(--num-rule)}
    /* Отрезок, в котором человек сейчас: латунный кант и подпись - остальные тише */
    .num-per-row.is-now{border-left-color:var(--num-root,var(--num-brass));
      background:oklch(from var(--num-brass) l c h / .06)}
    .num-per-num{font-family:var(--font-num);font-weight:500;font-size:1.9rem;line-height:1;
      color:var(--num-root,var(--num-brass));width:34px;flex:none;text-align:center;
      font-variant-numeric:lining-nums}
    .num-per-txt{display:flex;flex-direction:column;min-width:0}
    .num-per-span{font-size:var(--text-sm);color:var(--color-text);font-variant-numeric:tabular-nums}
    .num-per-word{font-family:var(--font-num);font-weight:500;font-size:var(--text-xs);
      color:var(--color-text-muted);margin-top:2px}
    .num-per-now{margin-left:auto;flex:none;font-size:.62rem;font-weight:600;letter-spacing:.12em;
      text-transform:uppercase;color:var(--num-brass);padding:3px 8px;border-radius:var(--r-full);
      border:1px solid oklch(from var(--num-brass) l c h / .45)}

    /* ── ГЕРОЙ РЕЗУЛЬТАТА: число и его имя ─────────────────────────── */
    .num-hero-word{font-family:var(--font-num);font-weight:500;font-size:var(--text-lg);color:var(--color-text);
      text-align:center;letter-spacing:.01em;margin-top:calc(-1 * var(--s2))}
    /* ══ АСТРОЛОГИЯ - ночная синь ════════════════════════════════════════════
       Голос раздела. Числа говорят латунью, таро - вином, астрология - ночной
       синью: она уже жила здесь как захардкоженная заливка колеса (#0f1327,
       #2a3052), только не была объявлена. Из-за этого раздел падал на общий тил,
       а гороскоп был вручную покрашен в латунь - чужой голос, он принадлежит
       «Альманаху чисел», и в светлой теме его кнопки становились болотными.
       Тил остаётся навигации и кнопкам действия.
       --sec-accent/--sec-rule читает общий каркас каталога (см. .cat-rail). */
    #v-natal{
      --sec-accent:#2E4374;--sec-rule:#d3d6de;
      --sec-accent-2:#4A6199;--sec-btn:#2E4374;--sec-btn-hover:#24345c;--sec-btn-ink:#fff;
      /* Каркас каталога (.tarot-cat/.tarot-row и всё, что рядом) переиспользуется
         разделами, но красится переменными --tar-*, объявленными только в #v-tarot.
         Без этих алиасов в гороскопе римские цифры глав теряли цвет раздела, а
         линовка строк исчезала вовсе: border:1px solid var(--tar-rule) с
         неизвестной переменной становится невалидным и границы не рисуется. */
      --tar-accent:var(--sec-accent);--tar-rule:var(--sec-rule);
      /* Слабость планеты и напряжённый аспект - приглушённый кирпич, а не
         маджента: розовый в этом продукте не значит ничего и спорит с акцентом. */
      --sec-weak:#8C3A2E;
      --font-num:'Literata',Georgia,serif;
      /* Колесо карты. Прежде оно было нарисовано шестнадцатью захардкоженными
         цветами прямо в JS и поэтому не переключалось в светлую тему: на светлом
         фоне посреди страницы оставался тёмно-синий блок. */
      --wheel-bg:#eef0f5;--wheel-hub:#e4e7ef;--wheel-line:#c3c9db;--wheel-tick:#aab2c9;
      --wheel-ink:#2b3350;--wheel-angle:#2E4374;--wheel-hnum:#7e87a3;
      --wheel-planet-bg:#fbfcfe;--wheel-planet-line:#b9c1d6;--wheel-leader:#9aa3bd;
      /* Две карты рядом: вы - тил (акцент продукта), второй - латунь. */
      --wheel-you:#01696f;--wheel-you-soft:#cfe0e2;
      --wheel-them:#a8842f;--wheel-them-soft:#efe3c9;
    }
    [data-theme="dark"] #v-natal{
      --sec-accent:#7B93D1;--sec-rule:#32384a;
      --sec-accent-2:#93A7DC;--sec-btn:#41568f;--sec-btn-hover:#4d64a3;--sec-btn-ink:#fff;
      --sec-weak:#C97A63;
      --wheel-bg:#141828;--wheel-hub:#0f1320;--wheel-line:#2d3348;--wheel-tick:#3a4160;
      --wheel-ink:#dfe3f2;--wheel-angle:#93A7DC;--wheel-hnum:#767e9c;
      --wheel-planet-bg:#1a1f33;--wheel-planet-line:#3d4666;--wheel-leader:#4a5372;
      --wheel-you:#4f98a3;--wheel-you-soft:#173238;
      --wheel-them:#d8b968;--wheel-them-soft:#39301c;
    }
    /* Раздел красит базовые компоненты в свой голос - тем же приёмом, что «Числа». */
    #v-natal .btn-primary{background:var(--sec-btn);border-color:var(--sec-btn);color:var(--sec-btn-ink)}
    #v-natal .btn-primary:hover{background:var(--sec-btn-hover);border-color:var(--sec-btn-hover)}
    #v-natal .seg{border-color:var(--sec-rule);background:none}
    #v-natal .seg-btn.active{background:var(--sec-btn);color:var(--sec-btn-ink)}
    #v-natal .chip:hover{border-color:var(--sec-accent);color:var(--sec-accent)}
    #v-natal .chip.active{background:oklch(from var(--sec-accent) l c h / .14);
      border-color:var(--sec-accent);color:var(--sec-accent)}
    #v-natal .natal-tabs{border-color:var(--sec-rule)}
    #v-natal .natal-tab.active{background:var(--sec-btn);color:var(--sec-btn-ink)}
    /* Знаки и градусы - тоже голосом раздела: тил здесь принадлежит навигации. */
    #v-natal .big3-sign,#v-natal .ptable-sign,#v-natal .point-panel-sign,
    #v-natal .natal-section-h{color:var(--sec-accent)}
    #v-natal .sec-banner-kicker{color:var(--sec-accent)}
    #v-natal .btn-primary:focus-visible,#v-natal .numero-card:focus-visible,
    #v-natal .seg-btn:focus-visible{outline:2px solid var(--sec-accent);outline-offset:2px}

    /* ══ ГОРОСКОП - лист раздела ══════════════════════════════════════════════
       Скоуп .astro-sheet (экран живёт в общем #natalBody). Прежде назывался
       .horo-almanac и объявлял собственные латунные токены; теперь токены
       приходят с #v-natal, и лист говорит голосом своего раздела.
       Своя сигнатура остаётся - эфемеридная лента (ось акцентом, дата-моно). */
    .astro-sheet{--font-num:'Literata',Georgia,serif}
    /* голос кнопок/сегментов/заголовков */
    .astro-sheet .btn-primary{background:var(--sec-btn);border-color:var(--sec-btn);color:var(--sec-btn-ink)}
    .astro-sheet .btn-primary:hover{background:var(--sec-btn-hover);border-color:var(--sec-btn-hover)}
    .astro-sheet .btn-primary:disabled{opacity:.55}
    .astro-sheet .seg{border-color:var(--sec-rule);background:none}
    .astro-sheet .seg-btn.active{background:var(--sec-btn);color:var(--sec-btn-ink)}
    .astro-sheet .sec-banner-kicker{color:var(--sec-accent)}
    .astro-sheet .sec-banner-title,.astro-sheet .result-card-title{font-family:var(--font-num);font-style:normal;font-weight:500;letter-spacing:.01em}
    /* мастхед-подзаголовок раздела */
    .horo-mast-sub{font-family:var(--font-num);font-style:italic;color:var(--color-text-muted);font-size:var(--text-sm);margin:calc(-1*var(--s3)) 0 var(--s4)}
    /* полоса «Небо сейчас» - единственное «общее сейчас», в одном месте */
    .horo-sky{border:1px solid var(--sec-rule);border-left:2px solid var(--sec-accent);border-radius:var(--r-sm);
      background:oklch(from var(--sec-accent) l c h / .04);padding:var(--s3) var(--s4);margin-bottom:var(--s5)}
    .horo-sky-lbl{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--sec-accent);margin-bottom:var(--s2)}
    .horo-sky .moon-banner{margin:0;background:none;border:0;box-shadow:none;padding:var(--s2) 0}
    .horo-sky .result-card{margin:0!important;background:none;border:0;box-shadow:none}
    .horo-sky .result-card-body{padding:var(--s2) 0 0}
    /* переключатель горизонтов (и сводка, и навигация - образец pair-pulse) */
    .horo-hz-lbl{display:block;font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:var(--s2)}
    .horo-hz-row{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--s2);margin-bottom:var(--s5)}
    .horo-hz{appearance:none;cursor:pointer;background:none;border:1px solid var(--sec-rule);border-radius:var(--r-sm);
      padding:var(--s3) 2px var(--s2);text-align:center;color:var(--color-text);font-family:var(--font-num);
      font-weight:500;font-size:var(--text-base);line-height:1.1;transition:background .15s,border-color .15s;min-height:52px}
    .horo-hz:hover{border-color:var(--sec-accent)}
    .horo-hz:focus-visible{outline:2px solid var(--sec-accent);outline-offset:2px}
    .horo-hz.active{background:var(--sec-btn);border-color:var(--sec-btn);color:var(--sec-btn-ink)}
    .horo-hz-sub{display:block;font-family:var(--font-sans);font-weight:500;font-size:.58rem;letter-spacing:.05em;
      text-transform:uppercase;color:var(--color-text-faint);margin-top:3px}
    .horo-hz.active .horo-hz-sub{color:oklch(from var(--sec-btn-ink) l c h / .82)}
    /* модули горизонта - строки-реестра (как numero-card) */
    .horo-mods{margin-bottom:var(--s5)}
    .horo-mod{display:flex;align-items:center;gap:var(--s3);width:100%;text-align:left;cursor:pointer;
      padding:var(--s3) var(--s2);border:0;border-bottom:1px solid var(--sec-rule);
      border-left:2px solid oklch(from var(--sec-accent) l c h / .3);background:none;transition:background .15s,border-color .15s}
    .horo-mod:hover{border-left-color:var(--sec-accent);background:oklch(from var(--sec-accent) l c h / .05)}
    .horo-mod.active{border-left-color:var(--sec-accent);background:oklch(from var(--sec-accent) l c h / .09)}
    .horo-mod:focus-visible{outline:2px solid var(--sec-accent);outline-offset:-2px}
    .horo-mod-ico{color:var(--gold-soft);width:26px;flex-shrink:0;display:inline-flex;justify-content:center}
    .horo-mod-ico svg{width:18px;height:18px;display:block}
    .horo-mod-txt{flex:1;min-width:0}
    .horo-mod-title{display:block;font-family:var(--font-num);font-weight:500;font-size:var(--text-base);color:var(--color-text);line-height:1.2}
    .horo-mod-sub{display:block;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px;line-height:1.35}
    .horo-mod-price{font-size:.64rem;font-weight:600;letter-spacing:.05em;color:var(--sec-accent);
      border:1px solid oklch(from var(--sec-accent) l c h / .4);border-radius:var(--r-full);padding:2px var(--s2);white-space:nowrap;flex-shrink:0}
    .horo-mod-price.free{color:var(--tar-free);border-color:oklch(from var(--tar-free) l c h / .45)}
    /* реестр-панель без коробки-карточки поверх */
    .astro-sheet .natal-form-card{background:none;border:0;border-top:2px solid var(--sec-accent);border-radius:0;box-shadow:none;padding:var(--s5) 0 0}
    .astro-sheet .natal-form-card .label{color:var(--sec-accent);letter-spacing:.12em}
    .astro-sheet .aspect-glyph{color:var(--sec-accent)}
    /* SEGMENTED CONTROL (напр. тема совместимости) */
    .seg{display:flex;gap:var(--s1);padding:var(--s1);border:1px solid var(--color-border);border-radius:var(--r-full);background:var(--color-surface-offset)}
    .seg-btn{flex:1;padding:var(--s2) var(--s3);border-radius:var(--r-full);font-size:var(--text-sm);font-weight:500;color:var(--color-text-muted);background:none;transition:background .15s,color .15s}
    .seg-btn:hover{color:var(--color-text)}
    .seg-btn.active{background:var(--color-btn);color:#fff}
    /* Над таб-баром, а не поверх него: при bottom:24px тост ложился прямо на
       иконки вкладок (таб-бар - 60px плюс safe-area). */
    .toast{position:fixed;bottom:calc(var(--tabbar-h) + var(--safe-bottom) + 12px);left:50%;transform:translateX(-50%);background:var(--color-btn);color:#fff;padding:var(--s3) var(--s5);border-radius:var(--r-full);font-size:var(--text-sm);box-shadow:var(--shadow-md);z-index:100;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s}
    .toast.visible{opacity:1;transform:translateX(-50%) translateY(-4px)}
    /* ═══ NATAL CHART ═══════════════════════════════════════════════ */
    /* Цвета стихий и аспектов - общие для тем (заливки идут с прозрачностью). */
    :root{
      --el-fire:#e0663c;--el-earth:#3f9070;--el-air:#cf9f36;--el-water:#4285c6;
      /* Напряжённый аспект был маджентой #d06aa6 - цвета, которого нет в палитре
         продукта и который читался как ошибка. Приглушённый кирпич говорит
         «трудно», не крича, и не спорит с ночной синью раздела. */
      --asp-soft:#4f98a3;--asp-hard:#8C3A2E;--asp-neutral:#b58a3c;--asp-minor:#8f8d88;
    }
    [data-theme="dark"]{--asp-hard:#C97A63}
    .natal-intro{font-size:var(--text-sm);color:var(--color-text-muted);margin:0 0 var(--s6);line-height:1.6;max-width:62ch}

    /* ── ЛИСТ РАЗДЕЛА: плоский, с линовкой акцентом сверху ─────────────── */
    #v-natal .natal-sheet{padding-top:var(--s4);border-top:2px solid var(--sec-accent);margin-bottom:var(--s4)}
    .natal-sheet-kicker{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted);line-height:1.4}
    .natal-sheet-title{font-family:var(--font-display);font-style:italic;font-weight:400;
      font-size:var(--text-xl);line-height:1.05;margin:6px 0 0;color:var(--color-text)}
    #v-natal .natal-guide{margin:var(--s4) 0 var(--s5);min-height:44px;border-color:var(--sec-rule)}
    #v-natal .natal-guide svg,#v-natal .natal-guide em{color:var(--sec-accent)}
    #v-natal .natal-guide:active{background:oklch(from var(--sec-accent) l c h / .08)}

    /* Заголовок секции со счётчиком - общий ритм с «Числами» и «Таро». */
    .natal-sec{display:flex;align-items:baseline;gap:var(--s3);margin-top:var(--s6);
      padding-bottom:7px;border-bottom:1px solid var(--sec-rule,var(--color-divider))}
    .natal-sec-t{font-size:.66rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;
      color:var(--color-text-muted)}
    .natal-sec-n{margin-left:auto;font-family:var(--font-num,'Literata',Georgia,serif);font-weight:500;
      font-size:1.2rem;line-height:1;color:var(--sec-accent);font-variant-numeric:tabular-nums}
    .natal-sec-lead{margin:var(--s3) 0 0;font-size:var(--text-xs);line-height:1.5;color:var(--color-text-muted)}

    /* ── ГЛИФЫ ВМЕСТО ЭМОДЗИ ──────────────────────────────────────────
       Инлайновый SVG без размеров растягивается на всю ширину контейнера,
       поэтому каждому месту вставки нужен явный размер. */
    .astro-gate-ico{display:grid;place-items:center;margin-bottom:var(--s3);color:var(--sec-accent)}
    .astro-gate-ico svg{width:34px;height:34px}
    .natal-prefill-note > span:first-child{display:inline-flex;flex:none;color:var(--sec-accent)}
    .natal-prefill-note > span:first-child svg{width:15px;height:15px}
    .regen-banner-ico svg{width:15px;height:15px;display:block}
    .big3-glyph-lock{display:grid;place-items:center;opacity:.4}
    .big3-glyph-lock svg{width:24px;height:24px}
    .pair-pulse-emoji{display:inline-flex;line-height:1;color:var(--sec-accent)}
    .pair-pulse-emoji svg{width:15px;height:15px;display:block}
    .partner-score svg{width:13px;height:13px;vertical-align:-2px;color:var(--sec-accent)}
    .pair-mod-glyph{display:inline-flex;width:16px;height:16px;vertical-align:-3px;color:var(--sec-accent)}
    .pair-mod-glyph svg{width:100%;height:100%;display:block}
    .partner-edit-warn > span:first-child{display:inline-flex;flex:none;color:var(--gold)}
    .partner-edit-warn > span:first-child svg{width:15px;height:15px}
    .partner-card-del svg{width:15px;height:15px;display:block}
    #v-natal .btn svg{width:1.05em;height:1.05em;flex:none}

    /* Дата тремя полями - стиль был скоуплен под #v-numero. */
    #v-natal .num-date input{border:1px solid var(--color-field-border);border-radius:var(--r-md);
      background:var(--color-surface-2);padding:9px 2px;min-height:44px;text-align:center;
      font-family:var(--font-num,'Literata',Georgia,serif);font-size:var(--text-base);
      color:var(--color-text);font-variant-numeric:tabular-nums}
    #v-natal .num-date input:focus{outline:none;border-color:var(--sec-accent)}
    /* Звёздочка обязательного поля была цветом ошибки - розовым; поле не сломано,
       оно просто обязательно. */
    #v-natal .req,#v-natal .label .req{color:var(--sec-accent)}

    /* Ошибка с действием. */
    .astro-err{color:var(--color-error);font-size:var(--text-sm);line-height:1.5;margin:0}
    .astro-retry{margin-top:var(--s3)}
    .astro-retry svg{width:15px;height:15px;flex:none}

    .natal-after{margin:var(--s2) 0 0;font-size:var(--text-xs);color:var(--color-text-muted);text-align:center}

    /* ── ХАБ: «НЕБО СЕЙЧАС» И ОГЛАВЛЕНИЕ ──────────────────────────────── */
    .astro-sky{margin-top:var(--s4);border:1px solid var(--sec-rule);border-radius:var(--r-lg);
      overflow:hidden;background:linear-gradient(160deg,oklch(from var(--sec-accent) l c h / .1),var(--color-surface) 62%)}
    .astro-sky:empty{display:none}
    .astro-sky .loader{padding:var(--s5) 0}
    .astro-sky-top{display:flex;align-items:center;gap:var(--s3);padding:var(--s4) var(--s4) var(--s3)}
    .astro-sky-moon{flex:none;display:inline-flex;color:var(--sec-accent)}
    .astro-sky-txt{display:flex;flex-direction:column;min-width:0}
    .astro-sky-lbl{font-size:.62rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--sec-accent)}
    .astro-sky-main{font-family:var(--font-num,'Literata',Georgia,serif);font-weight:500;
      font-size:var(--text-base);margin-top:2px;line-height:1.25}
    .astro-sky-sub{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px}
    .astro-sky-strip{display:flex;border-top:1px solid var(--sec-rule)}
    .astro-sky-cell{flex:1;min-width:0;padding:var(--s3) var(--s2);text-align:center;
      border-right:1px solid var(--sec-rule);display:flex;flex-direction:column;gap:3px}
    .astro-sky-cell:last-child{border-right:0}
    .astro-sky-gl{font-size:var(--text-base);line-height:1;color:var(--sec-accent)}
    .astro-sky-sign{font-family:var(--font-num,'Literata',Georgia,serif);font-weight:500;
      font-size:var(--text-sm);line-height:1.15}
    .astro-sky-cap{font-size:.56rem;letter-spacing:.1em;text-transform:uppercase;color:var(--color-text-faint)}
    .astro-sky-foot{display:flex;align-items:center;gap:6px;padding:9px var(--s4);
      border-top:1px solid var(--sec-rule);font-size:var(--text-xs);color:var(--color-text-muted)}
    .astro-sky-foot b{color:var(--gold);font-weight:600;font-size:var(--text-sm)}

    /* Лента ближайших событий неба: лунации, затмения, развороты ретро. */
    .sky-ev{border-top:1px solid var(--sec-rule)}
    .sky-ev-row{display:flex;align-items:center;gap:10px;padding:9px var(--s4);
      border-bottom:1px solid var(--sec-rule)}
    .sky-ev-row:last-child{border-bottom:0}
    .sky-ev-when{width:56px;flex:none;font-size:.66rem;font-weight:600;color:var(--sec-accent);
      font-variant-numeric:tabular-nums}
    .sky-ev-gl{width:16px;flex:none;text-align:center;font-size:var(--text-sm)}
    .sky-ev-t{flex:1;min-width:0;font-size:var(--text-xs);line-height:1.35}
    .sky-ev-t i{display:block;font-style:normal;font-size:.66rem;color:var(--color-text-muted);margin-top:1px}
    .sky-ev-badge{flex:none;padding:1px 8px;border-radius:var(--r-full);font-size:.6rem;font-weight:600;
      background:oklch(from var(--gold) l c h / .18);color:var(--gold)}

    /* Условия раздела: цена названа один раз, а не бейджем на каждой строке. */
    .astro-terms{margin:var(--s4) 0 0;border:1px solid var(--sec-rule);border-radius:var(--r-lg);overflow:hidden}
    .astro-term{display:flex;align-items:center;gap:var(--s3);padding:11px var(--s4);
      font-size:var(--text-sm);border-bottom:1px solid var(--sec-rule)}
    .astro-term:last-child{border-bottom:0}
    .astro-term > span:first-child{flex:1;min-width:0}
    #v-natal .tarot-premium{display:inline-flex;align-items:center;gap:3px;background:none;
      color:var(--sec-accent);border:1px solid oklch(from var(--sec-accent) l c h / .42);
      font-variant-numeric:tabular-nums;margin-left:0}

    .astro-toc{margin-top:2px}
    .astro-ch{display:flex;align-items:center;gap:var(--s3);width:100%;min-height:52px;
      padding:var(--s3) 2px;background:none;border:0;
      border-bottom:1px solid var(--sec-rule);text-align:left;color:inherit;font:inherit;
      cursor:pointer;-webkit-tap-highlight-color:transparent;transition:background .15s}
    .astro-ch:active{background:oklch(from var(--sec-accent) l c h / .08)}
    .astro-ch:focus-visible{outline:2px solid var(--sec-accent);outline-offset:-2px}
    .astro-ch-idx{width:24px;flex:none;font-family:var(--font-num,'Literata',Georgia,serif);
      font-weight:500;font-size:var(--text-base);color:var(--sec-accent)}
    .astro-ch-txt{display:flex;flex-direction:column;min-width:0;gap:2px}
    .astro-ch-name{font-size:var(--text-base);color:var(--color-text)}
    .astro-ch-sub{font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.35}
    .astro-ch-n{margin-left:auto;font-size:var(--text-xs);color:var(--color-text-muted);
      font-variant-numeric:tabular-nums;flex:none}
    .astro-ch-chev{width:15px;height:15px;flex:none;margin-left:var(--s2);color:var(--color-text-faint)}

    /* ── ПОЛОСА ДНЕЙ (неделя и лучшие дни) ────────────────────────────
       Пришла на смену тепловой полосе (.heat-*, удалена). Прежняя растягивала индекс от
       минимума ряда к максимуму, и разброс в один пункт из ста рисовался как
       контраст в пять раз - полоса показывала шум расчёта. Здесь шкала
       абсолютная (40-95 - рабочий диапазон индекса), а день несут три канала:
       подпись дня недели, число и высота столбика. Смысл не должен держаться
       на одном цвете, а колонка обязана быть крупнее 44 px. */
    .flow-strip{display:flex;gap:4px;margin-top:var(--s3);align-items:flex-end}
    .flow-day{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;
      padding-bottom:4px;border-radius:8px}
    .flow-wd{font-size:.6rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase;
      color:var(--color-text-faint);margin-bottom:2px}
    .flow-day.is-today .flow-wd{color:var(--sec-accent)}
    .flow-n{font-family:var(--font-num);font-size:.78rem;font-weight:500;color:var(--color-text-muted);
      font-variant-numeric:tabular-nums;margin-bottom:5px}
    .flow-day.is-today .flow-n{color:var(--color-text);font-weight:600}
    .flow-col{width:100%;height:74px;display:flex;align-items:flex-end;border-radius:4px;
      overflow:hidden;background:oklch(from var(--sec-accent) l c h / .08)}
    .flow-col i{display:block;width:100%;background:var(--sec-accent);border-radius:3px 3px 0 0}
    .flow-day.is-today .flow-col{box-shadow:inset 0 0 0 1.5px var(--sec-accent-2,var(--sec-accent))}
    .flow-v{font-family:var(--font-num);font-size:.64rem;color:var(--color-text-faint);
      font-variant-numeric:tabular-nums;margin-top:4px}
    .flow-day.is-peak .flow-v{color:var(--sec-accent);font-weight:600}
    .flow-mark{height:11px;display:flex;align-items:center;justify-content:center;margin-top:2px;
      color:var(--sec-accent)}
    .flow-mark svg{width:11px;height:11px}
    /* Подписи шкалы под полосой не было смысла держать: границы «спокойнее /
       насыщеннее» и без того читаются по высоте столбиков, а число разброса
       называет вердикт ниже. */
    .flow-verdict{margin:var(--s4) 0 0;padding:10px 12px;background:var(--color-surface);
      border:1px solid var(--sec-rule,var(--color-divider));border-left:2px solid var(--sec-accent);
      border-radius:0 var(--r-sm) var(--r-sm) 0;font-size:var(--text-sm);color:var(--color-text)}
    /* Две недели - двумя строками по семь: четырнадцать колонок в ряд давали
       21 px на день, вдвое меньше нормы тач-цели. */
    .flow-split{display:grid;gap:var(--s4);margin-top:var(--s3)}
    .flow-half-l{font-size:.6rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
      color:var(--color-text-faint);margin-bottom:2px}
    .flow-half.is-now .flow-half-l{color:var(--sec-accent)}
    .flow-half .flow-strip{margin-top:0}
    .flow-half .flow-col{height:60px}
    .flow-picks{margin-top:var(--s3)}
    .flow-pick{display:flex;align-items:center;gap:var(--s3);padding:9px 0;
      border-bottom:1px solid var(--sec-rule,var(--color-divider))}
    .flow-pick:last-child{border-bottom:0}
    .flow-pick-l{font-size:.62rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
      color:var(--color-text-muted);width:96px;flex:none}
    .flow-pick-v{display:flex;gap:6px;flex-wrap:wrap}
    .flow-tag{font-family:var(--font-num);font-size:var(--text-xs);padding:3px 10px;
      border-radius:var(--r-full);border:1px solid var(--sec-accent);color:var(--sec-accent);
      font-variant-numeric:tabular-nums}
    .flow-tag.calm{border-color:var(--color-border);color:var(--color-text-muted)}

    /* События недели: дата, участники аспекта и день, когда он точен. */
    .wk-events{margin-top:var(--s2)}
    .wk-ev{display:flex;align-items:flex-start;gap:var(--s3);padding:11px 0;
      border-bottom:1px solid var(--sec-rule,var(--color-divider))}
    .wk-ev:last-child{border-bottom:0}
    .wk-ev-d{font-family:var(--font-num);font-size:var(--text-xs);font-weight:500;
      color:var(--sec-accent);font-variant-numeric:tabular-nums;flex:none;width:52px;padding-top:1px}
    .wk-ev-b{min-width:0;flex:1}
    .wk-ev-n{font-size:var(--text-sm);display:flex;align-items:center;gap:5px;flex-wrap:wrap}
    .wk-ev-s{display:block;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px}

    /* ── ЛЕНТА СОБЫТИЙ МЕСЯЦА ─────────────────────────────────────────
       Окно месяца идёт с первого числа, поэтому к его концу большая часть
       событий уже позади. Прошедшее сворачивается, но не выбрасывается:
       платный разбор опирается на весь месяц. */
    .ev-group{font-size:.62rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
      color:var(--color-text-faint);margin:var(--s3) 0 2px;display:flex;align-items:center;gap:8px}
    .ev-group.now{color:var(--sec-accent)}
    .ev-group .n{font-variant-numeric:tabular-nums}
    .horo-past summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:8px;
      min-height:44px;font-size:.68rem;letter-spacing:.1em;text-transform:uppercase;
      font-weight:600;color:var(--color-text-faint);border-top:1px solid var(--sec-rule,var(--color-divider))}
    .horo-past summary::-webkit-details-marker{display:none}
    .horo-past summary::after{content:'';width:7px;height:7px;border-right:1.5px solid currentColor;
      border-bottom:1.5px solid currentColor;transform:rotate(45deg);margin-left:auto;
      transition:transform .18s}
    .horo-past[open] summary::after{transform:rotate(-135deg)}
    .horo-past .wk-ev{opacity:.55}
    .ev-when{font-size:.62rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase;
      color:var(--sec-accent);border:1px solid oklch(from var(--sec-accent) l c h / .45);
      padding:1px 7px;border-radius:var(--r-full);white-space:nowrap}

    /* ── ЛУНАЦИИ ──────────────────────────────────────────────────────
       Фазы рисуются кругом в цвете раздела: залитый - полная, контурный -
       новая. Прежде здесь стояли эмодзи, и в тёмной теме полнолуние было
       единственным цветным пятном на экране. */
    .lun{display:flex;gap:var(--s3);padding:var(--s4) 0;
      border-bottom:1px solid var(--sec-rule,var(--color-divider))}
    .lun:last-of-type{border-bottom:0}
    .moon-dial{width:44px;height:44px;flex:none}
    .lun-b{min-width:0;flex:1}
    .lun-t{font-family:var(--font-num);font-size:var(--text-base);font-weight:500;
      display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
    .lun-when{font-family:var(--font-body);font-size:.68rem;font-weight:600;
      letter-spacing:.05em;text-transform:uppercase;color:var(--sec-accent)}
    .lun-place{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:3px}
    /* Затмение - латунью: это внимание и незавершённость, роль латуни в продукте.
       Кирпичный бейдж (цвет ошибки) читался как сбой системы. */
    .eclipse-tag{display:inline-flex;align-items:center;gap:5px;margin-top:7px;padding:2px 9px;
      border-radius:var(--r-full);font-size:.66rem;font-weight:600;color:var(--gold);
      border:1px solid oklch(from var(--gold) l c h / .55);
      background:oklch(from var(--gold) l c h / .1)}

    /* Касания карты: глиф аспекта, точка карты, орбис колонкой. Прежде это был
       абзац «соединение Луна 0.2° · секстиль Плутон 3.2°», который не читался. */
    .touch{margin-top:var(--s2)}
    .touch-l{font-size:.6rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
      color:var(--color-text-faint);margin-bottom:4px}
    .touch-row{display:flex;align-items:center;gap:7px;font-size:var(--text-xs);padding:3px 0}
    .touch-orb{margin-left:auto;font-family:var(--font-num);color:var(--color-text-faint);
      font-variant-numeric:tabular-nums}

    /* ── РЕТРОГРАДЫ ───────────────────────────────────────────────────
       Ретроградность - латунь: та же роль «незавершённости», что у черновика и
       статуса «ждёт разбора». Синь раздела остаётся датам и событиям. */
    /* Имя .retro занято давним inline-классом (пометка «℞» у планеты в таблицах),
       поэтому карточка ретро-планеты названа иначе - иначе каскад красит в латунь
       весь её текст, включая названия точек карты. */
    .rx-card{padding:var(--s4) 0;border-bottom:1px solid var(--sec-rule,var(--color-divider))}
    .rx-card:last-of-type{border-bottom:0}
    .retro-hd{display:flex;align-items:center;gap:var(--s3)}
    .retro-gl{width:30px;height:30px;flex:none;display:flex;align-items:center;justify-content:center;
      border-radius:var(--r-sm);font-size:1rem;color:var(--gold);font-variant-emoji:text;
      background:oklch(from var(--gold) l c h / .12);
      border:1px solid oklch(from var(--gold) l c h / .32)}
    .retro-n{font-family:var(--font-num);font-size:var(--text-base);font-weight:500}
    .retro-rx{color:var(--gold)}
    .retro-place{font-size:var(--text-xs);color:var(--color-text-muted);margin-left:auto;text-align:right}
    .retro-till{display:flex;align-items:center;gap:9px;margin-top:9px;
      font-size:var(--text-xs);color:var(--color-text-muted)}
    .retro-left{margin-left:auto;font-family:var(--font-num);font-variant-numeric:tabular-nums;
      color:var(--gold);white-space:nowrap}
    /* Строка про Меркурий - самый частый вопрос аудитории; ответ выводится из
       отсутствия планеты в списке текущих ретро, без единого расчёта. */
    .merc{display:flex;align-items:center;gap:9px;margin-top:var(--s4);padding:11px 13px;
      border:1px solid var(--sec-rule,var(--color-divider));border-left:2px solid var(--color-primary);
      border-radius:0 var(--r-sm) var(--r-sm) 0;background:var(--color-surface);font-size:var(--text-sm)}

    /* ── ЛУНА ДНЯ И СОБЫТИЕ СУТОК ─────────────────────────────────────
       Фаза рисуется терминатором из угла Солнце-Луна (moonPhaseSvg), а не
       берётся эмодзи: системный шрифт красит 🌕 в жёлтый и ломает ряд. */
    .moon-day{display:flex;align-items:center;gap:var(--s4);margin-top:var(--s3)}
    .moon-day-dial{flex:none;color:var(--sec-accent);line-height:0}
    .moon-day-b{min-width:0;flex:1}
    .moon-day-t{font-family:var(--font-num);font-size:1.05rem;font-weight:500;display:block}
    .moon-day-s{display:block;font-size:var(--text-sm);color:var(--color-text-muted);margin-top:3px}
    .moon-day-x{display:block;font-size:var(--text-xs);color:var(--color-text-faint);margin-top:5px}
    /* Аспект, который перфектит именно сегодня: бывает не каждый день, поэтому
       вынесен из общего списка транзитов в собственную рамку. */
    .exact{display:flex;align-items:center;gap:var(--s3);margin-top:var(--s3);padding:13px 14px;
      border:1px solid var(--sec-rule,var(--color-divider));border-left:2px solid var(--sec-accent);
      border-radius:0 var(--r-md) var(--r-md) 0;background:var(--color-surface)}
    .exact+.exact{margin-top:var(--s2)}
    .exact-b{min-width:0;flex:1}
    .exact-n{font-size:var(--text-base);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
    .exact-s{display:block;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:3px}

    /* ── РИТМ ГОДА ────────────────────────────────────────────────────
       Не индекс энергии (та величина живёт на неделе и выглядит иначе), а
       плотность: сколько точных проходов приходится на месяц. Высота столбика
       и подпись говорят одно и то же число. */
    .rhythm{display:flex;gap:3px;margin-top:var(--s3);align-items:flex-end}
    .rm{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;padding-bottom:3px}
    .rm-c{width:100%;height:52px;display:flex;align-items:flex-end;border-radius:3px;
      background:oklch(from var(--sec-accent) l c h / .07)}
    .rm-c i{display:block;width:100%;background:var(--sec-accent);border-radius:2px 2px 0 0}
    .rm.past .rm-c i{background:oklch(from var(--sec-accent) l c h / .42)}
    .rm.now .rm-c{box-shadow:inset 0 0 0 1.5px var(--sec-accent-2,var(--sec-accent))}
    .rm-m{font-size:.55rem;color:var(--color-text-faint);margin-bottom:3px}
    .rm.now .rm-m{color:var(--sec-accent)}
    .rm-n{font-family:var(--font-num);font-size:.6rem;color:var(--color-text-faint);
      font-variant-numeric:tabular-nums;margin-top:4px}
    .rm.now .rm-n{color:var(--color-text);font-weight:600}
    /* Ретро-возврат: планета проходит точку дважды. Латунь - «незавершённость»:
       тема вернётся, и это полезнее самой даты. */
    .again{color:var(--gold);white-space:nowrap}

    /* ── ЛИЧНЫЙ ГОД (СОЛЯР) ───────────────────────────────────────────
       Полоса уместна здесь и не уместна у ретро: тут известны обе границы
       цикла и сегодняшний день, там даты начала нет вовсе. */
    .cycle{margin-top:var(--s4)}
    .cycle-track{height:8px;border-radius:4px;overflow:hidden;
      background:oklch(from var(--sec-accent) l c h / .1)}
    .cycle-track i{display:block;height:100%;background:var(--sec-accent);border-radius:4px}
    .cycle-ends{display:flex;justify-content:space-between;margin-top:7px;
      font-size:var(--text-xs);color:var(--color-text-muted);font-family:var(--font-num);
      font-variant-numeric:tabular-nums}
    .cycle-mark{display:flex;align-items:baseline;gap:8px;margin-top:var(--s3);font-size:var(--text-sm)}
    .cycle-big{font-family:var(--font-num);font-size:1.5rem;font-weight:500;color:var(--sec-accent);
      font-variant-numeric:tabular-nums;line-height:1}
    .solar-rows{margin-top:var(--s3)}
    .srow{display:flex;align-items:baseline;gap:var(--s3);padding:9px 0;
      border-bottom:1px solid var(--sec-rule,var(--color-divider));font-size:var(--text-sm)}
    .srow:last-child{border-bottom:0}
    .srow-l{color:var(--color-text-muted);font-size:.73rem;letter-spacing:.06em;
      text-transform:uppercase;width:118px;flex:none}
    .srow-v{font-family:var(--font-num);font-variant-numeric:tabular-nums}

    /* Длинные названия точек («Середина неба», «Северный узел») отрывали глиф
       аспекта от текста, и строка события разваливалась на две. */
    .wk-ev-n .aspect-glyph{flex:none}

    /* Даты окна под заголовком листа. */
    .natal-sheet-window{font-family:var(--font-num);font-size:var(--text-sm);font-weight:500;
      color:var(--sec-accent);font-variant-numeric:tabular-nums;margin-top:2px}

    /* Удаление пары - тихо, внизу и в стороне от продуктов. */
    .pair-danger{margin-top:var(--s8);padding-top:var(--s4);
      border-top:1px solid var(--sec-rule,var(--color-divider));text-align:center}
    .pair-del{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 var(--s3);
      font-size:var(--text-xs);color:var(--color-text-faint);cursor:pointer}
    .pair-del svg{width:13px;height:13px}
    .pair-del:active{color:var(--sec-weak)}

    /* Модули пары в разделе - без заливки: серая подложка спорила с
       поверхностью страницы и делала продукты похожими на выключенные блоки.
       Держит их рамка, как модуль «Полные данные карты» на натальной. */
    #v-natal .pair-mod{background:none;border-color:var(--sec-rule);border-radius:var(--r-lg);
      margin-bottom:var(--s3)}
    /* Первый модуль после секции стоял вплотную к её последней строке.
       Список домов теперь обёрнут в .ov-block - соседний селектор надо было
       обновить вместе с разметкой, иначе правило молча перестаёт работать. */
    #v-natal .ov-block + .pair-mod,#v-natal .rul + .pair-mod,
    #v-natal .natal-inside + .pair-mod,#v-natal .met + .pair-mod{margin-top:var(--s6)}
    #v-natal .pair-mod-title{font-weight:500;font-family:var(--font-num,'Literata',Georgia,serif);
      font-size:var(--text-base)}
    #v-natal .pair-mod-head{padding:var(--s3) var(--s4)}
    #v-natal .pair-mod-body{padding:0 var(--s4) var(--s4)}

    /* Голова модуля - кнопка на всю ширину: нажимается вся строка. */
    #v-natal .pair-mod-head{width:100%;background:none;border:0;color:inherit;font:inherit;
      text-align:left;cursor:pointer;min-height:52px;-webkit-tap-highlight-color:transparent}
    #v-natal .pair-mod-head:focus-visible{outline:2px solid var(--sec-accent);outline-offset:-2px}
    #v-natal .pair-mod-txt{display:flex;flex-direction:column;min-width:0;gap:2px;flex:1}
    #v-natal .pair-mod-side:empty{display:none}

    /* Оверлеи домов: две стороны подряд, тематические дома помечены полосой
       слева - отбирать по теме нельзя, так исчезала большая часть данных. */
    .ov-block{margin-top:var(--s4)}
    .ov-lbl{font-size:.62rem;font-weight:600;letter-spacing:.12em;text-transform:uppercase;
      color:var(--color-text-muted);margin-bottom:var(--s2)}
    .ov-pl{display:flex;gap:5px;flex-wrap:wrap;min-width:0;flex:none}
    .ov-name{margin-left:var(--s2);font-size:var(--text-sm);color:var(--color-text);
      min-width:0;overflow-wrap:anywhere}
    .rul-row.is-hot{border-left:2px solid var(--sec-accent);padding-left:var(--s2);margin-left:-2px}
    .rul-row.is-hot .rul-h{color:var(--sec-accent);font-weight:600}

    /* ── МЕТРЫ ПАРЫ ───────────────────────────────────────────────────
       Плотность и баланс полосами со шкалой: число само по себе ни о чём не
       говорит, пока не видно, где оно стоит между «редкой» и «плотной». */
    .met{margin-top:var(--s5)}
    .met-row{margin-top:var(--s4)}
    .met-row:first-child{margin-top:0}
    .met-h{display:flex;align-items:baseline;gap:var(--s2);font-size:var(--text-xs);color:var(--color-text-muted)}
    .met-h b{margin-left:auto;color:var(--color-text);font-weight:600;font-size:var(--text-sm);
      text-align:right;font-variant-numeric:tabular-nums}
    .met-bar{height:5px;border-radius:3px;background:var(--sec-rule,var(--color-divider));
      margin-top:6px;overflow:hidden}
    .met-bar i{display:block;height:100%;border-radius:3px;background:var(--sec-accent);
      transition:width .5s ease}
    .met-ticks{display:flex;justify-content:space-between;font-size:.56rem;color:var(--color-text-faint);
      margin-top:5px;letter-spacing:.06em;text-transform:uppercase}

    /* ── КАРТОЧКА ЧЕЛОВЕКА ────────────────────────────────────────────
       Список людей читается как обзор всех пар сразу: буква, данные и три
       индекса. Прочерк вместо нуля там, где тема ещё не считалась. */
    .partner-picker{display:block;margin-top:var(--s4)}
    .per{display:flex;align-items:center;gap:var(--s3);width:100%;min-height:56px;
      padding:var(--s3) 2px;background:none;border:0;
      border-bottom:1px solid var(--sec-rule,var(--color-divider));
      text-align:left;color:inherit;font:inherit;cursor:pointer;position:relative;
      -webkit-tap-highlight-color:transparent;transition:background .15s}
    .per:active{background:oklch(from var(--sec-accent) l c h / .08)}
    .per:focus-visible{outline:2px solid var(--sec-accent);outline-offset:-2px}
    .per-av{width:36px;height:36px;border-radius:var(--r-full);flex:none;display:grid;place-items:center;
      font-family:var(--font-num,'Literata',Georgia,serif);font-weight:500;font-size:var(--text-base);
      color:var(--sec-accent);background:oklch(from var(--sec-accent) l c h / .12);
      border:1px solid oklch(from var(--sec-accent) l c h / .3)}
    .per-txt{display:flex;flex-direction:column;min-width:0;gap:2px;flex:1}
    .per-nm{font-size:var(--text-sm);color:var(--color-text)}
    .per-sub{display:block;font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.35}
    .per-ix{display:flex;gap:var(--s3);flex:none;margin-left:auto;padding-right:20px}
    .per-i{text-align:center;min-width:30px}
    .per-i b{display:block;font-family:var(--font-num,'Literata',Georgia,serif);font-weight:500;
      font-size:var(--text-sm);line-height:1;color:var(--sec-accent);font-variant-numeric:tabular-nums}
    .per-i span{display:block;font-size:.52rem;letter-spacing:.05em;text-transform:uppercase;
      color:var(--color-text-faint);margin-top:3px}
    .per-i.na b{color:var(--color-text-faint)}
    .per-del{position:absolute;right:0;top:50%;transform:translateY(-50%);
      width:26px;height:26px;display:grid;place-items:center;color:var(--color-text-faint);
      border-radius:var(--r-sm)}
    .per-del svg{width:13px;height:13px}
    .per-del:active{color:var(--sec-weak)}
    .per-confirm{flex-direction:column;align-items:flex-start;gap:var(--s2);cursor:default}
    .per-confirm-q{font-size:var(--text-sm);line-height:1.4}
    .per-confirm-act{display:flex;gap:var(--s2)}

    /* ── СТРОКА ТРАНЗИТА / КОНТАКТА ПАРЫ ──────────────────────────────
       Одна строка: глиф, суть, полоса точности и направление. Полоса читается
       быстрее числа - чем ближе аспект к точному, тем она длиннее. */
    .tr-row{display:flex;align-items:center;gap:var(--s3);padding:10px 2px;
      border-bottom:1px solid var(--sec-rule,var(--color-divider))}
    .tr-gl{width:18px;flex:none;text-align:center;font-size:var(--text-base);color:var(--color-text)}
    .tr-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
    .tr-nm{font-size:var(--text-sm);line-height:1.3}
    .tr-sub{font-size:var(--text-xs);color:var(--color-text-muted);font-variant-numeric:tabular-nums}
    /* Глиф особой связки пары: цвет по характеру, но без плашки .aspect-glyph -
       в ряду строк с планетными глифами плашки читались как чужие кнопки. */
    .tr-gl-soft{color:var(--asp-soft)}
    .tr-gl-hard{color:var(--asp-hard)}
    .tr-gl-neutral{color:var(--asp-neutral)}
    .tr-orb{width:44px;flex:none;height:3px;border-radius:2px;
      background:var(--sec-rule,var(--color-divider));overflow:hidden}
    .tr-orb i{display:block;height:100%;background:var(--sec-accent,var(--color-primary))}

    /* Направление транзита: нарастает или расходится. */
    .tr-motion{display:inline-flex;align-items:center;gap:3px;flex:none;font-size:.6rem;
      font-weight:600;letter-spacing:.03em;white-space:nowrap}
    .tr-motion svg{width:11px;height:11px;flex:none}
    .tr-motion.up{color:var(--sec-accent)}
    .tr-motion.dn{color:var(--color-text-faint)}

    /* ── ПОЛОСА НЕБА ──────────────────────────────────────────────────── */
    .natal-band{margin-top:var(--s5)}
    .natal-band-head{display:flex;align-items:baseline;gap:var(--s2);margin-bottom:7px}
    .natal-band-t{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--color-text-muted)}
    .natal-band-hint{margin-left:auto;font-size:.66rem;color:var(--color-text-faint)}
    .sky-band{width:100%;display:block;overflow:visible}

    /* ── СЕКТА ────────────────────────────────────────────────────────── */
    .natal-sect{display:flex;align-items:center;gap:var(--s3);margin-top:var(--s5);
      padding:var(--s3) var(--s4);border:1px solid var(--sec-rule);border-radius:var(--r-lg);
      background:var(--color-surface)}
    .natal-sect svg{width:56px;height:42px;flex:none;color:var(--color-text-faint)}
    .natal-sect-t{font-family:var(--font-num,'Literata',Georgia,serif);font-weight:500;font-size:var(--text-base)}
    .natal-sect-d{font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.45;margin-top:2px}

    /* ── СИЛА ПЛАНЕТ ──────────────────────────────────────────────────── */
    .dig{margin-top:var(--s3)}
    .dig-row{display:flex;align-items:center;gap:var(--s3);padding:9px 2px;
      border-bottom:1px solid var(--sec-rule,var(--color-divider))}
    .dig-gl{width:20px;flex:none;text-align:center;font-size:var(--text-base);color:var(--color-text)}
    .dig-nm{font-size:var(--text-sm);width:82px;flex:none}
    .dig-scale{flex:1;min-width:40px;height:20px;position:relative}
    .dig-track{position:absolute;left:0;right:0;top:9px;height:2px;border-radius:2px;
      background:linear-gradient(90deg,var(--sec-weak) 0%,
        oklch(from var(--sec-weak) l c h / .35) 22%,
        var(--sec-rule) 38%,var(--sec-rule) 62%,
        oklch(from var(--sec-accent) l c h / .4) 76%,var(--sec-accent) 100%)}
    .dig-pin{position:absolute;top:2px;width:2.5px;height:16px;border-radius:2px;
      background:var(--color-text);transform:translateX(-1.25px);
      box-shadow:0 0 0 2px var(--color-bg)}
    .dig-tag{width:88px;flex:none;text-align:right;font-size:var(--text-xs);font-weight:600}
    .dig-tag.strong{color:var(--sec-accent)}
    .dig-tag.weak{color:var(--sec-weak)}
    .dig-key{display:flex;justify-content:space-between;font-size:.6rem;letter-spacing:.08em;
      text-transform:uppercase;color:var(--color-text-faint);margin-top:7px;padding:0 2px}

    /* ── КОНФИГУРАЦИИ ─────────────────────────────────────────────────── */
    .cfg{display:flex;gap:var(--s3);margin-top:var(--s3);overflow-x:auto;padding-bottom:var(--s2);
      scrollbar-width:none;-webkit-overflow-scrolling:touch}
    .cfg::-webkit-scrollbar{display:none}
    .cfg-card{flex:none;width:152px;border:1px solid var(--sec-rule);border-radius:var(--r-lg);
      padding:var(--s3);background:var(--color-surface)}
    .cfg-fig{width:100%;height:62px;display:block;margin-bottom:var(--s2)}
    .cfg-nm{font-family:var(--font-num,'Literata',Georgia,serif);font-weight:500;font-size:var(--text-sm);line-height:1.2}
    .cfg-in{font-size:.68rem;color:var(--sec-accent);margin-top:3px;font-weight:600;line-height:1.3}
    .cfg-d{font-size:.68rem;color:var(--color-text-muted);line-height:1.4;margin-top:5px}

    /* ── ЦЕПОЧКИ УПРАВИТЕЛЕЙ ──────────────────────────────────────────── */
    .rul{margin-top:var(--s3)}
    .rul-row{display:flex;align-items:center;gap:6px;padding:9px 2px;flex-wrap:wrap;
      border-bottom:1px solid var(--sec-rule,var(--color-divider));font-size:var(--text-xs)}
    .rul-h{width:24px;flex:none;font-family:var(--font-num,'Literata',Georgia,serif);font-weight:500;
      font-size:var(--text-sm);color:var(--sec-accent);font-variant-numeric:tabular-nums}
    .rul-gl{font-size:var(--text-sm)}
    .rul-arw{color:var(--color-text-faint)}
    .rul-end{margin-left:auto;color:var(--color-text-muted);white-space:nowrap}

    /* ── СВЁРНУТЫЙ МОДУЛЬ «ПОЛНЫЕ ДАННЫЕ» ─────────────────────────────── */
    .natal-mod{margin-top:var(--s6);border:1px solid var(--sec-rule);border-radius:var(--r-lg);overflow:hidden}
    .natal-mod-row{display:flex;align-items:center;gap:var(--s3);width:100%;min-height:52px;
      padding:var(--s3) var(--s4);background:none;border:0;text-align:left;color:inherit;font:inherit;
      cursor:pointer;-webkit-tap-highlight-color:transparent}
    .natal-mod-row:focus-visible{outline:2px solid var(--sec-accent);outline-offset:-2px}
    .natal-mod-ico{width:30px;height:30px;border-radius:var(--r-sm);flex:none;display:grid;place-items:center;
      color:var(--sec-accent);background:oklch(from var(--sec-accent) l c h / .1);
      border:1px solid oklch(from var(--sec-accent) l c h / .28)}
    .natal-mod-ico svg{width:17px;height:17px;display:block}
    .natal-mod-t{display:block;font-size:var(--text-sm)}
    .natal-mod-s{display:block;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px}
    .natal-mod-chev{width:15px;height:15px;flex:none;margin-left:auto;color:var(--color-text-faint);transition:transform .2s}
    .natal-mod.is-open .natal-mod-chev{transform:rotate(90deg)}
    .natal-mod-body{display:none;padding:0 var(--s3) var(--s4)}
    .natal-mod.is-open .natal-mod-body{display:block}

    /* ── ЧТО БУДЕТ В РАЗБОРЕ ──────────────────────────────────────────── */
    .natal-inside{margin-top:var(--s4)}
    .natal-inside-lbl{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted);margin-bottom:var(--s2)}
    .natal-inside-row{display:flex;align-items:baseline;gap:var(--s3);padding:9px 0;
      border-bottom:1px solid var(--sec-rule,var(--color-divider));font-size:var(--text-sm);color:var(--color-text)}
    .natal-inside-row:first-of-type{border-top:1px solid var(--sec-rule,var(--color-divider))}
    .natal-inside-dot{width:5px;height:5px;border-radius:var(--r-full);background:var(--sec-accent);
      flex:none;transform:translateY(-3px)}
    /* Форма расчёта */
    .natal-form-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--r-xl);padding:var(--s6);box-shadow:var(--shadow-sm)}
    .natal-prefill-note{display:flex;gap:var(--s2);align-items:flex-start;font-size:var(--text-xs);color:var(--color-text-muted);background:var(--color-surface-offset);border-radius:var(--r-md);padding:var(--s3);margin-bottom:var(--s5);line-height:1.5}
    /* ── SSOT личных данных: предупреждение, сегмент времени, запечатанная запись ── */
    .bd-lock-warn{display:flex;gap:var(--s2);align-items:flex-start;font-size:var(--text-xs);color:var(--color-text-muted);background:var(--color-surface-offset);border:1px solid var(--color-border);border-radius:var(--r-md);padding:var(--s3);margin-bottom:var(--s5);line-height:1.5}
    .bd-lock-warn-ico{flex:0 0 auto;color:var(--gold);margin-top:1px}
    /* Сегмент точность времени */
    .time-seg{display:flex;gap:var(--s1);background:var(--color-surface-offset);border:1px solid var(--color-border);border-radius:var(--r-md);padding:3px}
    .time-seg button{flex:1;padding:var(--s2) var(--s2);font:inherit;font-size:var(--text-xs);font-weight:600;color:var(--color-text-muted);background:transparent;border:0;border-radius:calc(var(--r-md) - 3px);cursor:pointer;min-height:38px;transition:background .15s,color .15s}
    .time-seg button.active{background:var(--color-surface);color:var(--color-text);box-shadow:var(--shadow-sm)}
    .time-buckets{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--s2);margin-top:var(--s3)}
    .time-bucket{display:flex;flex-direction:column;gap:2px;align-items:flex-start;padding:var(--s3);border:1px solid var(--color-border);border-radius:var(--r-md);background:var(--color-surface);color:var(--color-text);cursor:pointer;text-align:left;min-height:44px}
    .time-bucket.active{border-color:var(--gold);box-shadow:inset 0 0 0 1px var(--gold)}
    .time-bucket-name{font-size:var(--text-sm);font-weight:600}
    .time-bucket-range{font-size:var(--text-xs);color:var(--color-text-faint)}
    .time-note{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:var(--s3);line-height:1.5}
    .time-note.warn{color:var(--gold)}
    /* Запечатанная запись (данные заперты) */
    .sealed-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--r-xl);padding:var(--s5);box-shadow:var(--shadow-sm)}
    .sealed-head{display:flex;align-items:center;gap:var(--s2);font-size:var(--text-xs);font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--gold);margin-bottom:var(--s4)}
    .sealed-head svg{flex:0 0 auto}
    .sealed-row{display:flex;justify-content:space-between;gap:var(--s3);padding:var(--s3) 0;border-top:1px solid var(--color-border)}
    .sealed-row:first-of-type{border-top:0}
    .sealed-row-label{font-size:var(--text-xs);color:var(--color-text-muted);flex:0 0 auto}
    .sealed-row-val{font-size:var(--text-sm);color:var(--color-text);text-align:right;font-weight:500}
    .sealed-support{display:flex;gap:var(--s2);align-items:flex-start;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:var(--s4);padding-top:var(--s4);border-top:1px dashed var(--color-border);line-height:1.5}
    .sealed-upgrade{margin-top:var(--s4)}
    /* Read-only поле «из профиля» в методах */
    .ssot-field{display:flex;justify-content:space-between;align-items:center;gap:var(--s3);padding:var(--s3) var(--s4);background:var(--color-surface-offset);border:1px solid var(--color-border);border-radius:var(--r-md)}
    .ssot-field-val{font-size:var(--text-sm);color:var(--color-text);font-weight:500}
    .ssot-field-tag{font-size:10px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--color-text-faint);flex:0 0 auto}
    /* Модалка-гейт «заполните данные» */
    .gate-overlay{position:fixed;inset:0;z-index:220;background:rgba(0,0,0,.55);display:flex;align-items:flex-end;justify-content:center;padding:var(--s4) var(--s4) calc(var(--s4) + var(--safe-bottom));opacity:0;pointer-events:none;transition:opacity .2s}
    .gate-overlay.show{opacity:1;pointer-events:auto}
    .gate-sheet{width:100%;max-width:440px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--r-xl);padding:var(--s6);box-shadow:var(--shadow-lg);transform:translateY(12px);transition:transform .2s}
    .gate-overlay.show .gate-sheet{transform:none}
    .gate-glyph{font-size:1.6rem;margin-bottom:var(--s3)}
    .gate-title{font-size:var(--text-lg);font-weight:600;margin-bottom:var(--s2)}
    .gate-sub{font-size:var(--text-sm);color:var(--color-text-muted);line-height:1.55;margin-bottom:var(--s5)}
    .gate-actions{display:flex;flex-direction:column;gap:var(--s2)}
    /* CTA бесплатной перегенерации после уточнения времени */
    .regen-banner{display:flex;gap:var(--s2);align-items:flex-start;font-size:var(--text-xs);color:var(--color-text);background:color-mix(in srgb, var(--gold) 12%, var(--color-surface));border:1px solid var(--gold);border-radius:var(--r-md);padding:var(--s3);margin-bottom:var(--s5);line-height:1.5}
    .regen-banner-ico{flex:0 0 auto;color:var(--gold)}
    /* Big Three - Солнце / Луна / Асцендент */
    .big3{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s3);margin-bottom:var(--s6)}
    .big3-card{position:relative;overflow:hidden;text-align:center;padding:var(--s5) var(--s3);border:1px solid var(--color-border);border-radius:var(--r-lg);background:var(--color-surface-2)}
    .big3-glyph{font-size:2rem;line-height:1;margin-bottom:var(--s2)}
    .big3-role{font-size:.62rem;letter-spacing:.08em;text-transform:uppercase;color:var(--color-text-faint)}
    .big3-sign{font-family:var(--font-display);font-style:italic;font-size:var(--text-lg);color:var(--color-primary);margin-top:2px}
    .big3-deg{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px}
    /* Колесо карты */
    .wheel-wrap{background:radial-gradient(circle at 50% 42%, var(--color-surface-2), var(--color-surface));border:1px solid var(--color-border);border-radius:var(--r-xl);padding:var(--s4) var(--s3) var(--s3);box-shadow:var(--shadow-sm);margin-bottom:var(--s5)}
    /* В астрологии колесо само по себе - законченный рисунок с собственным
       холстом: коробка вокруг него добавляла вторую рамку внутри уже обведённого
       модуля «Полные данные карты» и серую подложку под круглым диском. */
    #v-natal .wheel-wrap{background:none;border:0;border-radius:0;box-shadow:none;padding:0;margin-bottom:var(--s4)}
    .wheel-svg{display:block;width:100%;max-width:420px;height:auto;margin:0 auto;touch-action:manipulation}
    /* Форсируем текстовую (моно) презентацию астро-глифов вместо цветных эмодзи. */
    .wheel-svg text,.ptable-glyph,.big3-glyph,.point-panel-glyph,.aspect-glyph,.ptable-sign{font-variant-emoji:text}
    .wheel-el{fill:var(--color-text)}
    .wheel-planet-hit{cursor:pointer}
    .wheel-planet-bg{fill:var(--color-surface);stroke:var(--color-border);stroke-width:1}
    .wheel-planet-glyph{fill:var(--color-text);font-weight:600}
    .wheel-planet-hit.sel .wheel-planet-bg{fill:var(--color-primary-highlight);stroke:var(--color-primary);stroke-width:1.5}
    .wheel-note{text-align:center;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:var(--s2);line-height:1.5}
    /* Панель выбранной точки */
    .point-panel{min-height:2.4em;margin-top:var(--s3);padding:var(--s3) var(--s4);border-radius:var(--r-md);background:var(--color-surface-offset);font-size:var(--text-sm);display:flex;align-items:center;gap:var(--s3);opacity:0;transition:opacity .2s}
    .point-panel.visible{opacity:1}
    .point-panel-glyph{font-size:1.4rem;flex-shrink:0}
    .point-panel-name{font-weight:600}
    .point-panel-sub{color:var(--color-text-muted);font-size:var(--text-xs)}
    /* Табы разделов данных */
    .natal-tabs{display:flex;gap:var(--s1);padding:var(--s1);border:1px solid var(--color-border);border-radius:var(--r-full);background:var(--color-surface-offset);margin-bottom:var(--s5);overflow-x:auto}
    .natal-tab{flex:1 0 auto;white-space:nowrap;padding:var(--s2) var(--s4);border-radius:var(--r-full);font-size:var(--text-sm);font-weight:500;color:var(--color-text-muted);background:none;transition:background .15s,color .15s}
    .natal-tab.active{background:var(--color-btn);color:#fff}
    .natal-panel{display:none}
    .natal-panel.active{display:block;animation:fadeUp .2s ease}
    /* Таблицы планет/домов/аспектов */
    /* table-layout:fixed обязателен: при авто-раскладке таблица считает ширину по
       самому длинному содержимому («Середина неба», «Северный узел») и вылезает
       за свой контейнер - в аспектах колонка орбиса уходила за край экрана.
       Доли колонок задаёт <colgroup> каждой таблицы, длинные имена переносятся.
       Шрифт здесь мельче листа: это справочная таблица, а «Середина неба» с
       глифом не влезает в треть 322-пиксельной колонки при основном кегле. */
    .ptable{width:100%;table-layout:fixed;border-collapse:collapse;font-size:var(--text-xs)}
    .ptable td,.ptable th{padding:var(--s3) 6px;border-bottom:1px solid var(--color-divider);
      text-align:left;vertical-align:middle;overflow-wrap:break-word;hyphens:none}
    /* Заголовки короткие и не переносятся. nowrap им НЕ ставим: при table-layout
       fixed нерушимое слово задаёт колонке минимум и раздувает всю таблицу за
       контейнер - именно так «ПЛАНЕТА/ЗНАК/ГРАДУС/ДОМ» растянули её до 337px. */
    .ptable th{font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.04em;
      color:var(--color-text-muted);font-weight:600}
    .ptable tr:last-child td{border-bottom:none}
    /* Точка карты: глиф висит слева колонкой, имя переносится рядом с собой -
       «MC | Середина / неба», а не «MC» одиноко на первой строке.
       min-width:0 обязателен: флекс-элемент по умолчанию не уже своего
       содержимого, и ячейка переставала сжиматься - таблица уезжала за экран. */
    .ptable-pt{display:flex;align-items:baseline;gap:5px;min-width:0}
    .ptable-pt>span:last-child{min-width:0;overflow-wrap:break-word}
    .ptable-glyph{flex:none;font-size:1.05rem;white-space:nowrap}
    /* Короткие значения - градусы, «8-й дом»: не рвём и держим у правого края,
       иначе соседние заголовки («ГРАДУС ДОМ») читаются как одна подпись. */
    .ptable-num,.ptable th.ptable-num{white-space:nowrap;text-align:right}
    .ptable-sign{color:var(--color-primary)}
    /* Ретроградность - не ошибка, а состояние: движение вспять, незавершённость.
       Это ровно роль латуни в продукте; --color-error красил её в розовый. */
    .retro{color:var(--gold);font-weight:600;font-size:.85em}
    .aspect-glyph{display:inline-grid;place-items:center;width:1.7em;height:1.7em;border-radius:var(--r-sm);font-size:1rem}
    .asp-soft{color:var(--asp-soft);background:oklch(from var(--asp-soft) l c h / .14)}
    .asp-hard{color:var(--asp-hard);background:oklch(from var(--asp-hard) l c h / .14)}
    .asp-neutral{color:var(--asp-neutral);background:oklch(from var(--asp-neutral) l c h / .14)}
    .asp-minor{color:var(--asp-minor);background:oklch(from var(--asp-minor) l c h / .12)}
    /* Распределение стихий/качеств */
    /* Распределение по стихиям и качествам - весы в голосе раздела.
       Столбцы одного цвета: смысл здесь перекос, и читается он высотой. */
    .dist-wrap{display:grid;grid-template-columns:1fr 1fr;gap:var(--s5) var(--s6);margin-bottom:var(--s6)}
    .dist-block{min-width:0}
    .dist-title{font-size:.66rem;text-transform:uppercase;letter-spacing:.14em;color:var(--color-text-muted);font-weight:600;margin-bottom:var(--s3)}
    .dist-cols{display:flex;gap:var(--s2);align-items:flex-end}
    .dist-col{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:4px}
    .dist-col-bar{display:block;width:100%;height:54px;display:flex;align-items:flex-end}
    .dist-col-bar i{display:block;width:100%;min-height:3px;border-radius:3px 3px 0 0;
      background:var(--sec-accent,var(--color-primary));transition:height .5s ease}
    .dist-col-n{font-family:var(--font-num,'Literata',Georgia,serif);font-weight:500;font-size:var(--text-sm);
      line-height:1;color:var(--sec-accent,var(--color-primary));font-variant-numeric:lining-nums}
    /* «Кардинальные» в колонке шириной 72px рвалось посреди слова: overflow-wrap
       разрешал разрыв где угодно. Переносим по правилам языка, а не по пикселям. */
    .dist-col-lbl{font-size:.56rem;line-height:1.25;color:var(--color-text-muted);text-align:center;
      letter-spacing:-.01em;overflow-wrap:normal;word-break:normal;hyphens:auto}
    .dist-note{grid-column:1/-1;margin:0;font-size:var(--text-xs);line-height:1.5;color:var(--color-text-muted)}
    .dist-note b{color:var(--color-text);font-weight:600}
    /* Секция трактовки */
    .natal-interp-focus{display:flex;flex-wrap:wrap;gap:var(--s2);margin-bottom:var(--s4)}
    .natal-section-h{font-family:var(--font-display);font-style:italic;font-size:var(--text-lg);margin:var(--s8) 0 var(--s4)}
    /* СОВМЕСТИМОСТЬ */
    .compat-hero{display:flex;flex-direction:column;align-items:center;gap:var(--s2);padding:var(--s4) 0 var(--s5)}
    .compat-gauge{position:relative;width:132px;height:132px}
    .compat-gauge svg{width:100%;height:100%;transform:rotate(-90deg)}
    .compat-gauge-num{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center}
    .compat-gauge-val{font-family:var(--font-display);font-size:2.4rem;line-height:1;color:var(--color-primary)}
    .compat-gauge-pct{font-size:var(--text-xs);color:var(--color-text-muted)}
    .compat-gauge-cap{font-size:var(--text-xs);color:var(--color-text-muted);letter-spacing:.04em;text-transform:uppercase}
    .compat-legend{display:flex;justify-content:center;gap:var(--s5);font-size:var(--text-xs);color:var(--color-text-muted);margin-top:var(--s2)}
    .compat-legend span{display:inline-flex;align-items:center;gap:6px}
    .compat-legend i{width:11px;height:11px;border-radius:50%;display:inline-block}
    /* Разбивка индекса гармонии: один бар из двух сегментов (мягкие/напряжённые). */
    .compat-balance{width:100%;max-width:280px;margin-top:var(--s2)}
    .compat-balance-bar{display:flex;height:8px;border-radius:var(--r-full);overflow:hidden;background:var(--color-surface-offset)}
    .compat-balance-bar i{display:block;height:100%}
    .compat-balance-cap{display:flex;justify-content:space-between;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:5px}
    .compat-balance-cap b{font-weight:600;color:var(--color-text)}

    /* ── Профиль связи: плотность (кольцо) + баланс (шкала с зоной равновесия) ──
       Форма следует смыслу. Плотность - количество, её честно показывать
       заливкой. Баланс - положение на спектре: заливка здесь и порождала бы
       чтение «больше = лучше», поэтому это ДОРОЖКА С МЕТКОЙ, а не индикатор
       заполнения. Цветовой рампы (красный→зелёный) нет намеренно: рампа выносит
       приговор, а идеал баланса - в середине шкалы, а не у её верхнего края. */
    .compat-prof{display:flex;flex-direction:column;align-items:center;gap:var(--s2);width:100%}
    .compat-dens-val{font-family:var(--font-display);font-size:2.4rem;line-height:1;color:var(--color-primary)}
    .compat-dens-unit{font-size:var(--text-xs);color:var(--color-text-muted);text-align:center;max-width:76px;line-height:1.2}
    .compat-prof-band{font-size:var(--text-sm);font-weight:600;color:var(--color-text)}
    .compat-prof-lbl{font-size:var(--text-xs);color:var(--color-text-muted);letter-spacing:.04em;text-transform:uppercase}

    .compat-bal{width:100%;max-width:300px;margin-top:var(--s3)}
    /* Дорожка НЕ заливается: единственный объект внутри неё - метка положения.
       Зона равновесия отмечена золотой чертой ПОД дорожкой, а не сегментом
       внутри: залитый сегмент внутри дорожки читался как частичное заполнение -
       ровно то «больше = лучше», от которого уходит вся правка. */
    .compat-bal-track{position:relative;height:10px;border-radius:var(--r-full);background:var(--color-surface-offset);border:1px solid var(--color-divider)}
    /* Метка - главный элемент блока (это и есть показание), поэтому она самая
       контрастная: игла с обводкой цветом дорожки, чтобы читаться и на золоте. */
    .compat-bal-mark{position:absolute;top:-5px;width:3px;height:18px;border-radius:2px;background:var(--color-text);box-shadow:0 0 0 2px var(--color-surface);transform:translateX(-1.5px)}
    .compat-bal-rule{position:relative;height:3px;margin-top:4px}
    .compat-bal-rule i{position:absolute;height:3px;border-radius:2px;background:var(--gold)}
    .compat-bal-ends{position:relative;display:flex;justify-content:space-between;font-size:10px;color:var(--color-text-faint);margin-top:4px;letter-spacing:.02em}
    /* Подпись зоны стоит по центру ЗОЛОТОЙ ЧЕРТЫ (позиция приходит инлайном), а
       не по центру строки: иначе подпись указывает мимо того, что подписывает. */
    .compat-bal-zone{position:absolute;top:0;font-size:10px;color:var(--gold);font-weight:600;letter-spacing:.03em;transform:translateX(-50%);white-space:nowrap;pointer-events:none}
    .compat-bal-head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s2);margin-bottom:6px}
    .compat-bal-num{font-family:var(--font-display);font-size:var(--text-lg);color:var(--color-text)}
    .compat-bal-hint{font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.35;margin-top:var(--s3);text-align:center}
    /* Сохранённые партнёры: карточки выбора «с кем сравнить». */
    .partner-picker{display:flex;flex-direction:column;gap:var(--s2);margin-bottom:var(--s4)}
    .partner-card{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s4);border-radius:var(--r-md);background:var(--color-surface-offset);border:1px solid var(--color-border);cursor:pointer;transition:border-color .15s}
    .partner-card:hover{border-color:var(--color-primary)}
    .partner-card.active{border-color:var(--color-primary);background:var(--color-primary-highlight)}
    .partner-card-info{flex:1;min-width:0}
    .partner-card-name{font-weight:600}
    .partner-card-sub{color:var(--color-text-muted);font-size:var(--text-xs);margin-top:2px}
    .partner-card-del{flex-shrink:0;padding:var(--s2) var(--s3);color:var(--color-text-faint);font-size:var(--text-sm);cursor:pointer;border-radius:var(--r-sm)}
    .partner-card-del:hover{color:var(--color-error)}
    .partner-card.confirm{border-color:var(--color-error)}
    .partner-card-confirm{display:flex;align-items:center;gap:var(--s2);flex:1;justify-content:space-between}
    .partner-add{justify-content:center;color:var(--color-primary);font-weight:600;border-style:dashed}
    .partner-dots{display:flex;gap:5px;margin-top:4px}
    .partner-dots span{font-size:12px;opacity:.22;filter:grayscale(.4)}
    .partner-dots span.on{opacity:1;filter:none}
    /* Сводка по трём типам союза на карточке человека - тот же язык, что «пульс пары». */
    .partner-scores{display:flex;gap:var(--s4);margin-top:6px}
    .partner-score{display:inline-flex;align-items:baseline;gap:4px;font-size:11px}
    .partner-score b{font-family:var(--font-display);font-size:1.05rem;font-weight:400;color:var(--color-primary)}
    .partner-score.empty{opacity:.45;filter:grayscale(.5)}
    .partner-score.empty b{color:var(--color-text-faint)}
    /* Хаб: гайд и «Все расчёты» - одна служебная строка над списком людей. */
    .compat-actions{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);margin:0 0 var(--s5)}
    .compat-inline-link{color:var(--color-text-muted);font-size:var(--text-sm);cursor:pointer;text-decoration:underline;text-underline-offset:3px;white-space:nowrap}
    /* Экран человека: карточки тем-аккордеоны. */
    .theme-card{border:1px solid var(--color-border);border-radius:var(--r-md);background:var(--color-surface-offset);margin-bottom:var(--s3);overflow:hidden}
    .theme-card-head{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);padding:var(--s3) var(--s4);cursor:pointer}
    .theme-card-title{font-weight:600}
    .theme-card-sub{color:var(--color-text-muted);font-size:var(--text-xs);margin-top:2px}
    .theme-card-pct{font-weight:700;color:var(--color-primary)}
    .theme-card-body{padding:0 var(--s3) var(--s3)}
    .compat-all-link{display:block;text-align:center;margin-top:var(--s5);color:var(--color-text-muted);font-size:var(--text-sm);cursor:pointer;text-decoration:underline;text-underline-offset:3px}
    /* Экран человека: карточка данных с раскрывающейся правкой. */
    .partner-id{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--s3)}
    .partner-id-name{font-family:var(--font-display);font-style:italic;font-size:var(--text-lg)}
    .partner-edit{margin-top:var(--s4);padding-top:var(--s4);border-top:1px solid var(--color-border)}
    .partner-edit-warn{display:flex;gap:var(--s2);font-size:var(--text-xs);color:var(--color-text-muted);margin:var(--s3) 0;line-height:1.45}
    .partner-edit-actions{display:flex;gap:var(--s2);justify-content:flex-end;margin-top:var(--s3)}
    /* Пульс пары: переключатель типов союза, он же сводка по трём осям. Числа
       набраны display-шрифтом - та же типографика, что у индекса гармонии. */
    .pair-pulse{display:flex;gap:var(--s2);margin:var(--s5) 0 var(--s4)}
    .pair-pulse-seg{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;
      padding:var(--s3) var(--s2);border:1px solid var(--color-border);border-radius:var(--r-md);
      background:var(--color-surface-offset);cursor:pointer;position:relative;
      transition:border-color .15s,background .15s}
    .pair-pulse-seg:hover{border-color:var(--sec-accent)}
    .pair-pulse-seg.active{border-color:var(--sec-accent);background:oklch(from var(--sec-accent) l c h / .12)}
    .pair-pulse-seg.active::after{content:'';position:absolute;left:26%;right:26%;bottom:-1px;height:2px;
      border-radius:var(--r-full);background:var(--sec-accent,var(--color-primary))}
    .pair-pulse-emoji{font-size:15px;line-height:1}
    .pair-pulse-val{font-family:var(--font-num,'Literata',Georgia,serif);font-weight:500;font-size:1.4rem;
      line-height:1.1;color:var(--sec-accent,var(--color-primary));font-variant-numeric:tabular-nums}
    .pair-pulse-seg.empty .pair-pulse-val{color:var(--color-text-faint)}
    .pair-pulse-label{font-size:10px;letter-spacing:.04em;text-transform:uppercase;color:var(--color-text-muted);text-align:center}
    /* Модули аналитики пары: гармония, синастрия, карта пары, погода. */
    .pair-mod{border:1px solid var(--color-border);border-radius:var(--r-md);background:var(--color-surface-offset);margin-bottom:var(--s3);overflow:hidden}
    .pair-mod-head{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);padding:var(--s3) var(--s4)}
    .pair-mod-head.tappable{cursor:pointer}
    .pair-mod-title{font-weight:600;display:flex;align-items:center;gap:var(--s2)}
    .pair-mod-sub{color:var(--color-text-muted);font-size:var(--text-xs);margin-top:2px}
    .pair-mod-side{flex-shrink:0;display:flex;align-items:center;gap:var(--s2)}
    /* «Рассчитать совместимость · 1 токен» не помещается рядом с текстом и
       уезжала за край экрана - на узком экране блок складывается в колонку. */
    /* Складываем в колонку только головы с кнопкой: у сворачиваемых модулей в
       той же позиции стоит шеврон, и он уезжал под текст. */
    @media(max-width:460px){
      #v-natal .pair-mod-head:has(.pair-mod-side .btn){flex-direction:column;align-items:stretch;gap:var(--s3)}
      #v-natal .pair-mod-head:has(.pair-mod-side .btn) .pair-mod-side{width:100%}
      #v-natal .pair-mod-side .btn{width:100%;justify-content:center}
    }
    .pair-mod-chev{width:15px;height:15px;flex:none;color:var(--color-text-faint);transition:transform .2s}
    .pair-mod.open .pair-mod-chev{transform:rotate(90deg)}
    .pair-mod-body{padding:0 var(--s3) var(--s3)}
    .pair-mod-score{font-family:var(--font-display);font-size:1.25rem;color:var(--color-primary)}
    /* Погода пары: одна генерация на текущую ISO-неделю, под текстом - дата
       открытия следующего окна (переключателя периодов больше нет). */
    .cw-next{margin-top:var(--s4);padding-top:var(--s3);border-top:1px solid var(--color-divider);
      font-size:var(--text-xs);color:var(--color-text-muted);text-align:center}
    /* Списки аспектов: остались у гороскопа (ключевые транзиты). В синастрии их
       место заняли строки .tr-row на листе пары. */
    .compat-aspects{display:flex;flex-direction:column;gap:var(--s2);margin:var(--s4) 0}
    .compat-arow{display:flex;align-items:center;gap:var(--s3);padding:var(--s3);border:1px solid var(--color-border);border-radius:var(--r-md);background:var(--color-surface-2);font-size:var(--text-sm)}
    .compat-arow .aspect-glyph{flex-shrink:0}
    .compat-arow-orb{margin-left:auto;font-size:var(--text-xs);color:var(--color-text-muted)}
    .compat-partner-badge{display:inline-flex;align-items:center;gap:6px;font-size:var(--text-xs);color:var(--color-text-muted);background:var(--color-surface-offset);padding:3px 10px;border-radius:var(--r-full)}
    .seg-scroll{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
    .seg-scroll::-webkit-scrollbar{display:none}
    .seg-scroll .seg-btn{flex:0 0 auto;white-space:nowrap}
    .horo-solar-hero{display:flex;flex-direction:column;align-items:center;gap:var(--s1);padding:var(--s5) 0}
    .horo-solar-year{font-family:var(--font-display);font-style:italic;font-size:2.6rem;line-height:1;color:var(--color-primary)}
    /* ℞-метка ретро-прохода: осталась в событиях недели и в баннере Луны */
    .tl-retro{color:var(--gold);font-weight:600}
    .moon-banner{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s4);border:1px solid var(--color-border);border-radius:var(--r-lg);background:var(--color-surface-2);margin-bottom:var(--s4)}
    .moon-banner-emoji{display:inline-flex;line-height:1;color:var(--sec-accent,var(--color-primary))}
    .moon-ph{display:block;flex:none}
    /* Строка фазы Луны при рождении - глиф и текст на одной базовой линии. */
    .natal-moonline{display:flex;align-items:center;justify-content:center;gap:8px;
      margin-bottom:var(--s6);color:var(--color-text-muted);font-size:var(--text-sm)}
    .natal-moonline .moon-ph{color:var(--sec-accent,var(--color-primary))}
    .moon-banner-txt{font-size:var(--text-sm)}
    .moon-banner-lbl{font-size:var(--text-xs);color:var(--color-text-faint);text-transform:uppercase;letter-spacing:.04em}
    .moon-banner-retro{margin-top:3px;font-size:var(--text-xs);color:var(--color-text-muted)}
    .moon-banner-retro .tl-retro{color:var(--gold);font-weight:600}
    /* Контекстное описание выбранного метода гороскопа: что делает и за какой период. */
    .horo-desc{display:flex;gap:var(--s3);align-items:flex-start;margin-top:var(--s3);padding:var(--s3) var(--s4);background:var(--color-surface-2);border:1px solid var(--color-divider);border-radius:var(--r-lg);animation:horoDescIn .18s ease}
    .horo-desc-ico{flex:none;color:var(--gold-soft);display:inline-flex}
    .horo-desc-ico svg{width:20px;height:20px;display:block}
    .horo-desc-body{display:flex;flex-direction:column;gap:2px;min-width:0}
    .horo-desc-title{font-weight:600;font-size:var(--text-sm);color:var(--color-text)}
    .horo-desc-txt{font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.5}
    @keyframes horoDescIn{from{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:none}}
    .heat-strip{display:flex;gap:3px;margin:var(--s4) 0 var(--s3);align-items:flex-end;height:56px}
    .heat-day{flex:1;border-radius:3px 3px 0 0;min-height:6px;position:relative}
    .heat-legend{display:flex;justify-content:space-between;font-size:var(--text-xs);color:var(--color-text-muted)}
    .best-chips{display:flex;flex-wrap:wrap;gap:var(--s2);margin-top:var(--s3)}
    .best-chip{font-size:var(--text-xs);padding:4px 10px;border-radius:var(--r-full);background:var(--color-surface-offset)}
    .best-chip.good{background:rgba(63,144,112,.18);color:var(--el-earth)}
    .best-chip.warn{background:rgba(208,106,166,.16);color:var(--asp-hard)}
    @media(max-width:600px){main{--main-pad-x:var(--s4);padding:var(--s5) var(--main-pad-x) calc(var(--tabbar-h) + var(--safe-bottom) + var(--s6))}.topbar{padding:calc(var(--safe-top) + var(--s3)) var(--s4) var(--s3)}.step-nav{gap:var(--s2)}.form-grid{grid-template-columns:1fr}.big3{gap:var(--s2)}.big3-card{padding:var(--s4) var(--s2)}.big3-glyph{font-size:1.6rem}}
    /* ── TAROT ─────────────────────────────────────────────── */
    .tarot-daily{margin-bottom:var(--s6);padding:var(--s4);border:1px solid var(--color-border);border-radius:var(--r-lg);background:linear-gradient(135deg,var(--color-surface-2),var(--color-surface));display:flex;gap:var(--s4);align-items:center}
    .tarot-daily-card{flex:none;width:82px;aspect-ratio:500/838;border-radius:var(--r-md);overflow:hidden;box-shadow:0 6px 18px rgba(0,0,0,.25);background:var(--color-surface-offset)}
    .tarot-daily-card img{width:100%;height:100%;object-fit:cover;display:block}
    .tarot-daily-card img.rev{transform:rotate(180deg)}
    .tarot-daily-lbl{font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-faint)}
    .tarot-daily-name{font-family:var(--font-display);font-style:italic;font-size:var(--text-lg);color:var(--color-primary);margin:2px 0}
    .tarot-daily-kw{font-size:var(--text-sm);color:var(--color-text-muted);line-height:1.4}
    .tarot-q-count{margin-top:4px;text-align:right;font-size:var(--text-xs);color:var(--color-text-muted);font-variant-numeric:tabular-nums}
    .tarot-q-count.near{color:var(--color-error)}
    .tarot-section-title{font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-faint);margin:var(--s5) 0 var(--s3)}
    .tarot-premium{display:inline-block;margin-left:var(--s2);padding:1px 8px;font-size:var(--text-xs);border-radius:var(--r-full);background:var(--color-btn);color:#fff;vertical-align:middle}
    /* В каталоге цена не кричит заливкой: тридцать четыре тиловых бейджа подряд
       спорили с акцентом раздела и делали список сплошь платным на вид. */
    .cat-rail .tarot-premium{background:none;color:var(--sec-accent,var(--color-primary));
      border:1px solid oklch(from var(--sec-accent,var(--color-primary)) l c h / .4);
      font-variant-numeric:tabular-nums}
    /* Общий бейдж «бесплатно» — один и тот же в таро и в «Альманахе чисел»:
       бесплатность это довод, и звучать он должен одинаково во всём продукте. */
    .badge-free{display:inline-block;margin-left:var(--s2);padding:1px 8px;font-size:var(--text-xs);
      border-radius:var(--r-full);background:oklch(from var(--tar-free) l c h / .16);color:var(--tar-free);
      font-weight:600;vertical-align:middle}
    /* Свой цвет вместо серого: серый давал 4.4 против нужных 4.5 и читался как
       «неактивно», хотя бесплатность — это довод, а не поражение в правах. */
    :root{--tar-free:#4A5F14}
    [data-theme="dark"]{--tar-free:#8FA84E}
    .tarot-spread-cards{display:flex;flex-wrap:wrap;gap:var(--s4);justify-content:center;margin:var(--s5) 0}
    .tarot-card{width:130px;max-width:40vw}
    .tarot-card-flip{position:relative;width:100%;aspect-ratio:500/838;perspective:1000px}
    .tarot-card-inner{position:absolute;inset:0;transform-style:preserve-3d;transition:transform .65s cubic-bezier(.2,.75,.2,1)}
    .tarot-card.revealed .tarot-card-inner{transform:rotateY(180deg)}
    /* Церемония раскрытия: «парение» рубашек в ожидании + золотая вспышка при раскрытии */
    @media (prefers-reduced-motion: no-preference){
      .tarot-card:not(.revealed) .tarot-card-flip{animation:tarotIdle 2.6s ease-in-out infinite}
      .tarot-card:not(.revealed):nth-child(2) .tarot-card-flip{animation-delay:.5s}
      .tarot-card:not(.revealed):nth-child(3) .tarot-card-flip{animation-delay:1s}
      .tarot-card:not(.revealed):nth-child(4) .tarot-card-flip{animation-delay:.3s}
      .tarot-card:not(.revealed):nth-child(5) .tarot-card-flip{animation-delay:.8s}
      @keyframes tarotIdle{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
      .tarot-card.revealed .tarot-card-flip::after{content:'';position:absolute;inset:-3px;border-radius:var(--r-md);pointer-events:none;opacity:0;
        box-shadow:0 0 0 1px oklch(from var(--gold) l c h /.5),0 0 22px oklch(from var(--gold) l c h /.4);animation:tarotLand 1s ease .5s}
      @keyframes tarotLand{0%{opacity:0}28%{opacity:1}100%{opacity:0}}
    }
    .tc-back,.tc-face{position:absolute;inset:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;border-radius:var(--r-md);overflow:hidden;box-shadow:0 6px 18px rgba(0,0,0,.28)}
    .tc-back{display:flex;align-items:center;justify-content:center;font-size:0;background:#111a2e center/cover no-repeat url("/static/img/tarot-back.webp")}
    .tc-face{transform:rotateY(180deg);background:var(--color-surface-offset)}
    .tc-face img{width:100%;height:100%;object-fit:cover;display:block}
    .tc-face img.rev{transform:rotate(180deg)}
    .tarot-pos{margin-top:var(--s2);text-align:center;max-width:130px}
    .tarot-pos-name{font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-faint)}
    .tarot-card-name{font-size:var(--text-sm);font-weight:600;color:var(--color-text);line-height:1.25}
    .tarot-card-orient{font-size:var(--text-xs);color:var(--color-text-muted)}
    .tarot-card-orient.rev{color:var(--asp-hard)}
    .tarot-q{padding:var(--s3) var(--s4);background:var(--color-surface-2);border:1px solid var(--color-divider);border-radius:var(--r-lg);font-size:var(--text-sm);color:var(--color-text-muted);margin-bottom:var(--s4)}
    .tarot-q b{color:var(--color-text);font-weight:600}
    .tarot-hist-item{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s4);border:1px solid var(--color-divider);border-radius:var(--r-lg);background:var(--color-surface);cursor:pointer;margin-bottom:var(--s3);transition:border-color .15s}
    .tarot-hist-item:hover{border-color:var(--color-primary)}
    .tarot-hist-thumb{flex:none;width:34px;aspect-ratio:500/838;border-radius:4px;overflow:hidden;background:var(--color-surface-offset)}
    .tarot-hist-thumb img{width:100%;height:100%;object-fit:cover;display:block}
    .tarot-hist-body{min-width:0;flex:1}
    .tarot-hist-name{font-size:var(--text-sm);font-weight:600;color:var(--color-text)}
    .tarot-hist-sub{font-size:var(--text-xs);color:var(--color-text-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
    @media(max-width:600px){.tarot-daily-card{width:70px}.tarot-card{width:104px}}
    /* ── TAROT STORIES ─────────────────────────────────────── */
    /* ── TAROT CAROUSEL (встроенное окно) ──────────────────── */
    @keyframes tcarIn{from{opacity:0;transform:translateX(10px)}to{opacity:1;transform:none}}
    .tcar-btn{flex:none;width:38px;height:38px;border:1px solid var(--color-border);border-radius:50%;background:var(--color-surface);color:var(--color-text);font-size:20px;line-height:1;cursor:pointer}
    .tcar-btn:disabled{opacity:.35}
    /* ── TAROT ENCYCLOPEDIA (справочник карт) ──────────────── */
    .enc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(80px,1fr));gap:var(--s3)}
    .enc-card{display:flex;flex-direction:column;gap:5px;align-items:center;padding:0;background:none;border:none;cursor:pointer}
    .enc-card img{width:100%;aspect-ratio:500/838;object-fit:cover;border-radius:7px;box-shadow:0 3px 10px rgba(0,0,0,.2);transition:transform .15s}
    .enc-card:hover img{transform:translateY(-3px)}
    .enc-name{font-size:10px;line-height:1.2;text-align:center;color:var(--color-text-muted)}
    .enc-detail{display:flex;flex-direction:column;align-items:center;gap:var(--s2);margin-bottom:var(--s4)}
    .enc-detail-kw{font-size:var(--text-xs);color:var(--color-text-faint);text-align:center}
    /* фильтры-чипы по арканам/мастям */
    /* Поиск по каталогу: та же поверхность, что у полей формы, но компактнее -
       он стоит над списком, а не внутри анкеты. */
    /* ── Баланс: остаток месяца, прайс-лист, докупка ─────────────────────── */
    .wallet-limit{margin-top:var(--s3)}
    .wallet-limit-row{display:flex;justify-content:space-between;gap:var(--s3);
      font-size:var(--text-xs);color:var(--color-text-muted);margin-bottom:6px;
      font-variant-numeric:tabular-nums}
    .wallet-bar{height:4px;border-radius:2px;background:var(--color-surface-offset);overflow:hidden}
    .wallet-bar i{display:block;height:100%;border-radius:2px;background:var(--gold-soft)}
    .bill-note{font-size:var(--text-xs);line-height:1.55;color:var(--color-text-muted);
      margin:var(--s3) 0 var(--s2)}
    .bill-note-warn{color:var(--gold-soft)}
    .bill-sec-lbl{font-size:var(--text-xs);font-weight:600;letter-spacing:.1em;
      text-transform:uppercase;color:var(--color-text-faint);margin:var(--s5) 0 var(--s2)}
    .price-tbl{width:100%;border-collapse:collapse;font-size:var(--text-xs);margin-bottom:var(--s4)}
    .price-tbl td{padding:9px 0;border-bottom:1px solid var(--color-divider);
      color:var(--color-text-muted)}
    .price-tbl td:last-child{text-align:right;color:var(--color-text);font-weight:600;
      white-space:nowrap;font-variant-numeric:tabular-nums}
    .packs{display:grid;grid-template-columns:1fr 1fr 1fr;gap:var(--s2)}
    .pack{display:flex;flex-direction:column;align-items:center;gap:2px;padding:var(--s3) var(--s2);
      border:1px solid var(--color-border);border-radius:var(--r-lg);background:var(--color-surface-2);
      cursor:pointer;transition:transform .15s,border-color .15s}
    .pack:active{transform:scale(.98);border-color:var(--gold)}
    .pack-n{font-family:var(--font-display);font-size:1.35rem;color:var(--gold-soft);
      font-variant-numeric:tabular-nums;line-height:1.1}
    .pack-u{font-size:10px;color:var(--color-text-faint)}
    .pack-p{margin-top:5px;font-size:var(--text-xs);font-weight:600;
      font-variant-numeric:tabular-nums}
    .pack-alt{font-size:10px;color:var(--color-text-faint);font-variant-numeric:tabular-nums}
    .plan-worth{font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.5;
      margin:var(--s2) 0}
    .plan-per{margin-top:var(--s2);font-size:10.5px;color:var(--color-text-faint);
      text-align:right;font-variant-numeric:tabular-nums}
    /* ═══ СНЫ — аметист ═════════════════════════════════════════════════
       Четвёртый голос раздела. До этого у снов не было объявлено ни одной
       своей переменной: дневник и сонник красились тилом навигации, то есть
       ничем, а плитки символов - шестью хардкод-хексами по категориям.

       Объявлено на ВСЕХ четырёх вьюхах раздела, а не только на книге. Дневник,
       форма и разбор - сёстры `#v-dreambook`, а не потомки (все четыре лежат
       рядом в <main>), поэтому наследовать голос они не могли и три экрана из
       четырёх оставались тиловыми. Та же ошибка уже случалась в таро - см.
       комментарий у `#v-tarot` ниже. */
    #v-list,#v-form,#v-result,#v-dreambook{
      --sec-accent:#5B4B7A;--sec-rule:#d8d3e0;
      --sec-btn:#5B4B7A;--sec-btn-hover:#4c3e67;--sec-btn-ink:#fff;
    }
    [data-theme="dark"] #v-list,[data-theme="dark"] #v-form,
    [data-theme="dark"] #v-result,[data-theme="dark"] #v-dreambook{
      --sec-accent:#A08CC0;--sec-rule:#37323f;
      --sec-btn:#A08CC0;--sec-btn-hover:#b39fd0;--sec-btn-ink:#1c1b19;
    }

    /* ═══ ТАРО — КАТАЛОГ РАСКЛАДОВ ══════════════════════════════════════
       Вино — акцент раздела (цвет мантий и драпировок колоды). Каркас общий
       с «Альманахом чисел»: линовка, счётчики глав, ритм заголовков — цельность
       держится структурой, а не общей краской.
       --sec-* объявлены на всём разделе, а не внутри .cat-rail, как было:
       общие каркасы (каталог, книга раздела) читают именно их, и без объявления
       на корне книга «О Таро» красилась тилом навигации - цветом, который в этом
       продукте не значит «таро». --tar-* оставлены алиасами: ими покрашен
       каталог раскладов и полсотни правил вокруг него. */
    #v-tarot{
      --sec-accent:#7C3A52;--sec-rule:#dcd2d5;
      --sec-btn:#7C3A52;--sec-btn-hover:#6a3146;--sec-btn-ink:#fff;
      --tar-accent:var(--sec-accent);--tar-rule:var(--sec-rule);
    }
    [data-theme="dark"] #v-tarot{
      --sec-accent:#C08AA0;--sec-rule:#3a2f33;
      /* На тёмном акцент светлый, поэтому заливка кнопки берёт тёмные чернила -
         иначе белым по розовому получается 2.6:1. */
      --sec-btn:#C08AA0;--sec-btn-hover:#cf9db1;--sec-btn-ink:#1c1b19;
    }
    /* Кнопки раздела - его голосом. Переменные --sec-btn были объявлены выше,
       но само правило отсутствовало, и заливные кнопки таро красились общим
       тилом навигации: голос раздела заканчивался на кантах и заголовках.
       То же правило есть у астрологии, чисел и снов. */
    #v-tarot .btn-primary{background:var(--sec-btn);border-color:var(--sec-btn);
      color:var(--sec-btn-ink)}
    #v-tarot .btn-primary:hover{background:var(--sec-btn-hover);border-color:var(--sec-btn-hover)}
    #v-tarot .seg-btn.active{background:var(--sec-btn);color:var(--sec-btn-ink)}

    /* ── Трактовка астрологии ────────────────────────────────────────────
       Набрана на листе раздела: карточка с рамкой и тенью стояла внутри
       плоского .natal-sheet / .astro-sheet и ломала его. Каркас общий с таро
       и снами, своё - нотация в разделе об аспектах. */
    .astro-interp{margin-top:var(--s5)}
    /* Текст трактовки отделён от аналитики (гейдж, колесо, ленты), которая
       идёт выше: между ними нужна пауза, а не рамка. */
    .astro-interp-body{margin-top:var(--s5)}
    .astro-interp .rs-head{padding-bottom:var(--s4);border-bottom:1px solid var(--sec-rule);
      margin-bottom:var(--s4)}
    #v-natal .result-md .md-h{font-family:var(--font-read);font-style:normal;
      font-weight:500;font-size:14px;color:var(--color-text)}
    /* Аспект строкой: глифы планет и знак аспекта - тем же языком, которым
       подписано колесо карты. */
    .as-lines{display:grid;gap:2px}
    .as-line{display:grid;grid-template-columns:auto 1fr;gap:var(--s3);padding:var(--s3) 0;
      border-bottom:1px solid var(--color-divider);align-items:start}
    .as-line:last-child{border-bottom:none}
    .as-glyphs{display:flex;align-items:center;gap:5px;font-size:15px;color:var(--sec-accent);
      font-family:var(--font-read);line-height:1.2;padding-top:1px;white-space:nowrap}
    /* Знак аспекта берёт цвет по роли: напряжённый - тёплый, мягкий - основной
       акцент раздела. Светофора здесь нет, различает насыщенность одного тона. */
    .as-glyphs u{text-decoration:none;font-size:12px;color:var(--color-text-faint)}
    .as-glyphs u.hard{color:var(--sec-weak,var(--color-text-faint))}
    .as-glyphs u.soft{color:var(--sec-accent)}
    .as-t{font-size:12.5px;line-height:1.58;color:var(--color-text-muted)}
    .as-t b{color:var(--color-text);font-weight:600;display:block;font-size:13px;
      margin-bottom:2px}

    /* ── Трактовка расклада ──────────────────────────────────────────────
       Набрана на листе, а не в карточке: рамка с тенью стояла внутри плоского
       листа расклада и ломала его. Каркас общий с остальными разделами
       (.rs-head / .an-sec / .an-nav), своё - разбор по позициям с картами. */
    .tar-interp{margin-top:var(--s5)}
    .tar-interp .rs-head{padding-bottom:var(--s4);border-bottom:1px solid var(--sec-rule);
      margin-bottom:var(--s4)}
    .tar-positions{display:grid;gap:2px}
    .tar-pos{display:grid;grid-template-columns:44px 1fr;gap:var(--s3);padding:var(--s3) 0;
      border-bottom:1px solid var(--color-divider)}
    .tar-pos:last-child{border-bottom:none}
    .tar-pos-card{width:44px;height:66px;border-radius:6px;overflow:hidden;padding:0;
      border:1px solid var(--sec-rule);background:var(--color-surface-2);cursor:pointer}
    .tar-pos-card img{width:100%;height:100%;object-fit:cover;display:block}
    /* Перевёрнутая карта показана перевёрнутой - как и в строках расклада. */
    .tar-pos-card img.rev{transform:rotate(180deg)}
    .tar-pos-n{font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;
      color:var(--sec-accent);font-weight:600;margin-bottom:2px}
    .tar-pos-c{font-family:var(--font-read);font-size:13px;font-weight:500;margin-bottom:4px}
    /* Перевёрнутость - латунью: то же «внимание», что у черновика и ожидания. */
    .tar-pos-c em{font-style:normal;font-size:10.5px;color:var(--gold-soft);margin-left:6px}
    .tar-pos-t{font-size:12.5px;line-height:1.58;color:var(--color-text-muted)}

    /* Общий каркас результата: кикер, имя, дата. Те же классы, что у снов. */
    .rs-head{padding-bottom:var(--s4);margin-bottom:var(--s4)}
    .rs-k{display:flex;align-items:center;gap:var(--s2);font-size:10.5px;
      letter-spacing:.1em;text-transform:uppercase;color:var(--sec-accent);font-weight:600}
    .rs-k>svg{width:15px;height:15px;flex:none}
    .rs-k i{font-style:normal;margin-left:auto;letter-spacing:0;text-transform:none;
      color:var(--color-text-faint);font-weight:400;font-size:11px;
      min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
    .rs-h{font-family:var(--font-read);font-weight:500;font-size:16px;line-height:1.35;
      margin:var(--s2) 0 0}
    .rs-sub{font-size:11.5px;color:var(--color-text-faint);margin:5px 0 0}

    /* Заголовки внутри ответа модели - гарнитурой чтения: Playfair italic давал
       здесь 19.5 px, ниже порога, на котором он читается заголовком. */
    #v-tarot .result-md .md-h{font-family:var(--font-read);font-style:normal;
      font-weight:500;font-size:14px;color:var(--color-text)}

    /* Условия раздела: сказаны один раз, а не бейджем на каждой из 34 строк */
    .tarot-terms{margin:var(--s5) 0 0;border:1px solid var(--tar-rule);border-radius:var(--r-lg);
      overflow:hidden}
    .tarot-term{display:flex;align-items:center;gap:var(--s3);padding:11px var(--s4);
      font-size:var(--text-sm);border-bottom:1px solid var(--tar-rule)}
    .tarot-term:last-child{border-bottom:0}
    .tarot-term > span:first-child{color:var(--color-text)}
    .tarot-term .badge-free,.tarot-term .tarot-premium{margin-left:auto}

    .tarot-sec-head{display:flex;align-items:baseline;gap:var(--s3);margin-top:var(--s6);
      padding-bottom:7px;border-bottom:1px solid var(--tar-rule)}
    .tarot-sec-title{font-size:.66rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;
      color:var(--color-text-muted)}
    .tarot-sec-n{margin-left:auto;font-family:'Literata',Georgia,serif;font-weight:500;font-size:1.2rem;
      line-height:1;color:var(--tar-accent);font-variant-numeric:tabular-nums}
    .tarot-sec-lead{margin:var(--s3) 0 0;font-size:var(--text-xs);line-height:1.5;color:var(--color-text-muted)}

    /* Строка расклада: число карт слева, метки справа */
    .tarot-row{display:flex;align-items:center;gap:var(--s3);width:100%;padding:var(--s3) var(--s2);
      background:none;border:0;border-bottom:1px solid var(--tar-rule);text-align:left;color:inherit;
      font:inherit;cursor:pointer;min-height:44px;-webkit-tap-highlight-color:transparent;
      transition:background .15s}
    .tarot-row:active{background:oklch(from var(--tar-accent) l c h / .08)}
    .tarot-row:focus-visible{outline:2px solid var(--tar-accent);outline-offset:-2px}
    .tarot-row-n{font-family:'Literata',Georgia,serif;font-weight:500;font-size:1.2rem;
      color:var(--tar-accent);width:26px;flex:none;text-align:center;font-variant-numeric:lining-nums}
    .tarot-row-txt{display:flex;flex-direction:column;min-width:0;gap:2px}
    .tarot-row-name{font-size:var(--text-base);color:var(--color-text)}
    .tarot-row-desc{font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.4}
    .tarot-row-meta{margin-left:auto;display:flex;align-items:center;gap:6px;flex:none}
    .tarot-need-q{padding:2px 8px;border-radius:var(--r-full);font-size:.64rem;font-weight:600;
      background:oklch(from var(--tar-accent) l c h / .15);color:var(--tar-accent);flex:none}
    /* Бесплатное названо бесплатным: класс был описан и нигде не использовался */
    .tarot-start{margin-top:var(--s3);border-left:2px solid oklch(from var(--tar-accent) l c h / .4)}
    .tarot-start .tarot-row{padding-left:var(--s3)}

    /* Главы каталога */
    .tarot-cat{border-bottom:1px solid var(--tar-rule)}
    .tarot-cat-row{display:flex;align-items:center;gap:var(--s3);width:100%;padding:var(--s3) 2px;
      background:none;border:0;color:inherit;text-align:left;font:inherit;cursor:pointer;min-height:44px;
      -webkit-tap-highlight-color:transparent}
    .tarot-cat-row:focus-visible{outline:2px solid var(--tar-accent);outline-offset:-2px}
    .tarot-cat-idx{font-family:'Literata',Georgia,serif;font-weight:500;font-size:var(--text-base);
      color:var(--tar-accent);width:24px;flex:none}
    .tarot-cat-txt{display:flex;flex-direction:column;min-width:0}
    .tarot-cat-name{font-size:var(--text-base);color:var(--color-text)}
    .tarot-cat-n{margin-left:auto;font-size:var(--text-xs);color:var(--color-text-muted);flex:none}
    .tarot-cat-chev{width:15px;height:15px;color:var(--color-text-faint);flex:none;margin-left:var(--s2);
      transition:transform .2s}
    .tarot-cat.is-open .tarot-cat-chev{transform:rotate(90deg)}
    .tarot-cat-items{display:none;padding-left:var(--s6)}
    .tarot-cat.is-open .tarot-cat-items{display:block}
    .tarot-list{margin-top:var(--s4)}

    /* Позиции расклада — обещание до вытягивания */
    .tarot-pos-list{margin-top:var(--s5)}
    .tarot-pos-lbl{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted);margin-bottom:var(--s2)}
    .tarot-pos-row{display:flex;gap:var(--s3);padding:10px 0;border-bottom:1px solid var(--tar-rule)}
    .tarot-pos-row:first-of-type{border-top:1px solid var(--tar-rule)}
    .tarot-pos-i{width:20px;flex:none;font-family:'Literata',Georgia,serif;font-weight:500;
      font-size:var(--text-sm);color:var(--tar-accent);text-align:center;font-variant-numeric:tabular-nums}
    .tarot-pos-t{display:flex;flex-direction:column;gap:2px;min-width:0}
    .tarot-pos-n{font-size:var(--text-sm);color:var(--color-text)}
    .tarot-pos-m{font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.45}
    .tarot-sheet-meta{display:flex;gap:6px;margin:var(--s3) 0 0;flex-wrap:wrap}
    /* Цена — в голосе раздела: контурный винный бейдж, а не тиловая заливка
       (тил в таро принадлежит навигации и кнопкам действия). */
    #v-tarot .tarot-premium{display:inline-flex;align-items:center;gap:3px;
      background:none;color:var(--tar-accent);
      border:1px solid oklch(from var(--tar-accent) l c h / .42);
      font-variant-numeric:tabular-nums;margin-left:0}
    .tok-ico{width:11px;height:11px;flex:none}
    .tarot-btn-free{font-weight:400;opacity:.75}

    /* Лист расклада — плоский, с винной линовкой сверху (как лист альманаха) */
    .tarot-sheet{padding-top:var(--s4);border-top:2px solid var(--tar-accent);margin-top:var(--s4)}
    /* Тот же лист в роли шапки хаба, что открывает астрологию. Там над листом
       стоит контекстная шапка раздела, которой в таро нет, - её воздух (24px до
       полоски) добираем отступом, иначе хабы начинаются на разной высоте. */
    .tarot-hub-sheet{margin-top:var(--s6);margin-bottom:var(--s4)}
    /* Титул хаба набран как титул хаба астрологии - светлый курсив Playfair.
       Прямое начертание .tarot-sheet-title остаётся листам раскладов: там это
       название расклада, а не имя раздела. */
    .tarot-hub-sheet .tarot-sheet-title{font-style:italic;font-weight:400;
      font-size:var(--text-xl);line-height:1.05;margin:6px 0 0}
    .tarot-sheet-kicker{font-size:.66rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;
      color:var(--color-text-muted)}
    .tarot-sheet-title{font-family:var(--font-display);font-size:1.62rem;line-height:1.1;margin-top:6px;
      color:var(--color-text)}
    .tarot-sheet-desc{margin-top:9px;font-size:var(--text-sm);line-height:1.55;color:var(--color-text-muted);
      max-width:44ch}
    /* Вопрос — подчёркивание, а не коробка: коробка обещала форму, здесь читают */
    .tarot-ask{margin-top:var(--s5)}
    .tarot-ask-lbl{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--tar-accent);margin-bottom:var(--s2)}
    #v-tarot .tarot-ask-box{width:100%;border:0;border-bottom:1px solid var(--tar-rule);border-radius:0;
      background:none;padding:9px 2px;font-family:var(--font-num,'Literata',Georgia,serif);
      font-size:var(--text-base);color:var(--color-text);resize:vertical;min-height:44px}
    #v-tarot .tarot-ask-box:focus{outline:none;border-bottom-color:var(--tar-accent);
      box-shadow:0 1px 0 0 var(--tar-accent)}
    #v-tarot .tarot-ask-box:focus-visible{outline:2px solid var(--tar-accent);outline-offset:2px}
    .tarot-ask-hint{margin-top:6px;font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.45}
    .tarot-draw{margin-top:var(--s6)}
    .tarot-after{margin-top:var(--s3);font-size:var(--text-xs);color:var(--color-text-muted);text-align:center}
    /* Карта в раскладе: снимок, позиция и её смысл, имя, ключевые слова.
       До этого в раскладах ≤3 карт значения не показывались нигде. */
    .tarot-spread-cards{display:flex;flex-direction:column;gap:var(--s3);margin-top:var(--s5)}
    .trow{display:flex;gap:var(--s3);padding:var(--s3);width:100%;text-align:left;font:inherit;color:inherit;
      border:1px solid var(--tar-rule);border-radius:var(--r-lg);background:var(--color-surface);
      cursor:pointer;-webkit-tap-highlight-color:transparent;transition:border-color .15s,background .15s}
    .trow:active{background:oklch(from var(--tar-accent) l c h / .06);border-color:var(--tar-accent)}
    .trow:focus-visible{outline:2px solid var(--tar-accent);outline-offset:2px}
    .trow-img{width:72px;flex:none;aspect-ratio:500/838;border-radius:var(--r-md);overflow:hidden;
      background:var(--color-surface-offset);box-shadow:0 5px 14px rgba(0,0,0,.28)}
    .trow-img img{width:100%;height:100%;object-fit:cover;display:block}
    .trow-img img.rev{transform:rotate(180deg)}
    .trow-txt{display:flex;flex-direction:column;gap:4px;min-width:0}
    .trow-pos{font-size:.64rem;font-weight:600;letter-spacing:.13em;text-transform:uppercase;
      color:var(--tar-accent)}
    .trow-pos-m{font-size:var(--text-xs);color:var(--color-text-muted);line-height:1.4}
    .trow-name{font-family:'Literata',Georgia,serif;font-weight:500;font-size:var(--text-lg);line-height:1.2;
      color:var(--color-text)}
    .trow-rev{font-size:.66rem;color:var(--color-text-muted)}
    .trow-mean{font-size:var(--text-xs);line-height:1.5;color:var(--color-text);margin-top:2px}
    .trow-keys{display:flex;gap:5px;flex-wrap:wrap;margin-top:var(--s2)}
    .trow-key{padding:2px 8px;border-radius:var(--r-full);border:1px solid var(--tar-rule);
      font-size:.66rem;color:var(--color-text-muted)}
    .trow-chev{margin-left:auto;align-self:flex-start;width:16px;height:16px;color:var(--color-text-faint);
      flex:none}
    /* Раскладывание по одной — то же появление, что было у сетки карт */
    .trow--hidden{opacity:0}
    @media (prefers-reduced-motion: no-preference){
      .trow--in{animation:cardIn .42s cubic-bezier(.22,.61,.36,1) both}
    }
    @media (prefers-reduced-motion: reduce){ .trow--hidden{opacity:1} }
    .tarot-other{margin-top:var(--s5)}
    /* Глифы мастей вместо эмодзи: размер и цвет — как у остальных иконок */
    .suit-ico{display:inline-grid;place-items:center;width:15px;height:15px;vertical-align:-2px;
      margin-right:5px;font-style:normal}
    .suit-ico svg{width:100%;height:100%}
    .enc-chip-txt{display:inline-flex;align-items:center}

    /* ── РИТУАЛ РАСКРЫТИЯ КАРТ ─────────────────────────────────────────
       Карта выносится рубашкой вверх, вторым нажатием переворачивается.
       Пауза между этими шагами и есть ритуал: карта уже твоя, но ещё не
       известна. Слить их в одно движение проще — пропадёт ожидание. */
    /* Занимает экран целиком, но НИЖЕ шапки: она остаётся видимой и рабочей —
       из ритуала должен быть выход «‹ Расклады». Раньше лист шёл от самого верха
       (inset:0) и уезжал под системную панель Telegram, наползая на шапку.
       --topbar-h выставляет JS: высота шапки зависит от выреза устройства. */
    .rit-sheet{position:fixed;left:0;right:0;top:var(--topbar-h,56px);
      bottom:calc(var(--tabbar-h) + var(--safe-bottom));
      z-index:40;display:flex;flex-direction:column;
      padding:var(--s4) var(--s5) var(--s3);
      background:var(--color-bg);border:0;margin:0}
    /* Компактная строка вместо крупного титула: название расклада человек видел
       на предыдущем экране, а высоту здесь занимает карта. */
    .rit-head{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted);text-align:center;flex:none}
    .rit-tap{position:absolute;inset:0;z-index:2;background:none;border:0;cursor:pointer;
      -webkit-tap-highlight-color:transparent}
    /* Прокручиваемый ряд: у «Года вперёд» тринадцать карт, они не помещаются в
   ширину и активная уезжала за край. Центрируем, пока влезает; дальше — лента.
   ВАЖНО про отступы: overflow-x:auto заставляет браузер обрезать и по вертикали
   (спека: одна ось скрыта → вторая перестаёт быть visible). Без них приподнятая
   активная карта срезалась сверху, а её номер — снизу. */
.rit-deck{display:flex;gap:8px;justify-content:flex-start;margin-top:var(--s4);flex:none;
  overflow-x:auto;scrollbar-width:none;padding:16px var(--s2) 20px;
  -webkit-overflow-scrolling:touch}
.rit-deck::-webkit-scrollbar{display:none}
.rit-deck.is-short{justify-content:center}

    .rit-slot{width:56px;aspect-ratio:500/838;border-radius:7px;position:relative;flex:none;
      transition:transform .35s cubic-bezier(.2,.7,.2,1)}
    .rit-slot-back{position:absolute;inset:0;border-radius:7px;display:grid;place-items:center;
      border:1px solid oklch(from var(--gold) l c h / .4);transition:opacity .3s;
      background:radial-gradient(circle at 50% 40%,oklch(from var(--gold) l c h / .2),transparent 62%),
        linear-gradient(160deg,#22201c,#161513)}
    .rit-slot-back svg{width:20px;height:20px;color:var(--gold);opacity:.85}
    .rit-slot-face{position:absolute;inset:0;border-radius:7px;overflow:hidden;opacity:0;transition:opacity .3s}
    .rit-slot-face img{width:100%;height:100%;object-fit:cover;display:block}
    .rit-slot-face img.rev{transform:rotate(180deg)}
    .rit-slot.is-open .rit-slot-face{opacity:1}
    .rit-slot.is-open .rit-slot-back{opacity:0}
    .rit-slot.is-active{transform:translateY(-5px) scale(1.05)}
    .rit-slot.is-active::after{content:'';position:absolute;inset:-4px;border-radius:10px;
      border:1px solid var(--tar-accent)}
    .rit-slot-n{position:absolute;bottom:-16px;left:0;right:0;text-align:center;font-size:9.5px;
      color:var(--color-text-faint)}

    /* Прижимаем к верху: центрирование режет содержимое с обоих концов,
       когда значение карты не помещается целиком. */
    .rit-stage{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;
      padding:var(--s3) 0 var(--s2);min-height:0;text-align:center;overflow-y:auto;
      -webkit-overflow-scrolling:touch}
    .rit-stage.is-waiting{justify-content:flex-start;padding-top:var(--s7)}
    .rit-pos{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--tar-accent)}
    .rit-pos-m{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:5px;max-width:30ch;
      line-height:1.45}
    /* Пока карта закрыта — крупная: читать всё равно нечего, кроме неё.
       Перевернулась — ужимается и уступает место значению. */
    .rit-flip{height:min(200px,26vh);width:auto;aspect-ratio:500/838;perspective:1100px;
      margin-top:var(--s4);flex:0 1 auto;min-height:76px;
      transition:height .45s cubic-bezier(.2,.7,.2,1)}
    .rit-flip.is-flipped{height:min(116px,16vh)}
    .rit-flip-in{position:relative;width:100%;height:100%;transform-style:preserve-3d;
      transition:transform .72s cubic-bezier(.3,.7,.25,1)}
    .rit-flip.is-flipped .rit-flip-in{transform:rotateY(180deg)}
    .rit-face,.rit-back{position:absolute;inset:0;border-radius:12px;backface-visibility:hidden;
      overflow:hidden;box-shadow:0 14px 34px rgba(0,0,0,.45)}
    .rit-back{display:grid;place-items:center;border:1px solid oklch(from var(--gold) l c h / .42);
      background:radial-gradient(circle at 50% 40%,oklch(from var(--gold) l c h / .22),transparent 62%),
        linear-gradient(160deg,#22201c,#161513)}
    .rit-back svg{width:40px;height:40px;color:var(--gold);opacity:.9}
    .rit-face{transform:rotateY(180deg)}
    .rit-face img{width:100%;height:100%;object-fit:cover;display:block}
    .rit-face img.rev{transform:rotate(180deg)}
    /* Переворот — тоже движение: при уменьшении движения карта просто оказывается
       открытой, без вращения. Механика ритуала при этом сохраняется. */
    @media (prefers-reduced-motion: reduce){
      .rit-flip-in{transition:none}
      .rit-flip{transition:none}
      .rit-slot{transition:none}
      .rit-slot-back,.rit-slot-face{transition:none}
    }
    @media (prefers-reduced-motion: no-preference){
      .rit-in{animation:ritFly .5s cubic-bezier(.2,.75,.25,1) both}
      @keyframes ritFly{from{opacity:0;transform:translateY(34px) scale(.66)}to{opacity:1;transform:none}}
      .rit-reveal.on{animation:ritUp .42s ease .1s both}
      @keyframes ritUp{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
      .rit-dot{animation:ritPulse 1.7s ease-in-out infinite}
      @keyframes ritPulse{0%,100%{opacity:.35}50%{opacity:1}}
    }
    .rit-reveal{margin-top:var(--s2);max-width:32ch;opacity:0;flex:none}
    .rit-reveal.on{opacity:1}
    .rit-name{font-family:'Literata',Georgia,serif;font-weight:500;font-size:var(--text-lg);line-height:1.2}
    .rit-rev{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:3px}
    .rit-keys{display:flex;gap:5px;flex-wrap:wrap;justify-content:center;margin-top:var(--s2)}
    .rit-mean{font-size:var(--text-sm);line-height:1.5;margin-top:var(--s2)}
    .rit-foot{flex:none;padding:var(--s3) 0 var(--s2);text-align:center;position:relative;z-index:3}
    .rit-hint{font-size:var(--text-xs);color:var(--color-text-muted)}
    .rit-dot{display:inline-block;width:6px;height:6px;border-radius:var(--r-full);
      background:var(--tar-accent);margin-right:7px;vertical-align:1px}
    /* Низкий экран (Telegram отдаёт меньше, чем весь телефон): карта ужимается,
       чтобы значение помещалось целиком, а не обрывалось посреди строки. */
    /* Низкий экран: место отдаём карте и её значению — лента и подводка ужимаются. */
    @media (max-height:720px){
      .rit-slot{width:46px}
      .rit-head{display:none}
      .rit-stage{padding-top:var(--s3)}
      .rit-mean{font-size:var(--text-xs)}
      /* Смысл позиции — подводка, а не разбор: мельче кегль вместо обрезки строк */
      .rit-pos-m{font-size:.72rem;line-height:1.4;margin-top:3px}
    }
    /* Выход виден на каждом шаге, а не спрятан: расклад на 13 карт — 26 нажатий */
    .rit-skip{margin-top:var(--s2);min-height:44px;padding:0 var(--s4);font-size:var(--text-xs);
      color:var(--color-text-muted);text-decoration:underline;text-underline-offset:3px;
      background:none;border:0;font-family:inherit;cursor:pointer}

    /* Строка-ссылка на лонгрид — в языке пустого дневника, но вином */
    #v-tarot .tarot-guide-link{margin:var(--s4) 0 var(--s5);min-height:44px;border-color:var(--tar-rule)}
    #v-tarot .tarot-guide-link svg,#v-tarot .tarot-guide-link em{color:var(--tar-accent)}
    #v-tarot .tarot-guide-link:active{background:oklch(from var(--tar-accent) l c h / .08)}
    /* Свои расклады: та же строка-ссылка, но со счётчиком вместо стрелки.
       Отступ обычный: подтянутая вверх, она вплотную прилегала к рамке блока
       условий и читалась как его третья строка. */
    #v-tarot .tarot-hist-link{margin-top:var(--s4)}
    .tarot-hist-n{margin-left:auto;font-style:normal;font-family:'Literata',Georgia,serif;font-weight:500;
      font-size:var(--text-base);color:var(--tar-accent);font-variant-numeric:tabular-nums}

    /* Рубашка карты дня — тот же ритуал, что на главной */
    .tarot-daily-back{display:grid;place-items:center;
      background:radial-gradient(circle at 50% 42%,oklch(from var(--gold) l c h / .22),transparent 62%),
        linear-gradient(160deg,var(--color-surface-offset),var(--color-surface));
      border:1px solid oklch(from var(--gold) l c h / .42)}
    .tarot-daily-back svg{width:34px;height:34px;color:var(--gold);opacity:.9}
    .tarot-daily-back img{display:none}
    @media (prefers-reduced-motion: no-preference){
      .tarot-daily--flip{animation:dailyFlip .62s cubic-bezier(.2,.7,.2,1) both}
    }
    .cat-search{display:flex;align-items:center;gap:var(--s2);margin-bottom:var(--s3);
      padding:0 var(--s3);border:1px solid var(--color-field-border);border-radius:var(--r-lg);
      background:var(--color-surface-2)}
    .cat-search svg{width:16px;height:16px;flex:none;color:var(--color-text-faint)}
    .cat-search input{flex:1;min-width:0;padding:var(--s3) 0;background:none;
      font-size:var(--text-sm);color:var(--color-text)}
    .cat-search input::placeholder{color:var(--color-text-faint)}
    .cat-search input:focus{outline:none}
    .cat-search:focus-within{border-color:var(--color-primary)}
    .cat-empty{padding:var(--s6) var(--s4);text-align:center;font-size:var(--text-sm);
      color:var(--color-text-muted);line-height:1.6}
    .enc-filters{display:flex;gap:12px;overflow-x:auto;padding-bottom:var(--s2);margin-bottom:var(--s4);scrollbar-width:none;-webkit-overflow-scrolling:touch}
    .enc-filters::-webkit-scrollbar{display:none}
    .enc-chip{flex:none;display:inline-flex;align-items:center;gap:7px;padding:10px 13px;position:relative;border-radius:var(--r-full);border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text-muted);font-size:var(--text-sm);cursor:pointer;white-space:nowrap;transition:all .15s}
    .enc-chip .enc-chip-n{font-size:11px;opacity:.75;font-variant-numeric:tabular-nums}
    /* Фон обязателен: белый текст без него ложился на светлую поверхность
       (контраст 1.0) — выбранная категория пропадала в светлой теме. Там, где
       чип получает свой цвет инлайном (энциклопедия карт), тот перекроет этот. */
    .enc-chip.active{color:#fff;font-weight:600;
      background:var(--sec-accent,var(--color-primary));border-color:var(--sec-accent,var(--color-primary))}
    .enc-chip.active .enc-chip-n{opacity:.85}
    /* контекст-строка выбранной группы */
    .enc-context{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s4);border:1px solid var(--color-divider);border-radius:var(--r-lg);background:var(--color-surface-2);margin-bottom:var(--s4)}
    .enc-context-bar{width:4px;align-self:stretch;min-height:32px;border-radius:2px;flex:none}
    .enc-context-el{color:var(--color-text);font-size:var(--text-sm)}
    .enc-context-desc{color:var(--color-text-muted);font-size:var(--text-sm)}
    /* заголовки групп в виде «Все» */
    .enc-group-head{display:flex;align-items:center;gap:8px;margin:var(--s5) 0 var(--s3);font-size:var(--text-sm);font-weight:600;color:var(--color-text)}
    .enc-group-dot{width:10px;height:10px;border-radius:50%;flex:none}
    .enc-group-count{margin-left:auto;font-size:var(--text-xs);font-weight:400;color:var(--color-text-faint);font-variant-numeric:tabular-nums}
    /* деталь карты */
    .enc-badges{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin-top:var(--s2)}
    .enc-badge{font-size:11px;padding:3px 11px;border-radius:var(--r-full);background:var(--color-surface-offset);color:var(--color-text-muted)}
    .enc-badge.accent{color:#fff;font-weight:600}
    .enc-kw-chips{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin-top:var(--s2)}
    .enc-kw-chip{font-size:11px;padding:3px 11px;border-radius:var(--r-full);border:1px solid var(--color-divider);color:var(--color-text-muted)}
    .enc-nav{display:flex;align-items:center;justify-content:center;gap:var(--s5);margin-top:var(--s4)}
    .enc-nav-count{font-size:var(--text-sm);color:var(--color-text-muted);min-width:64px;text-align:center;font-variant-numeric:tabular-nums}
    /* ═══ КНИГА РАЗДЕЛА — информационные блоки («О Таро», «О снах», …) ═══════
       Три экрана на книгу: обложка с оглавлением, лист главы, словарь. Каркас
       один на все шесть книг; различает их голос раздела (--sec-accent) и мост
       к продукту в конце. Префикс guide-, а не tl-: последний занят дважды -
       старым лонгридом и таймлайном гороскопа, который живёт в #v-natal, там же,
       где астрологическая книга. */
    .guide{max-width:660px;margin:0 auto;
      --g-accent:var(--sec-accent,var(--color-primary));
      --g-rule:var(--sec-rule,var(--color-divider));
      --g-ink:var(--sec-btn-ink,#fff)}

    /* Полоса прочитанного под шапкой: сколько книги позади. Выходит на всю
       ширину экрана, вычитая боковой отступ main (--main-pad-x). */
    .guide-bar{position:sticky;top:var(--topbar-h,calc(var(--safe-top) + 69px));z-index:40;
      height:2px;background:var(--g-rule);margin:0 calc(-1 * var(--main-pad-x)) var(--s6)}
    .guide-bar i{display:block;height:100%;background:var(--g-accent);transition:width .3s}

    /* ── ОБЛОЖКА ──────────────────────────────────────────────────────── */
    .guide-glyph{display:flex;justify-content:center;margin:var(--s2) 0 var(--s5);color:var(--g-accent)}
    .guide-glyph svg{width:62px;height:62px;stroke-width:1.2}
    /* «Числа» вместо глифа ставят сигнатуру раздела - спектр корневых чисел. */
    .guide-glyph-num{font-family:var(--font-read);font-weight:500;font-size:2.4rem;line-height:1;
      letter-spacing:.12em;font-variant-numeric:tabular-nums lining-nums}
    .guide-kick{text-align:center;font-size:.69rem;letter-spacing:.18em;text-transform:uppercase;
      color:var(--color-text-muted);margin-bottom:var(--s2)}
    .guide-h{font-family:var(--font-display);font-style:italic;font-weight:400;text-align:center;
      font-size:clamp(2rem,1.6rem + 1.8vw,2.6rem);line-height:1.08;color:var(--g-accent);text-wrap:balance;margin:0}
    /* «Числа» печатают заголовки Literata: Playfair в разделе не используется. */
    .guide.serif .guide-h,.guide.serif .guide-sheet-h{font-family:var(--font-read);font-style:normal;font-weight:500;letter-spacing:.01em}
    .guide-sub{font-family:var(--font-read);font-size:var(--text-sm);line-height:1.6;text-align:center;
      color:var(--color-text-muted);margin:var(--s2) auto 0;max-width:30ch}
    .guide-meta{display:flex;justify-content:center;flex-wrap:wrap;gap:var(--s2) var(--s5);margin-top:var(--s4);
      font-size:var(--text-xs);color:var(--color-text-muted);font-variant-numeric:tabular-nums}
    .guide-meta i{font-style:normal;color:var(--color-text)}

    /* «Продолжить» - только если книгу начинали */
    .guide-resume{display:flex;align-items:center;gap:var(--s3);width:100%;text-align:left;
      margin-top:var(--s6);padding:13px 14px;border:1px solid var(--g-accent);border-radius:var(--r-lg);
      background:none;color:var(--color-text);cursor:pointer}
    .guide-resume:active{background:oklch(from var(--g-accent) l c h / .08)}
    .guide-resume-num{font-family:var(--font-read);font-weight:500;font-size:1.2rem;line-height:1;
      color:var(--g-accent);font-variant-numeric:tabular-nums;flex:none}
    .guide-resume-txt{min-width:0}
    .guide-resume-txt b{display:block;font-size:var(--text-sm);font-weight:600}
    .guide-resume-txt span{display:block;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px}
    .guide-resume svg{width:18px;height:18px;margin-left:auto;flex:none;color:var(--g-accent)}

    /* Оглавление: номер, заголовок, summary - те самые поля, что уже лежат
       в guide.json и до сих пор не выводились нигде. */
    .guide-toc{margin-top:var(--s6);border-top:2px solid var(--g-accent)}
    .guide-toc-kick{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s3);
      padding:var(--s3) 0 10px;font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;color:var(--color-text-muted)}
    .guide-toc-kick i{font-style:normal;font-variant-numeric:tabular-nums}
    .guide-ch{display:flex;align-items:flex-start;gap:var(--s4);width:100%;text-align:left;
      padding:var(--s3) 2px;border:0;border-top:1px solid var(--g-rule);background:none;color:var(--color-text);cursor:pointer}
    .guide-ch:active{background:oklch(from var(--g-accent) l c h / .07)}
    .guide-ch:focus-visible{outline:2px solid var(--g-accent);outline-offset:-2px}
    .guide-ch-num{flex:0 0 22px;padding-top:1px;font-family:var(--font-read);font-weight:500;font-size:var(--text-sm);
      line-height:1.5;color:var(--g-accent);font-variant-numeric:tabular-nums lining-nums}
    .guide-ch-txt{flex:1;min-width:0}
    .guide-ch-t{display:block;font-family:var(--font-read);font-weight:500;font-size:var(--text-sm);line-height:1.35;color:var(--color-text)}
    .guide-ch-s{display:block;font-size:var(--text-xs);line-height:1.5;color:var(--color-text-muted);margin-top:3px}
    .guide-ch-read{flex:none;padding-top:4px;font-size:.72rem;color:var(--color-text-muted);font-variant-numeric:tabular-nums}
    .guide-ch-read svg{width:14px;height:14px;display:block}
    .guide-ch.done .guide-ch-num{color:var(--color-text-faint)}
    .guide-ch.done .guide-ch-read{color:var(--g-accent)}

    /* Вход в словарь - с обложки, а не из середины ленты */
    .guide-dict-in{display:flex;align-items:center;gap:13px;width:100%;text-align:left;margin-top:var(--s6);
      padding:15px 14px;border:1px solid var(--g-rule);border-radius:var(--r-lg);
      background:var(--color-surface);color:var(--color-text);cursor:pointer}
    .guide-dict-in:active{background:var(--color-surface-offset)}
    .guide-dict-in .lead{width:22px;height:22px;flex:none;color:var(--g-accent)}
    .guide-dict-in-txt{min-width:0}
    .guide-dict-in-txt b{display:block;font-size:var(--text-sm);font-weight:600}
    .guide-dict-in-txt span{display:block;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px}
    .guide-dict-in .arr{width:17px;height:17px;margin-left:auto;flex:none;color:var(--color-text-faint)}

    /* Мост к продукту: чем книга кончается на деле */
    .guide-bridge{margin-top:var(--s6);padding-top:var(--s5);border-top:1px solid var(--g-rule)}
    .guide-bridge-kick{font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted);margin-bottom:var(--s2)}
    .guide-bridge-h{font-family:var(--font-read);font-weight:500;font-size:var(--text-sm);color:var(--color-text);margin-bottom:var(--s3)}
    .guide-act{display:flex;align-items:center;justify-content:center;gap:var(--s2);width:100%;min-height:46px;
      padding:13px 15px;border:0;border-radius:var(--r-md);background:var(--sec-btn,var(--color-btn));
      color:var(--g-ink);font-size:var(--text-sm);font-weight:600;cursor:pointer}
    .guide-act:hover{background:var(--sec-btn-hover,var(--color-btn-hover))}
    .guide-act svg{width:16px;height:16px;flex:none}
    .guide-act-price{display:inline-flex;align-items:center;gap:4px;margin-left:var(--s1);opacity:.85;
      font-weight:500;font-size:var(--text-xs);font-variant-numeric:tabular-nums}
    .guide-act-ghost{display:block;width:100%;min-height:44px;margin-top:10px;padding:12px;
      border:1px solid var(--g-rule);border-radius:var(--r-md);background:none;
      color:var(--color-text);font-size:var(--text-sm);cursor:pointer}
    .guide-act-ghost:hover{background:var(--color-surface-offset)}

    /* ── ЛИСТ ГЛАВЫ ───────────────────────────────────────────────────── */
    .guide-sheet{padding-top:var(--s4);border-top:2px solid var(--g-accent)}
    .guide-sheet-kick{display:flex;align-items:baseline;gap:var(--s2);margin-bottom:10px;
      font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;color:var(--color-text-muted)}
    .guide-sheet-kick i{font-style:normal;color:var(--g-accent);font-variant-numeric:tabular-nums}
    .guide-sheet-h{font-family:var(--font-display);font-style:italic;font-weight:400;
      font-size:clamp(1.65rem,1.4rem + 1.2vw,2.15rem);line-height:1.12;color:var(--color-text);text-wrap:balance;margin:0 0 4px}
    .guide-sheet-sum{font-size:var(--text-xs);line-height:1.55;color:var(--color-text-muted);margin-bottom:var(--s5)}
    /* Лист словаря: шапка по центру, потому что под ней симметричная карта.
       Центрируется только шапка - значения ниже читают строками. */
    .guide-sheet.center>.guide-sheet-kick{justify-content:center}
    .guide-sheet.center>.guide-sheet-h,
    .guide-sheet.center>.guide-sheet-sum{text-align:center}

    /* Тело главы. Literata 1.72 вместо Inter: главу читают подряд, а не сканируют. */
    .guide-prose{font-family:var(--font-read);font-size:var(--text-base);line-height:1.72;color:var(--color-text)}
    .guide-prose p{margin:0 0 var(--s4)}
    .guide-prose>:last-child{margin-bottom:0}
    .guide-prose b,.guide-prose strong{font-weight:600}
    /* Подзаголовок внутри главы - Literata 500 с линовкой акцентом. Playfair
       курсивом на этом кегле читается хуже прямого шрифта той же гарнитуры. */
    .guide-prose .md-h{font-family:var(--font-read);font-style:normal;font-weight:500;
      font-size:1.06em;line-height:1.3;color:var(--color-text);margin:var(--s6) 0 10px;
      padding-left:12px;border-left:2px solid var(--g-accent)}
    .guide-prose .md-ul{margin:0 0 var(--s4);padding:0;list-style:none}
    .guide-prose .md-li{position:relative;padding-left:18px;margin-bottom:var(--s2)}
    .guide-prose .md-li::before{content:"";position:absolute;left:2px;top:.62em;width:5px;height:5px;
      border:1px solid var(--g-accent);border-radius:1px;transform:rotate(45deg)}
    .guide-prose .md-ol{margin:0 0 var(--s4);padding-left:1.3em}
    .guide-prose .md-ol .md-li{padding-left:0;list-style:decimal}
    .guide-prose .md-ol .md-li::before{content:none}

    /* Врезка: пример, определение, расчёт */
    .guide-inset{margin:var(--s5) 0;padding:14px 15px;border:1px solid var(--g-rule);
      border-radius:var(--r-lg);background:var(--color-surface-2)}
    .guide-inset-kick{font-size:.64rem;letter-spacing:.14em;text-transform:uppercase;color:var(--g-accent);margin-bottom:7px}
    .guide-inset-body{font-family:var(--font-read);font-size:var(--text-sm);line-height:1.6;color:var(--color-text);margin:0}

    /* Глава «Мифы»: пара «утверждение / как на самом деле». Она есть в пяти
       книгах из шести и всюду написана парами - это список, а не проза. */
    .guide-myths{border-top:1px solid var(--g-rule)}
    .guide-myth{padding:var(--s4) 0;border-bottom:1px solid var(--g-rule)}
    .guide-myth-q{font-family:var(--font-read);font-style:italic;font-size:var(--text-sm);
      line-height:1.4;color:var(--color-text-muted);margin:0 0 7px}
    .guide-myth-a{font-family:var(--font-read);font-size:var(--text-sm);line-height:1.65;color:var(--color-text);
      margin:0;padding-left:12px;border-left:2px solid var(--g-accent)}

    /* Подвал листа: следующая глава и возврат в оглавление */
    .guide-next{display:flex;align-items:center;gap:var(--s3);width:100%;text-align:left;margin-top:var(--s6);
      padding:14px;border:1px solid var(--g-rule);border-radius:var(--r-lg);background:none;
      color:var(--color-text);cursor:pointer}
    .guide-next:active{background:oklch(from var(--g-accent) l c h / .07)}
    .guide-next-txt{min-width:0}
    .guide-next-txt span{display:block;font-size:.66rem;letter-spacing:.12em;text-transform:uppercase;color:var(--color-text-muted)}
    .guide-next-txt b{display:block;font-family:var(--font-read);font-weight:500;font-size:var(--text-sm);margin-top:3px}
    .guide-next svg{width:18px;height:18px;margin-left:auto;flex:none;color:var(--g-accent)}
    .guide-tocback{display:block;width:100%;min-height:44px;margin-top:var(--s3);padding:12px;border:0;
      background:none;font-size:var(--text-sm);color:var(--color-text-muted);cursor:pointer;text-align:center}

    /* Медальоны нотации внутри главы: знак, имя, роль в двух словах. Не повтор
       абзаца, а легенда к нему: в тексте планеты названы словами, а на карте
       человек видит символы - и связать одно с другим больше негде. */
    .guide-medals-kick{font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted);margin:var(--s5) 0 var(--s2)}
    .guide-medals{display:flex;gap:var(--s2);overflow-x:auto;padding:2px 0 var(--s2);
      margin:0 0 var(--s4);scrollbar-width:none;-webkit-overflow-scrolling:touch}
    .guide-medals::-webkit-scrollbar{display:none}
    .guide-medal{flex:0 0 92px;padding:11px 8px;border:1px solid var(--g-rule);border-radius:var(--r-md);
      text-align:center;background:var(--color-surface-2);color:var(--color-text);cursor:pointer}
    .guide-medal:active{background:oklch(from var(--g-accent) l c h / .08)}
    .guide-medal:focus-visible{outline:2px solid var(--g-accent);outline-offset:2px}
    .guide-medal-gl{display:block;font-size:1.4rem;line-height:1;color:var(--g-accent);margin-bottom:7px}
    .guide-medal b{display:block;font-family:var(--font-read);font-weight:500;font-size:var(--text-xs)}
    .guide-medal span{display:block;font-size:.66rem;color:var(--color-text-muted);line-height:1.35;margin-top:2px}

    /* Заголовок группы в словаре. Категория названа здесь один раз - в строках
       её повторять незачем, там различают названия. */
    .guide-group{display:flex;align-items:center;gap:var(--s2);
      margin:var(--s5) 0 var(--s2);padding-bottom:6px;border-bottom:1px solid var(--g-rule);
      font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;color:var(--color-text-muted)}
    .guide-group>span:not(.guide-group-gl){flex:1;min-width:0}
    .guide-group i{font-style:normal;color:var(--g-accent);font-variant-numeric:tabular-nums;letter-spacing:0}
    .guide-group-gl{flex:none;display:inline-flex;width:16px;height:16px;color:var(--g-accent)}
    .guide-group-gl svg{width:100%;height:100%;stroke-width:1.6}

    /* Карточка словаря без фотографии: символы снов, объекты астрологии.
       Голос раздела вместо собственного цвета - иначе сетка из тридцати шести
       разноцветных градиентов выглядит как другое приложение. */
    .guide-art{display:grid;place-items:center;position:relative;overflow:hidden;
      width:100%;aspect-ratio:100/152;border-radius:var(--r-md);
      border:1px solid var(--g-rule);color:var(--g-accent);
      background:linear-gradient(165deg,oklch(from var(--g-accent) l c h / .12),var(--color-surface-2) 66%);
      transition:transform .15s}
    /* Тонкое кольцо за глифом - единственное украшение; оно же держит масштаб. */
    .guide-art::before{content:"";position:absolute;width:60%;aspect-ratio:1;border-radius:50%;
      border:1px solid oklch(from var(--g-accent) l c h / .3)}
    .enc-card:hover .guide-art{transform:translateY(-3px)}
    .guide-art-gl{position:relative;display:grid;place-items:center;line-height:1}
    .guide-art.svg .guide-art-gl{width:42%}
    .guide-art.svg svg{width:100%;height:100%;stroke-width:1.4}
    .guide-art.sym .guide-art-gl{font-size:2.1rem}
    .guide-art.sym.long .guide-art-gl{font-family:var(--font-read);font-weight:500;font-size:1.15rem;letter-spacing:.02em}
    .guide-art.lg{width:132px;aspect-ratio:100/152}
    .guide-art.lg.sym .guide-art-gl{font-size:3.4rem}
    .guide-art.lg.sym.long .guide-art-gl{font-size:1.9rem}

    /* ── СЛОВАРЬ СПИСКОМ ──────────────────────────────────────────────── */
    /* Фильтр словаря. Прежние плитки-эмодзи в градиентных квадратах красились
       шестью хардкод-хексами и выпадали из монолинейного языка продукта. */
    .guide-chips{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:var(--s4)}
    .guide-chip{padding:6px 12px;border:1px solid var(--g-rule);border-radius:var(--r-full);
      background:none;font-size:var(--text-xs);color:var(--color-text-muted);cursor:pointer;min-height:32px}
    .guide-chip.on{background:var(--g-accent);border-color:var(--g-accent);color:var(--g-ink);font-weight:500}
    .guide-chip:focus-visible{outline:2px solid var(--g-accent);outline-offset:2px}

    /* ── ЛИСТ СЛОВАРЯ ─────────────────────────────────────────────────── */
    /* Прямое и перевёрнутое значения стоят рядом: их сравнивают, а не читают
       подряд. Раньше они шли одно под другим и сравнить их было нельзя. */
    .guide-two{display:flex;gap:var(--s3);margin-bottom:var(--s4)}
    .guide-two-col{flex:1;min-width:0;padding:12px;border:1px solid var(--g-rule);border-radius:var(--r-md)}
    .guide-two-kick{font-size:.62rem;letter-spacing:.12em;text-transform:uppercase;color:var(--g-accent);margin-bottom:6px}
    .guide-two-body{font-family:var(--font-read);font-size:var(--text-xs);line-height:1.5;color:var(--color-text);margin:0}
    .guide-card-art{display:flex;justify-content:center;margin:var(--s2) 0 var(--s5)}
    .guide-card-art img{width:132px;aspect-ratio:500/838;object-fit:cover;border-radius:var(--r-lg);
      box-shadow:var(--shadow-md);border:1px solid var(--g-rule)}
    .guide-card-art img.rev{transform:rotate(180deg)}

    /* SVG-карточки планет/знаков/домов */

    /* ══ ДОМЕН ПРОФИЛЯ: «Скрижаль» ═══════════════════════════════════════════
       Четвёртый голос продукта - изумруд. Латунь, вино, ночная синь и аметист
       заняты разделами, тил принадлежит навигации, олива - метке «бесплатно»,
       маджента - ошибке. Свободной осталась ровно одна широкая дуга круга
       (150-160°), и она отвечает смыслу домена: запас, рост, накопленное.

       Раздел живёт в ОДНОЙ вьюхе (#v-account), вложенность держит screenStack -
       поэтому объявление одно, без перечисления сестринских вьюх. */
    #v-account{
      --sec-accent:#2C5A45;--sec-rule:#cfd8d2;
      --sec-btn:#2C5A45;--sec-btn-hover:#24493a;--sec-btn-ink:#fff;
      --sec-wash:oklch(from var(--sec-accent) l c h / .07);
    }
    [data-theme="dark"] #v-account{
      --sec-accent:#5FBF95;--sec-rule:#2c3a34;
      /* Чернила тёмные: акцент на тёмной теме светлый, и белый текст на нём
         даёт 2.6:1. То же правило у Таро, Чисел и Снов. */
      --sec-btn:#5FBF95;--sec-btn-hover:#74cba6;--sec-btn-ink:#1c1b19;
      --sec-wash:oklch(from var(--sec-accent) l c h / .1);
    }
    /* Общие компоненты сами по себе красятся навигационным тилом - раздел
       обязан довести голос до них, иначе он остаётся объявлением. */
    #v-account .btn-primary{background:var(--sec-btn);border-color:var(--sec-btn);color:var(--sec-btn-ink)}
    #v-account .btn-primary:hover{background:var(--sec-btn-hover);border-color:var(--sec-btn-hover)}
    #v-account .btn-ghost:hover{border-color:var(--sec-accent);color:var(--sec-accent)}
    #v-account .seg-btn.active{background:var(--sec-btn);color:var(--sec-btn-ink)}
    #v-account .switch[aria-checked="true"]{background:var(--sec-btn)}
    #v-account a,#v-account .link-row:hover .link-row-label{color:var(--sec-accent)}
    #v-account :focus-visible{outline:2px solid var(--sec-accent);outline-offset:2px}

    /* ── Баннер раздела ──────────────────────────────────────────────────────
       Продолжает линию арт-баннеров Астрологии и Снов, но рисуется SVG, а не
       фотографией: содержимое зависит от человека (сколько звёзд в созвездии),
       а картинка этого не умеет. */
    .acc-banner{position:relative;overflow:hidden;height:118px;margin-bottom:var(--s5);
      border:1px solid var(--color-border);border-radius:var(--r-lg);background:var(--color-surface)}
    .acc-banner svg{position:absolute;inset:0;width:100%;height:100%}
    .acc-banner-txt{position:absolute;left:var(--s4);bottom:var(--s3);right:var(--s4)}
    .acc-kicker{font-size:.66rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;
      color:var(--sec-accent);margin-bottom:3px}
    .acc-title{font-family:var(--font-display);font-style:italic;font-size:var(--text-xl);
      line-height:1.05;letter-spacing:-.01em}

    /* ── Рубрика со счётчиком: канон всех разделов ───────────────────────── */
    .acc-sec{display:flex;align-items:baseline;gap:var(--s2);margin-top:var(--s6);
      padding-bottom:7px;border-bottom:1px solid var(--sec-rule)}
    .acc-sec-t{font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
      color:var(--color-text-muted)}
    .acc-sec-n{margin-left:auto;font-family:var(--font-read);font-weight:500;font-size:1.2rem;
      color:var(--sec-accent);font-variant-numeric:tabular-nums}
    .acc-sec-lead{font-size:var(--text-xs);line-height:1.5;color:var(--color-text-muted);
      margin:var(--s3) 0 0;max-width:52ch}

    /* ── Строка реестра: тот же канон, что каталог Чисел и модули Астрологии ── */
    .acc-row{display:flex;align-items:center;gap:var(--s3);width:100%;text-align:left;
      min-height:44px;padding:var(--s3) var(--s2);border:0;border-bottom:1px solid var(--sec-rule);
      border-left:2px solid oklch(from var(--sec-accent) l c h / .3);border-radius:0;
      background:none;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent;
      transition:background .15s,border-color .15s}
    .acc-row:hover{background:oklch(from var(--sec-accent) l c h / .05);border-left-color:var(--sec-accent)}
    .acc-row:active{background:oklch(from var(--sec-accent) l c h / .09)}
    .acc-row.static{cursor:default}
    .acc-row.static:hover{background:none;border-left-color:oklch(from var(--sec-accent) l c h / .3)}
    .acc-row-ico{flex:none;display:inline-flex;color:var(--color-text-muted)}
    .acc-row-ico svg{width:17px;height:17px;stroke-width:1.7}
    .acc-row-main{flex:1;min-width:0}
    .acc-row-t{display:block;font-size:var(--text-sm)}
    .acc-row-s{display:block;font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px;line-height:1.45}
    .acc-row-v{flex:none;font-size:var(--text-xs);color:var(--color-text-muted);font-variant-numeric:tabular-nums}
    .acc-row-go{flex:none;color:var(--color-text-faint);display:inline-flex}
    .acc-row-go svg{width:16px;height:16px;stroke-width:1.7}
    /* Поле в строке реестра (время пуша) не должно ни растягиваться, ни наезжать
       на подпись: своя ширина по содержимому и запрет на сжатие текста рядом. */
    .acc-row input[type="time"]{flex:none;width:auto;min-width:0;margin-left:auto;
      padding:var(--s2) var(--s3);font-size:max(16px,var(--text-sm))}

    /* ── Кошелёк ─────────────────────────────────────────────────────────────
       Геройская поверхность домена. Латунь здесь законна ролью (премиум и
       «сгорит»), а голос раздела ведёт полосу лимита и кнопки. */
    .acc-wallet{position:relative;overflow:hidden;margin-top:var(--s4);padding:var(--s5);
      border:1px solid var(--color-border);border-radius:var(--r-xl);
      background:linear-gradient(180deg,var(--sec-wash),transparent 62%),var(--color-surface)}
    .acc-wallet-orbit{position:absolute;right:-42px;top:-54px;width:180px;height:180px;
      opacity:.5;pointer-events:none}
    .acc-wallet-lab{font-size:.62rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;
      color:var(--color-text-muted)}
    .acc-wallet-num{font-family:var(--font-display);font-size:2.9rem;line-height:1;margin-top:var(--s1);
      font-variant-numeric:lining-nums tabular-nums}
    .acc-wallet-unit{font-family:var(--font-body);font-size:var(--text-sm);color:var(--color-text-muted);
      margin-left:8px}
    .acc-bar{height:4px;border-radius:var(--r-full);background:var(--color-surface-offset);
      margin-top:var(--s4);overflow:hidden}
    .acc-bar i{display:block;height:100%;border-radius:var(--r-full);background:var(--sec-accent)}
    .acc-bar-row{display:flex;justify-content:space-between;gap:var(--s3);margin-top:6px;
      font-size:var(--text-xs);color:var(--color-text-muted)}
    .acc-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--s4)}
    .acc-chip{font-size:var(--text-xs);padding:3px 10px;border-radius:var(--r-full);
      border:1px solid var(--color-border);background:var(--color-surface-2);color:var(--color-text-muted)}
    .acc-chip b{color:var(--color-text);font-weight:500}
    .acc-chip.on{border-color:oklch(from var(--sec-accent) l c h / .45);color:var(--sec-accent)}
    .acc-chip.on b{color:var(--sec-accent)}
    .acc-btns{display:flex;gap:var(--s2);margin-top:var(--s4)}
    .acc-btns .btn{flex:1;justify-content:center}
    .acc-note{font-size:var(--text-xs);line-height:1.55;color:var(--color-text-muted);margin-top:var(--s3)}
    .acc-note.warn{color:var(--gold)}

    /* Пустой кошелёк: у нуля есть выход, и бесплатный стоит первым. */
    .acc-empty{text-align:center;padding:var(--s2) var(--s1) 0}
    .acc-empty-gl{color:var(--sec-accent);opacity:.85}
    .acc-empty-t{font-family:var(--font-read);font-weight:500;font-size:var(--text-base);
      margin:var(--s3) 0 var(--s2)}
    .acc-empty-s{font-size:var(--text-xs);line-height:1.6;color:var(--color-text-muted);
      margin:0 auto var(--s4);max-width:34ch}

    /* ── Движение токенов ───────────────────────────────────────────────── */
    .acc-mv{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s2);
      border-bottom:1px solid var(--sec-rule)}
    .acc-mv:last-child{border-bottom:0}
    .acc-mv-main{flex:1;min-width:0}
    .acc-mv-t{font-size:var(--text-sm)}
    .acc-mv-s{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px}
    .acc-mv-n{flex:none;font-family:var(--font-read);font-weight:500;font-size:var(--text-sm);
      font-variant-numeric:tabular-nums;color:var(--color-text-muted)}
    .acc-mv-n.in{color:var(--sec-accent)}
    .acc-day{font-size:.62rem;font-weight:600;letter-spacing:.12em;text-transform:uppercase;
      color:var(--color-text-faint);margin:var(--s4) 0 var(--s1);padding-left:var(--s2)}

    /* ── Тарифы и пакеты ────────────────────────────────────────────────── */
    .acc-plan{border:1px solid var(--color-border);border-radius:var(--r-lg);padding:var(--s4);
      background:var(--color-surface);margin-top:var(--s3)}
    .acc-plan.on{border-color:oklch(from var(--sec-accent) l c h / .5);
      background:linear-gradient(180deg,var(--sec-wash),transparent 70%),var(--color-surface)}
    .acc-plan-h{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s3)}
    .acc-plan-n{font-family:var(--font-display);font-size:1.55rem;line-height:1}
    .acc-plan-t{font-size:var(--text-xs);color:var(--color-text-muted);white-space:nowrap}
    .acc-plan-w{font-size:var(--text-xs);line-height:1.5;color:var(--color-text-muted);margin-top:7px}
    .acc-packs{display:flex;gap:var(--s2);margin-top:var(--s3)}
    .acc-pack{flex:1;padding:var(--s3) var(--s2);text-align:center;border:1px solid var(--color-border);
      border-radius:var(--r-md);background:var(--color-surface)}
    .acc-pack:hover{border-color:var(--sec-accent)}
    .acc-pack-n{display:block;font-family:var(--font-display);font-size:1.35rem;line-height:1;
      font-variant-numeric:lining-nums}
    .acc-pack-u{display:block;font-size:.62rem;color:var(--color-text-muted);margin-top:3px}
    .acc-pack-p{display:block;font-size:var(--text-xs);color:var(--sec-accent);margin-top:7px}
    /* Способы оплаты пакета - в один ряд. Ширины в плитке мало, поэтому кнопки
       ужаты до цены: валюта («₽», «★») сама говорит, чем платят, и слова не нужны.
       Цифры табличные - три плитки читаются как один прайс, а не как три разных. */
    .acc-pack-b{display:flex;gap:4px;margin-top:8px}
    /* min-height, а не только padding: две денежные кнопки стоят вплотную, и
       промах пальцем здесь означает оплату не тем способом. 34px - компромисс
       между целью тапа и тем, что три плитки должны остаться в одном ряду. */
    .acc-pack-b .btn{flex:1;min-width:0;min-height:34px;padding:4px 2px;
      font-size:.68rem;white-space:nowrap;font-variant-numeric:tabular-nums}
    .acc-prices{width:100%;border-collapse:collapse;font-size:var(--text-sm);margin-top:var(--s2)}
    .acc-prices td{padding:var(--s3) var(--s2);border-bottom:1px solid var(--sec-rule);color:var(--color-text-muted)}
    .acc-prices td:last-child{text-align:right;color:var(--color-text);white-space:nowrap;
      font-variant-numeric:tabular-nums}
    .acc-prices tr:last-child td{border-bottom:0}
    .acc-prices .free{color:var(--sec-accent)}

    /* ── Созвездие ───────────────────────────────────────────────────────────
       Каждый друг, дошедший до пользы продукта, - звезда; вехи соединяют их в
       фигуру. Точки будущих звёзд намечены заранее: видно, куда растёт небо. */
    .acc-sky{position:relative;overflow:hidden;height:150px;margin-top:var(--s4);
      border:1px solid var(--color-border);border-radius:var(--r-xl);
      background:radial-gradient(130% 100% at 22% 4%,var(--sec-wash),transparent 66%),var(--color-surface)}
    .acc-sky.sm{height:124px}
    .acc-sky svg{position:absolute;inset:0;width:100%;height:100%}
    .acc-sky-cap{position:absolute;left:var(--s4);right:var(--s4);bottom:var(--s3)}
    .acc-sky-t{font-family:var(--font-read);font-weight:500;font-size:var(--text-sm);margin-bottom:2px}
    .acc-sky-s{font-size:var(--text-xs);color:var(--color-text-muted)}
    .acc-stats{display:flex;gap:var(--s6);margin-top:var(--s4);padding-left:var(--s2)}
    .acc-stat-n{font-family:var(--font-read);font-weight:500;font-size:1.4rem;line-height:1;
      font-variant-numeric:tabular-nums}
    .acc-stat-l{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:3px}
    .acc-link{display:flex;align-items:center;gap:var(--s2);margin-top:var(--s4);padding:9px 11px;
      border:1px dashed var(--color-border);border-radius:var(--r-md);background:var(--color-surface-2);
      font-size:var(--text-xs);color:var(--color-text-muted);cursor:pointer}
    .acc-link code{font-family:ui-monospace,monospace;color:var(--color-text);white-space:nowrap;
      overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}
    .acc-link svg{flex:none;width:15px;height:15px;stroke-width:1.7}
    .acc-mile{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s2);
      border-bottom:1px solid var(--sec-rule)}
    .acc-mile:last-child{border-bottom:0}
    .acc-mile-s{flex:none;display:inline-flex;color:var(--color-text-faint)}
    .acc-mile.on .acc-mile-s{color:var(--sec-accent)}
    .acc-mile-s svg{width:15px;height:15px;stroke-width:1.6}
    .acc-mile-m{flex:1}
    .acc-mile-t{font-size:var(--text-sm)}
    .acc-mile-sub{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px}
    .acc-mile-v{flex:none;font-size:var(--text-xs);color:var(--color-text-muted);font-variant-numeric:tabular-nums}
    .acc-mile.on .acc-mile-v{color:var(--sec-accent)}
    .acc-person{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s2);
      border-bottom:1px solid var(--sec-rule)}
    .acc-person:last-child{border-bottom:0}
    .acc-av{flex:none;width:32px;height:32px;border-radius:var(--r-full);display:grid;place-items:center;
      border:1px solid var(--color-border);background:var(--color-surface-2);
      color:var(--color-text-muted);font-size:var(--text-xs)}
    .acc-av.on{border-color:oklch(from var(--sec-accent) l c h / .55);color:var(--sec-accent)}
    .acc-person-m{flex:1;min-width:0}
    .acc-person-n{font-size:var(--text-sm)}
    .acc-person-s{font-size:var(--text-xs);color:var(--color-text-muted);margin-top:2px}
    .acc-tag{flex:none;font-size:var(--text-xs);padding:2px 9px;border-radius:var(--r-full);
      border:1px solid var(--color-border);color:var(--color-text-muted);white-space:nowrap}
    .acc-tag.on{border-color:oklch(from var(--sec-accent) l c h / .45);color:var(--sec-accent)}

    /* ── Приглашение сверить совместимость ──────────────────────────────── */
    .acc-orbs{display:flex;align-items:center;justify-content:center;margin-bottom:var(--s4)}
    .acc-orb{width:56px;height:56px;border-radius:var(--r-full);display:grid;place-items:center;
      border:1px solid var(--color-border);background:var(--color-surface-2);
      font-family:var(--font-display);font-style:italic;font-size:var(--text-lg);
      color:var(--color-text-muted)}
    .acc-orb.on{border-color:oklch(from var(--sec-accent) l c h / .55);color:var(--sec-accent);
      background:var(--color-surface)}
    .acc-orb.second{margin-left:-14px}
    .acc-hero{text-align:center;padding:var(--s5) var(--s2) var(--s2)}
    .acc-hero-t{font-family:var(--font-display);font-style:italic;font-size:var(--text-xl);
      line-height:1.22;margin-bottom:var(--s3);text-wrap:balance}
    .acc-hero-s{font-size:var(--text-sm);line-height:1.6;color:var(--color-text-muted);
      max-width:36ch;margin:0 auto}
    .acc-ex{display:flex;gap:var(--s3);padding:var(--s3) var(--s2);border-bottom:1px solid var(--sec-rule)}
    .acc-ex:last-child{border-bottom:0}
    .acc-ex-i{flex:none;display:inline-flex;color:var(--sec-accent);padding-top:2px}
    .acc-ex-i svg{width:17px;height:17px;stroke-width:1.7}
    .acc-ex b{display:block;font-size:var(--text-sm);font-weight:500}
    .acc-ex span{display:block;font-size:var(--text-xs);color:var(--color-text-muted);
      margin-top:2px;line-height:1.5}
    .acc-guard{display:flex;gap:var(--s2);margin-top:var(--s4);padding:var(--s3);
      border:1px solid var(--color-border);border-radius:var(--r-md);background:var(--color-surface-2);
      font-size:var(--text-xs);line-height:1.55;color:var(--color-text-muted)}
    .acc-guard svg{flex:none;width:15px;height:15px;stroke-width:1.7;color:var(--gold);margin-top:1px}
