/* Базовый каркас дизайн-системы фабрики сайтов. ANYAAAA-1783.
 *
 * ОБЛИК = дизайн-система «Organic» (каркас владельца, проект Claude Design
 * «Organic», комментарий 25.08.2026). Тёплая кремовая земля, терракотовый акцент
 * и приглушённо-зелёный (шалфей) второй голос, скруглённые формы (карточки 16–20px,
 * кнопки и мелкие контролы — таблетки 999px), крупные характерные заголовки поверх
 * гуманистического рубленого текста, мягкие тёплые тени, левое асимметричное
 * выравнивание. Полный свод правил — docs/design-system.md; исходник —
 * knowledge/… и readme проекта «Organic».
 *
 * Здесь — структура, ритм и БАЗОВЫЙ ОБЛИК всего парка. Всё, что делает сайты
 * РАЗНЫМИ — палитра, шрифт, радиусы, плотность, макет — приходит переменными из
 * theme.css, который грузится следом и переопределяет :root. Правка этого файла
 * меняет ВЕСЬ парк, правка темы — один сайт.
 *
 * ШРИФТЫ САМОХОСТЯТСЯ (woff2 в /assets/fonts). Внешний CDN в критическом пути
 * запрещён: из РФ Google Fonts то медленные, то мёртвые, а шрифт держит первую
 * отрисовку (урок ANYAAAA-1519). Caprasimo/Figtree из «Organic» кириллицы НЕ
 * несут — для русского контура взяты кириллические эквиваленты того же характера:
 * Podkova (тёплый скруглённый бруск — роль дисплейного Caprasimo) и Nunito
 * (скруглённый гуманист — роль Figtree). Оба разложены на подмножества
 * cyrillic/latin, отдаются локально.
 *
 * Обязательный минимум качества (радиус карточки ≥8px, кнопки ≥6px, тень ≠none,
 * различимость фона и поверхности) закреплён в docs/design-system.md и воротах
 * core/check.mjs. Тема может стилизовать, но не опускается ниже минимума.
 */

/* ── самохостинг шрифтов: Podkova (заголовки) + Nunito (текст) ─────────────── */
@font-face{font-family:'Nunito';font-style:normal;font-weight:400 700;font-display:swap;src:url('/assets/fonts/nunito-cyrillic-ext.woff2') format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}
@font-face{font-family:'Nunito';font-style:normal;font-weight:400 700;font-display:swap;src:url('/assets/fonts/nunito-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}
@font-face{font-family:'Nunito';font-style:normal;font-weight:400 700;font-display:swap;src:url('/assets/fonts/nunito-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}
@font-face{font-family:'Nunito';font-style:normal;font-weight:400 700;font-display:swap;src:url('/assets/fonts/nunito-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:'Podkova';font-style:normal;font-weight:400 700;font-display:swap;src:url('/assets/fonts/podkova-cyrillic-ext.woff2') format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}
@font-face{font-family:'Podkova';font-style:normal;font-weight:400 700;font-display:swap;src:url('/assets/fonts/podkova-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}
@font-face{font-family:'Podkova';font-style:normal;font-weight:400 700;font-display:swap;src:url('/assets/fonts/podkova-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}
@font-face{font-family:'Podkova';font-style:normal;font-weight:400 700;font-display:swap;src:url('/assets/fonts/podkova-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 {
  /* ── Палитра «Organic» (тему переопределяет theme.css). Земля тёплая
   * кремовая, поверхность — песочная на тон темнее: карточка «садится» на землю
   * цветом, скруглением и мягкой тенью, а не рамкой. ── */
  --c-bg: #f5ead8;        /* кремовая земля */
  --c-surface: #ebddc5;   /* песочная поверхность карточек */
  --c-text: #201e1d;      /* тёплый угольный */
  --c-muted: #6a6152;     /* приглушённый тёплый серо-коричневый */
  --c-line: color-mix(in srgb, #201e1d 12%, transparent);

  /* Терракотовый акцент — только ДЕЙСТВИЕ и навигационная подсветка. */
  --c-accent: #c67139;
  --c-accent-600: #b2622d;
  --c-accent-700: #8c491a;   /* глубокий — для текстовых ссылок на светлом (контраст) */
  --c-accent-800: #643312;
  --c-accent-ink: #fffaf3;   /* почти-белый тёплый текст на заливке акцентом */
  --c-accent-soft: color-mix(in srgb, var(--c-accent) 12%, transparent);
  --c-accent-tint: #fbe9d9;  /* плотная тёплая плашка (теги, шапки таблиц) */

  /* Шалфей — второй голос: продающий блок, редкие подложки. Не состояние. */
  --c-accent2: #7a8a5e;
  --c-accent2-700: #56633f;
  --c-accent2-tint: #eaf0dc;

  /* Совместимость: движок темы всё ещё отдаёт --grad; в плоском облике «Organic»
   * градиента нет, поэтому фолбэк — сплошной акцент. Компоненты его не
   * используют, переменная оставлена, чтобы старые темы не падали. */
  --grad: var(--c-accent);

  /* Шрифты. Podkova — дисплейные заголовки, Nunito — текст. Хвост стеков
   * системный: пока woff2 грузятся (swap) и на случай отказа. */
  --f-head: "Podkova", "PT Serif", Georgia, "Times New Roman", serif;
  --f-body: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --f-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;

  /* Типографика. Заголовки Podkova тяжёлые от природы — вес 700 достаточно. */
  --w-h1: 700;
  --w-h2: 700;
  --s-h1: clamp(30px, 4.4vw, 46px);
  --s-h2: clamp(23px, 2.7vw, 31px);
  --s-body: 17px;

  /* Форма: скругляем щедро, мелкие контролы — таблетки. */
  --r-card: 18px;
  --r-btn: 999px;
  --r-pill: 999px;

  /* Ритм. */
  --wrap: 1120px;
  --prose: 720px;
  --gap: 24px;
  --section: 76px;

  /* Глубина — мягкие тёплые тени под кремовую землю (тон #2e2b25). */
  --shadow: 0 1px 2px color-mix(in srgb, #2e2b25 12%, transparent), 0 6px 20px -10px color-mix(in srgb, #2e2b25 22%, transparent);
  --shadow-md: 0 3px 10px color-mix(in srgb, #2e2b25 16%, transparent), 0 14px 34px -14px color-mix(in srgb, #2e2b25 26%, transparent);
  --shadow-lg: 0 20px 48px -18px color-mix(in srgb, #2e2b25 30%, transparent);
  --ring: 0 0 0 3px var(--c-accent-soft), 0 0 0 2px var(--c-accent);

  --border: 1px solid var(--c-line);
}

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

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }

body {
  margin: 0;
  font-family: var(--f-body);
  font-size: var(--s-body);
  line-height: 1.62;
  color: var(--c-text);
  background: var(--c-bg);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}

img, svg { max-width: 100%; height: auto; display: block; }

/* Фотографии контента проходят через .washed: приглушены и осветлены, чтобы
 * «сесть» в тёплую страницу, а не лежать поверх (правило образности «Organic»). */
.washed { filter: saturate(0.62) contrast(0.9) brightness(1.06); border-radius: var(--r-card); overflow: hidden; }

a { color: var(--c-accent-700); text-decoration: none; text-underline-offset: 3px; }
a:hover { text-decoration: underline; }

:focus { outline: none; }
:focus-visible { outline: none; box-shadow: var(--ring); border-radius: 8px; }
::selection { background: color-mix(in srgb, var(--c-accent) 26%, transparent); }

code {
  font-family: var(--f-mono);
  font-size: .9em;
  background: var(--c-accent-soft);
  color: var(--c-accent-800);
  padding: .14em .42em;
  border-radius: 7px;
  word-break: break-word;
}

h1, h2, h3 { font-family: var(--f-head); line-height: 1.14; margin: 0 0 .5em; color: var(--c-text); letter-spacing: -.005em; }
h1 { font-size: var(--s-h1); font-weight: var(--w-h1); }
h2 { font-size: var(--s-h2); font-weight: var(--w-h2); }
h3 { font-size: 1.2em; font-weight: 700; }
p { margin: 0 0 1em; }
strong { font-weight: 700; }

.wrap { width: 100%; max-width: var(--wrap); margin: 0 auto; padding: 0 24px; }

/* ---------- шапка ----------
 * Плоская, на кремовой земле, тёмный текст. Overlay на градиентном герое из
 * прежней школы снят: герой теперь светлый. Мобайл-first: до 1040px ряд ссылок
 * свёрнут под бургер, видны лого и кнопка продажи. */

.topbar { position: static; z-index: 30; background: transparent; }
/* Где ниже крошки (светлая полоса на поверхности), шапка несёт фон поверхности,
 * чтобы стык читался. Признак один на страницу — hasBreadcrumbs. */
.topbar--solid { background: var(--c-surface); }

/* Шапка ОБЯЗАНА делить колонку контента (--wrap): край лого и кнопки в шапке
 * стоит ровно над левым/правым краем тела страницы. Отдельный max-width здесь
 * ЗАПРЕЩЁН — он двигает шапку шире тела и лого «прилипает к левому краю»
 * относительно контента (отклонено владельцем, ANYAAAA-1783, 26.08). Контейнер
 * центрируется через класс .wrap (margin:0 auto). Ворота check.mjs это стерегут. */
.topbar__inner { display: flex; align-items: center; gap: 16px; min-height: 74px; }
.logo { display: flex; align-items: center; gap: 11px; color: var(--c-text); font-family: var(--f-head); font-weight: 700; font-size: 19px; }
.logo svg { width: 34px; height: 34px; flex: 0 0 auto; }
.logo span { white-space: nowrap; }
.logo:hover { text-decoration: none; opacity: .9; }

.nav { display: none; gap: 2px; margin-left: auto; min-width: 0; }
.nav__link {
  color: var(--c-muted); padding: 8px 11px; border-radius: var(--r-pill);
  font-size: 14px; font-weight: 600; white-space: nowrap;
  transition: background-color .14s, color .14s;
}
.nav__link:hover, .nav__link.is-active { color: var(--c-accent-800); background: var(--c-accent-soft); text-decoration: none; }

.topbar__cta { margin-left: auto; }

.burger {
  display: inline-flex; margin-left: 2px; width: 46px; height: 46px; border: 0; border-radius: var(--r-pill);
  background: var(--c-accent-soft); cursor: pointer; position: relative; transition: background-color .14s; flex: 0 0 auto;
}
.burger:hover { background: color-mix(in srgb, var(--c-accent) 20%, transparent); }
.burger::before, .burger::after,
.burger span { content: ""; position: absolute; left: 13px; right: 13px; height: 2px; background: var(--c-text); border-radius: 2px; transition: transform .18s, opacity .18s; }
.burger::before { top: 16px; }
.burger::after { bottom: 16px; }
.burger span { top: 22px; }

/* Горизонтальный ряд включается ≥1200px. Колонка контента при этом зафиксирована
 * на --wrap (1120px) и НЕ расширяется от ширины экрана — значит ряд «лого + ссылки
 * + кнопка» обязан уместиться именно в неё. Длинных пунктов больше пяти в один ряд
 * не влезает, поэтому инлайн-ряд ограничен пятью первыми; остальные разделы всегда
 * доступны в футере (там перечислены ВСЕ страницы) и в бургер-меню. Так шапка
 * держит один ряд, не переносится и не выезжает за край (ANYAAAA-1783, 26.08). */
@media (min-width: 1200px) {
  .nav { display: flex; }
  .nav__link:nth-of-type(n + 6) { display: none; }
  .topbar__cta { margin-left: 14px; }
  .burger { display: none; }
}

/* ---------- кнопки ---------- */

.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  min-height: 48px; padding: 13px 26px; border-radius: var(--r-btn);
  font-family: var(--f-body); font-weight: 700; font-size: 15.5px; line-height: 1;
  letter-spacing: 0; white-space: nowrap; border: 1.5px solid transparent; cursor: pointer;
  transition: transform .14s ease, box-shadow .14s ease, background-color .14s ease, color .14s ease, opacity .14s ease;
}
.btn:hover { text-decoration: none; transform: translateY(-1px); }
.btn:active { transform: translateY(0); }

/* Первичная кнопка — сплошная заливка акцентом, тёплый светлый текст. Единый вид
 * на любом фоне (герой и продающий блок теперь светлые). */
.btn--primary {
  background: var(--c-accent); color: var(--c-accent-ink);
  box-shadow: 0 8px 20px -10px color-mix(in srgb, var(--c-accent) 80%, transparent);
}
.btn--primary:hover { background: var(--c-accent-600); box-shadow: 0 12px 26px -10px color-mix(in srgb, var(--c-accent) 85%, transparent); }
.btn--primary:active { background: var(--c-accent-700); }

/* Вторичная кнопка — контур акцента, прозрачная заливка (гост «Organic»). */
.btn--ghost { background: transparent; color: var(--c-accent-800); border-color: color-mix(in srgb, var(--c-accent) 45%, transparent); }
.btn--ghost:hover { background: var(--c-accent-soft); }

.btn--sm { min-height: 42px; padding: 10px 20px; font-size: 14.5px; }
.btn--lg { min-height: 54px; padding: 16px 34px; font-size: 17px; }

/* ---------- герой ----------
 * Левое асимметричное выравнивание «Organic»: заголовок и лид прижаты влево,
 * справа воздух с мягким шалфейно-терракотовым пятном. Кремовая земля, тёмный
 * текст — без градиента и без белого-по-тёмному. */

.hero { background: var(--c-bg); color: var(--c-text); padding: 72px 0 var(--section); position: relative; overflow: hidden; }
.hero::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background:
    radial-gradient(560px 360px at 92% -10%, color-mix(in srgb, var(--c-accent2) 26%, transparent), transparent 60%),
    radial-gradient(520px 380px at 78% 120%, color-mix(in srgb, var(--c-accent) 16%, transparent), transparent 62%);
}
.topbar--solid + .crumbs + main .hero { padding-top: 44px; }
/* Герой «левый асимметричный»: сам контейнер делит центрированную колонку .wrap
   (левая кромка строго под лого шапки), асимметрию даёт УЗКИЙ контент, а НЕ сдвиг
   к краю окна. margin:0 здесь снимал центровку .wrap ⇒ герой прилипал к левому краю. */
.hero__inner { margin: 0 auto; text-align: left; position: relative; }
.hero__inner > * { max-width: 720px; margin-right: auto; }
.hero__badge {
  display: inline-flex; align-items: center; padding: 6px 15px; border-radius: var(--r-pill);
  background: var(--c-accent-tint); color: var(--c-accent-800);
  font-size: 12.5px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; margin-bottom: 20px;
}
.hero__title { color: var(--c-text); margin-bottom: .34em; }
.hero__lead { font-size: 1.16em; color: var(--c-muted); max-width: 40em; line-height: 1.6; }
.hero__lead a, .hero__note a { color: var(--c-accent-700); text-decoration: underline; text-underline-offset: 2px; }
.hero__ctas { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 30px; justify-content: flex-start; }
.hero__note { margin-top: 22px; font-size: .92em; color: var(--c-muted); margin-bottom: 0; }

/* ---------- крошки ---------- */

.crumbs { background: var(--c-surface); }
.crumbs__inner { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding-top: 13px; padding-bottom: 13px; font-size: 14px; }
.crumbs__link { color: var(--c-muted); }
.crumbs__link:hover { color: var(--c-accent-700); }
.crumbs__sep { color: color-mix(in srgb, var(--c-text) 30%, transparent); }
.crumbs__current { color: var(--c-text); font-weight: 600; }

/* ---------- общие блоки ---------- */

.block { padding: var(--section) 0; }
.block + .block { padding-top: 0; }
.block__title { max-width: 24em; margin-bottom: .5em; }
.block__intro { color: var(--c-muted); max-width: var(--prose); margin-bottom: 32px; font-size: 1.04em; }

/* Витринные сетки (карточки, таблица, перелинковка, дистрибутивы) остаются
 * слева, как весь макет «Organic»: центрирование заголовков над сеткой убрано —
 * оно тянуло к симметрии, чуждой системе. */

.prose { max-width: var(--prose); }
.prose__h { margin-top: 1.7em; }
.prose__list, .prose__ol { margin: 0 0 1.2em; padding-left: 24px; }
.prose__list li, .prose__ol li { margin-bottom: .55em; }
.prose__list li::marker { color: var(--c-accent); }
.prose__ol li::marker { color: var(--c-accent); font-weight: 700; }

/* оглавление — скруглённая карточка на поверхности */
.toc { padding-top: 8px; }
.toc .wrap { max-width: var(--prose); }
.toc__head { font-family: var(--f-head); font-weight: 700; margin-bottom: 10px; font-size: 16px; }
.toc__list { margin: 0; padding: 20px 22px 20px 42px; background: var(--c-surface); border-radius: var(--r-card); box-shadow: var(--shadow); }
.toc__list li { margin-bottom: 8px; }
.toc__list li:last-child { margin-bottom: 0; }
.toc__list a { color: var(--c-text); }
.toc__list a:hover { color: var(--c-accent-700); }

/* шаги */
.steps { list-style: none; margin: 0; padding: 0; max-width: var(--prose); counter-reset: step; }
.step { display: flex; gap: 18px; padding: 24px 0; border-top: var(--border); }
.step:first-child { border-top: 0; padding-top: 8px; }
.step__num {
  flex: 0 0 42px; height: 42px; border-radius: var(--r-pill);
  background: var(--c-accent); color: var(--c-accent-ink);
  display: flex; align-items: center; justify-content: center; font-family: var(--f-head); font-weight: 700; font-size: 18px;
  box-shadow: 0 6px 16px -8px color-mix(in srgb, var(--c-accent) 80%, transparent);
}
.step__title { margin-bottom: .35em; }
.step__text, .step__note { margin: 0; }
.step__note { margin-top: .6em; color: var(--c-muted); font-size: .94em; }

/* карточки с иконкой-бейджем */
.cards { display: grid; gap: var(--gap); grid-template-columns: repeat(auto-fit, minmax(258px, 1fr)); }
.card {
  background: var(--c-surface); border-radius: var(--r-card); padding: 28px;
  box-shadow: var(--shadow); transition: transform .16s ease, box-shadow .16s ease;
}
.card:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); }
.card__ic {
  width: 52px; height: 52px; border-radius: 16px; margin-bottom: 18px;
  background: var(--c-accent-tint); color: var(--c-accent-700); display: flex; align-items: center; justify-content: center;
}
.card__ic svg { width: 26px; height: 26px; }
.card__tag { display: inline-block; font-size: 12px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--c-accent-700); margin-bottom: 10px; }
.card__title { margin-bottom: .45em; font-size: 1.14em; }
.card__text { margin: 0; color: var(--c-muted); }

/* дистрибутивы */
.dls { display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); }
.dl {
  display: block; padding: 20px 22px; border-radius: var(--r-card);
  background: var(--c-surface); color: inherit; box-shadow: var(--shadow);
  transition: transform .16s ease, box-shadow .16s ease;
}
.dl:hover { text-decoration: none; transform: translateY(-3px); box-shadow: var(--shadow-md); }
.dl__platform { display: block; font-family: var(--f-head); font-weight: 700; font-size: 1.08em; }
.dl__store { display: block; font-size: 13px; color: var(--c-accent-700); margin: 3px 0 7px; font-weight: 600; }
.dl__note { display: block; font-size: 14px; color: var(--c-muted); }

/* таблица — скруглённая карточка, тёплая зебра, подсказка прокрутки на мобильном */
.table__scroll {
  overflow-x: auto; border-radius: var(--r-card);
  box-shadow: var(--shadow); -webkit-overflow-scrolling: touch;
}
.table { width: 100%; border-collapse: collapse; font-size: .96em; background: var(--c-surface); }
.table th, .table td { text-align: left; padding: 14px 16px; border-bottom: var(--border); vertical-align: top; }
.table tr:last-child td { border-bottom: 0; }
.table th { background: var(--c-accent-tint); color: var(--c-accent-800); font-weight: 700; white-space: nowrap; }
.table tbody tr:nth-child(even) td { background: color-mix(in srgb, var(--c-bg) 55%, var(--c-surface)); }
.table td:first-child { font-weight: 600; }

/* вопросы — карточки-аккордеоны */
.faq { max-width: var(--prose); display: grid; gap: 12px; }
.faq__item { border-radius: var(--r-card); padding: 4px 22px; background: var(--c-surface); box-shadow: var(--shadow); transition: box-shadow .14s; }
.faq__item[open] { box-shadow: var(--shadow-md); }
.faq__q { cursor: pointer; font-family: var(--f-head); font-weight: 700; list-style: none; padding: 16px 0; display: flex; align-items: center; gap: 12px; }
.faq__q::-webkit-details-marker { display: none; }
.faq__q::before {
  content: "+"; flex: 0 0 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center;
  color: var(--c-accent-ink); background: var(--c-accent); border-radius: var(--r-pill); font-weight: 700; font-size: 18px;
}
.faq__item[open] .faq__q::before { content: "\2212"; }
.faq__a { padding: 0 0 16px 40px; color: var(--c-muted); }
.faq__a p:last-child { margin-bottom: 0; }

/* перелинковка */
.link-cards { display: grid; gap: 14px; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
.link-card {
  display: block; padding: 20px 22px; border-radius: var(--r-card); color: inherit;
  background: var(--c-surface); box-shadow: var(--shadow); transition: transform .16s ease, box-shadow .16s ease;
}
.link-card:hover { text-decoration: none; transform: translateY(-3px); box-shadow: var(--shadow-md); }
.link-card__label { display: flex; align-items: center; gap: 6px; font-family: var(--f-head); font-weight: 700; color: var(--c-accent-700); }
.link-card__label::after { content: "\2192"; transition: transform .16s; }
.link-card:hover .link-card__label::after { transform: translateX(4px); }
.link-card__text { display: block; font-size: 14px; color: var(--c-muted); margin-top: 5px; }

/* выноска */
.callout { border-left: 4px solid var(--c-accent); background: var(--c-accent-soft); padding: 18px 22px; border-radius: 0 var(--r-card) var(--r-card) 0; max-width: var(--prose); }
.callout p:last-child { margin-bottom: 0; }
.callout__title { font-family: var(--f-head); font-weight: 700; margin-bottom: .3em; }
.callout--warn { border-left-color: #c07a12; background: rgba(217, 149, 40, .14); }
.callout--danger { border-left-color: #b3402c; background: rgba(179, 64, 44, .12); }

/* продающий блок — единственный способ увести в оплату из текста. В «Organic»
 * это тёплая шалфейная карточка (второй голос), а не тёмный градиент. */
.sale {
  display: flex; flex-wrap: wrap; align-items: center; gap: 24px; justify-content: space-between;
  padding: 32px 36px; border-radius: var(--r-card); background: var(--c-accent2-tint); color: var(--c-text);
  box-shadow: var(--shadow); position: relative; overflow: hidden;
}
.sale::after {
  content: ""; position: absolute; right: -60px; top: -60px; width: 240px; height: 240px;
  background: radial-gradient(circle, color-mix(in srgb, var(--c-accent2) 22%, transparent), transparent 70%); pointer-events: none;
}
.sale__lead { display: flex; align-items: flex-start; gap: 20px; position: relative; flex: 1 1 340px; }
.sale__ic {
  flex: 0 0 auto; width: 56px; height: 56px; border-radius: 18px; color: var(--c-accent2-700);
  background: color-mix(in srgb, var(--c-accent2) 22%, transparent);
  display: flex; align-items: center; justify-content: center;
}
.sale__ic svg { width: 28px; height: 28px; }
.sale__body { max-width: 44em; }
.sale__title { color: var(--c-text); margin-bottom: .35em; }
.sale__reason { margin: 0; color: var(--c-muted); }
.sale__reason a { color: var(--c-accent-700); text-decoration: underline; text-underline-offset: 2px; }

/* ---------- подвал ---------- */

.footer { background: var(--c-surface); padding: 48px 0; margin-top: var(--section); font-size: 14px; }
.footer__links { display: flex; flex-wrap: wrap; gap: 10px 20px; margin-bottom: 20px; }
.footer__links a { color: var(--c-muted); font-weight: 600; }
.footer__links a:hover { color: var(--c-accent-700); }
.footer__note, .footer__copy { color: var(--c-muted); margin: 0 0 8px; }

/* ---------- варианты макета ---------- */

/* docs: единая читаемая колонка (справочник). */
html[data-layout="docs"] .block--prose .wrap,
html[data-layout="docs"] .block--steps .wrap,
html[data-layout="docs"] .block--faq .wrap,
html[data-layout="docs"] .block--callout .wrap { max-width: var(--prose); }

/* article: текст шире и воздушнее — вид журнала */
html[data-layout="article"] .block { padding: 56px 0; }
html[data-layout="article"] .hero { padding: 64px 0 52px; }
/* Оглавление обязано делить ЛЕВУЮ КРОМКУ с лого, героем и телом (design-system
   §6). Базовое правило `.toc .wrap { max-width: var(--prose) }` сужает и
   ЦЕНТРИРУЕТ контейнер: в макете `docs` это верно — там прозаические блоки
   сужены так же, и кромка общая. В `article`/`landing` тело идёт по полной
   колонке, и суженное оглавление уезжает вправо от всего остального — ровно тот
   разрыв кромки, за который владелец отклонял вёрстку (ANYAAAA-1783).
   Лечение: контейнеру возвращаем ширину колонки, узкой держим саму строку. */
html[data-layout="article"] .toc .wrap,
html[data-layout="landing"] .toc .wrap { max-width: var(--wrap); }
html[data-layout="article"] .toc__head,
html[data-layout="article"] .toc__list,
html[data-layout="landing"] .toc__head,
html[data-layout="landing"] .toc__list { max-width: var(--prose); }

/* landing: плотные секции, чередование фона */
/* РАЗРЫВ ЛЕВОЙ КРОМКИ №7 (ANYAAAA-1785): проза в макете `landing`.
   `.prose` — это сам контейнер `.wrap`, а он центрируется (margin:0 auto). При
   узкой мере (--prose 700 в колонке 1080) абзацы уезжают на ~190px правее
   героя и карточек, и верх страницы читается перекошенным — тот самый класс
   дефекта, за который владелец отклонял парк пять раз. В `docs` это верно (там
   сужены ВСЕ блоки), в `article` герой сам по центру, а в `landing` герой
   левый — значит и проза обязана держать левую кромку колонки. Воздух уходит
   вправо, как и требует «Organic» (левое асимметричное выравнивание).
   ЛЕЧИТЬ ТОЛЬКО ШИРИНОЙ СОДЕРЖИМОГО, а не сдвигом контейнера: `margin-left:0`
   снимает центровку `.wrap` целиком, и колонка прилипает к левому краю ОКНА
   (проверено прибором — абзацы уехали на 48px при колонке, начинающейся с 204).
   Тот же урок, что с героем: контейнер держит колонку, узкой делаем начинку. */
html[data-layout="landing"] .block--prose .wrap.prose { max-width: var(--wrap); }
html[data-layout="landing"] .block--prose .wrap.prose > * { max-width: var(--prose); }

html[data-layout="landing"] .block--features,
html[data-layout="landing"] .block--downloads { background: var(--c-surface); padding: var(--section) 0; }
html[data-layout="landing"] .block + .block { padding-top: var(--section); }

/* ---------- планшет + свёрнутая навигация ---------- */

@media (max-width: 1199px) {
  :root { --section: 60px; }
  .hero { padding-top: 56px; }
  /* Кнопка продажи прижата вправо, бургер идёт следом и остаётся в кадре. */
  .topbar__cta { margin-left: auto; }
  .nav {
    flex-direction: column; gap: 4px; position: absolute; top: 74px; left: 12px; right: 12px;
    background: var(--c-surface); padding: 12px; border-radius: var(--r-card); box-shadow: var(--shadow-lg);
  }
  .nav.is-open { display: flex; }
  .nav__link { padding: 12px 14px; font-size: 16px; }
}

/* На тесных экранах прячем текст бренда (знак остаётся): иначе длинная кнопка
 * «Оформить доступ» выдавливает бургер за край, и меню недоступно. */
@media (max-width: 460px) {
  .logo span { display: none; }
}

/* ---------- мобильные ---------- */

@media (max-width: 860px) {
  .wrap { padding: 0 18px; }
  .topbar__inner { gap: 12px; }
  .hero { padding: 48px 0 44px; }
  .hero__ctas .btn { flex: 1 1 auto; }
  .sale { flex-direction: column; align-items: flex-start; padding: 26px 24px; }
  .sale__lead { flex: 1 1 auto; }
  .sale .btn { width: 100%; }
  .step { gap: 14px; padding: 20px 0; }
  .card, .dl, .link-card { padding: 22px; }
}

@media (max-width: 520px) {
  :root { --s-body: 16px; }
  .table th, .table td { padding: 12px 13px; }
  .sale__ic { display: none; }
}

/* уважение к настройке «меньше движения» */
@media (prefers-reduced-motion: reduce) {
  * { transition: none !important; scroll-behavior: auto !important; }
  .btn:hover, .card:hover, .dl:hover, .link-card:hover { transform: none; }
}

/* =========================================================================
 * СКЕЛЕТЫ ПАРКА — КАРКАС, а не палитра. ANYAAAA-1783 (требование владельца
 * 26.08: сайты парка обязаны различаться КОНСТРУКЦИЕЙ, а не только цветом).
 *
 * Каждый блок строго под html[data-skeleton="<id>"]: сайт без скелета
 * («plain») получает РОВНО прежний облик — уже стоящие сайты и дневная рутина
 * не затронуты. Токены дизайн-системы «Organic» (земля/поверхность/шрифты/тени)
 * общие: меняется расположение элементов и метафора навигации, а не язык.
 *
 * Инварианты, которые скелет НЕ ломает (ворота check.mjs → checkLayoutCss):
 *   * .wrap остаётся центрированным (margin:0 auto) — не трогаем;
 *   * базовые .topbar__inner/.hero__inner не получают max-width шире --wrap и
 *     не теряют центровку — переопределения идут ПОЗЖЕ и только внутри скелета;
 *   * кнопка продажи в шапке сохраняет класс topbar__cta (ровно одна на страницу).
 * ========================================================================= */

/* ─────────────────────────────────────────────────────────────────────────
 * СКЕЛЕТ «console» — панель-справочник (ruhapp.ru, ось диагностики/ошибок).
 * Навигация уходит в фиксированную боковую колонку слева, тело — приборная
 * доска плотных чекпоинт-плиток. Мобайл (<1024px) наследует базовый верхний
 * ряд с бургером — правится только десктоп.
 * ───────────────────────────────────────────────────────────────────────── */

/* тех-графика героя: сигнальная радар-схема справа, где у левого героя воздух */
html[data-skeleton="console"] .hero { padding-top: 60px; }
html[data-skeleton="console"] .hero::after {
  content: ""; position: absolute; top: -30px; right: -30px; width: 360px; height: 360px;
  background: url("/assets/skeleton-console.svg") no-repeat center / contain;
  opacity: .5; pointer-events: none; z-index: 0;
}
html[data-skeleton="console"] .hero__inner { position: relative; z-index: 1; }

/* приборные плитки: левый акцентный кант, моно-подпись, плотнее базовых карточек */
html[data-skeleton="console"] .cards { grid-template-columns: repeat(auto-fit, minmax(238px, 1fr)); gap: 16px; }
html[data-skeleton="console"] .card {
  border-left: 4px solid var(--c-accent); border-radius: 12px; padding: 22px 22px 22px 24px;
}
html[data-skeleton="console"] .card__ic { width: 42px; height: 42px; border-radius: 11px; margin-bottom: 14px; }
html[data-skeleton="console"] .card__ic svg { width: 22px; height: 22px; }
html[data-skeleton="console"] .card__tag { font-family: var(--f-mono); letter-spacing: .01em; font-size: 11.5px; }
/* перелинковка тоже в приборном ключе — строки с моно-меткой */
html[data-skeleton="console"] .link-card { border-left: 3px solid color-mix(in srgb, var(--c-accent) 45%, transparent); border-radius: 10px; }

@media (min-width: 1024px) {
  html[data-skeleton="console"] body { padding-left: 270px; }
  html[data-skeleton="console"] .topbar,
  html[data-skeleton="console"] .topbar--solid {
    position: fixed; inset: 0 auto 0 0; width: 270px; z-index: 40;
    background: var(--c-surface); border-right: 1px solid var(--c-line);
    box-shadow: var(--shadow); overflow-y: auto;
  }
  html[data-skeleton="console"] .topbar__inner {
    flex-direction: column; align-items: stretch; gap: 8px;
    min-height: 100vh; padding: 26px 18px 22px; max-width: none;
  }
  html[data-skeleton="console"] .logo { margin-bottom: 16px; font-size: 18px; }
  html[data-skeleton="console"] .nav {
    display: flex; flex-direction: column; gap: 4px; margin: 0;
    position: static; inset: auto; background: transparent; padding: 0;
    border-radius: 0; box-shadow: none;
  }
  html[data-skeleton="console"] .nav__link {
    display: flex; align-items: center; gap: 10px; padding: 11px 14px;
    border-radius: 11px; font-size: 15px; border-left: 3px solid transparent;
  }
  html[data-skeleton="console"] .nav__link:nth-of-type(n + 6) { display: flex; }
  html[data-skeleton="console"] .nav__link.is-active {
    border-left-color: var(--c-accent); background: var(--c-accent-tint); color: var(--c-accent-800);
  }
  html[data-skeleton="console"] .topbar__cta { margin: auto 0 0; width: 100%; }
  html[data-skeleton="console"] .burger { display: none; }
}

/* ─────────────────────────────────────────────────────────────────────────
 * СКЕЛЕТ «magazine» — журнал/энциклопедия (happ-skachat.fyi, ось установки).
 * Центрированный масштхед: знак сверху по центру, меню строкой под ним в
 * тонкой рамке, кнопка «подписки» вынесена в верхний правый угол. Герой
 * широкий редакционный по центру, карточки — «обложки выпусков». Мобайл
 * (<860px) наследует базовый верхний ряд с бургером.
 * ───────────────────────────────────────────────────────────────────────── */

/* редакционный герой — по центру, крупная подача, факел-иллюстрация фоном */
html[data-skeleton="magazine"] .hero { text-align: center; padding-top: 60px; }
html[data-skeleton="magazine"] .hero::before {
  background:
    radial-gradient(620px 320px at 50% -12%, color-mix(in srgb, var(--c-accent2) 24%, transparent), transparent 62%),
    radial-gradient(560px 360px at 50% 118%, color-mix(in srgb, var(--c-accent) 14%, transparent), transparent 64%);
}
html[data-skeleton="magazine"] .hero::after {
  content: ""; position: absolute; left: 50%; top: 8px; width: 460px; height: 300px;
  transform: translateX(-50%);
  background: url("/assets/skeleton-magazine.svg") no-repeat center top / contain;
  opacity: .14; pointer-events: none; z-index: 0;
}
html[data-skeleton="magazine"] .hero__inner { margin: 0 auto; text-align: center; position: relative; z-index: 1; }
html[data-skeleton="magazine"] .hero__inner > * { max-width: 780px; margin-left: auto; margin-right: auto; }
html[data-skeleton="magazine"] .hero__lead { max-width: 42em; }
html[data-skeleton="magazine"] .hero__ctas { justify-content: center; }

/* «обложки выпусков»: цветная шапка-баннер с крупным значком, затем текст */
html[data-skeleton="magazine"] .cards { grid-template-columns: repeat(auto-fit, minmax(298px, 1fr)); gap: 28px; }
html[data-skeleton="magazine"] .card { padding: 0 0 26px; overflow: hidden; }
html[data-skeleton="magazine"] .card__ic {
  width: 100%; height: 92px; border-radius: 0; margin: 0 0 18px;
  background: var(--c-accent-tint);
}
html[data-skeleton="magazine"] .card__ic svg { width: 40px; height: 40px; }
html[data-skeleton="magazine"] .card__tag,
html[data-skeleton="magazine"] .card__title,
html[data-skeleton="magazine"] .card__text { padding-left: 26px; padding-right: 26px; }

@media (min-width: 860px) {
  html[data-skeleton="magazine"] .topbar { position: relative; }
  html[data-skeleton="magazine"] .topbar__inner {
    flex-direction: column; align-items: center; gap: 10px;
    padding: 22px 24px 0; min-height: 0; position: relative;
  }
  html[data-skeleton="magazine"] .logo {
    flex-direction: column; gap: 8px; font-size: 25px; text-align: center;
  }
  html[data-skeleton="magazine"] .logo svg { width: 44px; height: 44px; }
  html[data-skeleton="magazine"] .nav {
    display: flex; flex-direction: row; justify-content: center; flex-wrap: wrap;
    gap: 2px 4px; margin: 8px 0 0; width: 100%;
    position: static; inset: auto; background: transparent; box-shadow: none; border-radius: 0;
    border-top: 1px solid var(--c-line); border-bottom: 1px solid var(--c-line); padding: 8px 0;
  }
  html[data-skeleton="magazine"] .nav__link:nth-of-type(n + 6) { display: inline-flex; }
  html[data-skeleton="magazine"] .nav__link { text-transform: uppercase; letter-spacing: .045em; font-size: 12.5px; padding: 8px 12px; }
  html[data-skeleton="magazine"] .topbar__cta { position: absolute; top: 22px; right: 24px; margin: 0; }
  html[data-skeleton="magazine"] .burger { display: none; }
}

/* ─────────────────────────────────────────────────────────────────────────
 * СКЕЛЕТ «ledger» — учётная карточка (keyhapp.ru, ось «подписка, ключ, срок»).
 * ANYAAAA-1785.
 *
 * Метафора: сайт ведёт УЧЁТ одного предмета — строки доступа. Отсюда три
 * конструктивных отличия от соседей, которые видно с первого экрана:
 *   1. ГЕРОЙ-КВИТАНЦИЯ — не текст на земле (plain/console) и не центрированная
 *      редакционная полоса (magazine), а карточка-бланк на поверхности с
 *      перфорированным нижним краем и штампом-бейджем;
 *   2. ЛЕНТА РЕЕСТРА — пунктирная вертикаль слева, вдоль которой нанизаны
 *      секции; заголовок каждой секции помечен кружком-маркером. Страница
 *      читается как прошитый журнал, а не как набор экранов;
 *   3. СТРОКИ ВМЕСТО ПЛИТОК — `.cards` разворачивается в ОДНУ колонку записей
 *      (значок слева, текст справа, пунктирный разделитель), тогда как console
 *      даёт трёхколоночную приборную доску, а magazine — обложки выпусков.
 *
 * Инварианты держим: .wrap не трогаем, .hero__inner/.topbar__inner своих
 * max-width шире --wrap не получают и margin без auto не задают, кнопка шапки
 * остаётся .topbar__cta. Структурные переопределения навигации — внутри
 * @media, чтобы не течь на мобайл.
 * ───────────────────────────────────────────────────────────────────────── */

/* герой-квитанция: бланк на поверхности, перфорация по нижнему краю */
html[data-skeleton="ledger"] .hero { padding: 34px 0 var(--section); }
html[data-skeleton="ledger"] .hero::before { opacity: .55; }
html[data-skeleton="ledger"] .hero::after {
  content: ""; position: absolute; right: -40px; bottom: -20px; width: 300px; height: 300px;
  background: url("/assets/skeleton-ledger.svg") no-repeat center / contain;
  opacity: .16; pointer-events: none; z-index: 0;
}
html[data-skeleton="ledger"] .hero__inner {
  position: relative; z-index: 1;
  background: var(--c-surface);
  border-radius: 26px 26px 0 0;
  box-shadow: var(--shadow);
  padding: 40px 34px 44px;
}
/* перфорированный отрыв квитанции — «корешок» остаётся у нас */
html[data-skeleton="ledger"] .hero__inner::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: -11px; height: 22px;
  background:
    radial-gradient(circle at 11px 11px, var(--c-bg) 10px, transparent 11px) repeat-x left bottom / 22px 22px;
}
html[data-skeleton="ledger"] .hero__badge {
  border: 2px dashed color-mix(in srgb, var(--c-accent) 55%, transparent);
  background: transparent; color: var(--c-accent-800);
  font-family: var(--f-mono); letter-spacing: .08em; text-transform: uppercase;
}
html[data-skeleton="ledger"] .hero__note {
  border-top: 1px dashed var(--c-line); padding-top: 16px; font-family: var(--f-mono); font-size: 13.5px;
}

/* оглавление — «опись» с моно-нумерацией */
html[data-skeleton="ledger"] .toc__list { list-style: none; padding-left: 22px; counter-reset: opis; }
html[data-skeleton="ledger"] .toc__list li { counter-increment: opis; }
html[data-skeleton="ledger"] .toc__list li::before {
  content: counter(opis, decimal-leading-zero) " · ";
  font-family: var(--f-mono); font-size: 12.5px; color: var(--c-accent-700);
}

/* записи реестра: одна колонка, значок слева, пунктир между строками */
html[data-skeleton="ledger"] .cards { grid-template-columns: 1fr; gap: 0; }
html[data-skeleton="ledger"] .card {
  display: grid; grid-template-columns: 60px 1fr; column-gap: 20px; align-items: start;
  border-radius: 0; box-shadow: none; border: 0; border-bottom: 1px dashed var(--c-line);
  background: transparent; padding: 24px 6px;
}
html[data-skeleton="ledger"] .card:first-child { border-top: 1px dashed var(--c-line); }
html[data-skeleton="ledger"] .card:hover { transform: none; box-shadow: none; background: color-mix(in srgb, var(--c-surface) 55%, transparent); }
html[data-skeleton="ledger"] .card__ic { grid-row: 1 / span 3; margin: 0; width: 52px; height: 52px; border-radius: 15px; }
html[data-skeleton="ledger"] .card__ic svg { width: 26px; height: 26px; }
html[data-skeleton="ledger"] .card__tag { font-family: var(--f-mono); font-size: 11.5px; letter-spacing: .07em; margin-bottom: 6px; }
html[data-skeleton="ledger"] .card__title { font-size: 1.1em; }

/* шаги — «позиции описи»: номер моноширинный, в рамке-квадрате со скруглением */
html[data-skeleton="ledger"] .step__num {
  font-family: var(--f-mono); border-radius: 13px;
}

/* перелинковка — «корешки дела»: строка с пунктирной левой кромкой */
html[data-skeleton="ledger"] .link-cards { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
html[data-skeleton="ledger"] .link-card {
  border-left: 3px dashed color-mix(in srgb, var(--c-accent) 45%, transparent);
  border-radius: 0 14px 14px 0;
}

@media (min-width: 760px) {
  /* ЛЕНТА РЕЕСТРА: пунктирная вертикаль слева, маркер у заголовка секции */
  html[data-skeleton="ledger"] .block > .wrap {
    position: relative; padding-left: 46px;
    border-left: 2px dashed color-mix(in srgb, var(--c-accent) 28%, transparent);
  }
  html[data-skeleton="ledger"] .block__title { position: relative; }
  html[data-skeleton="ledger"] .block__title::before {
    content: ""; position: absolute; left: -53px; top: .42em; width: 14px; height: 14px;
    border-radius: 999px; background: var(--c-bg);
    border: 3px solid var(--c-accent);
  }
  html[data-skeleton="ledger"] .block--sale > .wrap { border-left-color: color-mix(in srgb, var(--c-accent2) 45%, transparent); }
}

@media (min-width: 1080px) {
  /* шапка-бланк: двойная линейка снизу, меню моно-капителью справа от знака */
  html[data-skeleton="ledger"] .topbar,
  html[data-skeleton="ledger"] .topbar--solid {
    border-bottom: 3px double color-mix(in srgb, var(--c-text) 22%, transparent);
  }
  html[data-skeleton="ledger"] .topbar__inner { min-height: 82px; }
  /* инлайн-ряд включаем с 1080px (у базы порог 1200): пять коротких моно-меток
     влезают в колонку раньше. display:flex обязателен — база держит .nav
     скрытым до 1200px, без него на 1080–1199 не было бы ни меню, ни бургера. */
  html[data-skeleton="ledger"] .nav {
    display: flex; margin-left: 26px;
    position: static; inset: auto; background: transparent; padding: 0;
    border-radius: 0; box-shadow: none;
  }
  html[data-skeleton="ledger"] .nav__link {
    font-family: var(--f-mono); font-size: 12.5px; letter-spacing: .05em;
    text-transform: uppercase; padding: 9px 12px;
  }
  html[data-skeleton="ledger"] .nav__link:nth-of-type(n + 6) { display: inline-flex; }
  html[data-skeleton="ledger"] .burger { display: none; }
}
