/* ── art-base.css ─────────────────────────────── */
/* art-base.css — блок макета блогу.
   Стилі виділені з прототипу Jira (LIGA-9364) і переведені на
   токени UI сайту: кольори/радіуси через var(--site-*), шрифт Inter.
   Згенеровано shared/build-blocks.py — правити тут, не в index.html. */

.blog-scope * { box-sizing:border-box;margin:0;padding:0 }
.blog-scope {
    scroll-behavior: smooth;
    padding-top: var(--site-header-h);
}
.blog-scope { font-family:var(--font-b);color:var(--ink);background:var(--lav);line-height:1.6;font-size:16px }
.blog-scope .wrap { max-width:1160px;margin:0 auto;padding:0 22px }
.blog-scope h1,
.blog-scope h2,
.blog-scope h3 { font-family:var(--font-h);line-height:1.2 }
.blog-scope a { color:var(--primary);text-decoration:none }
.blog-scope a:hover { text-decoration:underline }
.blog-scope header { position:sticky;top:0;z-index:60;background:rgba(255,255,255,.98);backdrop-filter:blur(8px);border-bottom:1px solid var(--line) }
.blog-scope .reading-progress { position:fixed;top:0;left:0;height:3px;background:var(--primary);z-index:200;transition:width .1s;width:0 }
.blog-scope .page-layout { display:grid;grid-template-columns:1fr 308px;gap:28px;align-items:start;padding:28px 0 64px }
.blog-scope .article-meta { display:flex;align-items:center;gap:8px;margin-bottom:14px;flex-wrap:wrap }
.blog-scope .meta-date { font-size:12px;color:var(--muted) }
.blog-scope .meta-sep { color:var(--line) }
.blog-scope h1.atitle { font-size:28px;font-weight:800;letter-spacing:-.4px;margin-bottom:14px;line-height:1.22 }
.blog-scope .author-box { display:flex;gap:13px;align-items:flex-start;padding:16px 0;border-top:1px solid var(--line);margin-top:6px }
/* Картка секції (.section*) переїхала в blog-base.css: блок «FAQ статті» тепер
   дозволений і в секціях листингів, а вони article.css не підключають. */
.blog-scope .change-blocks { display:flex;flex-direction:column;gap:18px;margin:18px 0 }
.blog-scope .salary-row { display:flex;gap:10px;flex-wrap:wrap;margin:9px 0 }
.blog-scope .salary-badge { display:inline-flex;align-items:baseline;gap:6px;background:var(--lav-2);border:1px solid var(--line);border-radius: var(--site-radius-sm);padding:7px 12px }
.blog-scope .salary-badge .sl { font-size:11px;color:var(--muted) }
.blog-scope .salary-badge .sv { font-size:16px;font-weight:800;color:var(--primary);font-family:var(--font-h) }
.blog-scope .salary-badge .ss { font-size:11px;color:var(--muted) }
.blog-scope .mistakes-list { display:flex;flex-direction:column;gap:12px;margin:16px 0;counter-reset:mistake }
.blog-scope .checklist-card { background:var(--white);border:2px solid var(--primary);border-radius: var(--radius-lg);overflow:hidden;margin:22px 0 }
.blog-scope .risk-list { display:flex;flex-direction:column;gap:7px;margin:14px 0 }
.blog-scope .product-bridge { background:linear-gradient(145deg,#091D4A 0%,var(--site-accent-hover) 50%,var(--site-accent) 100%);border-radius: var(--radius-lg);padding:calc(30px - var(--art-pad-cut) * .7) calc(30px - var(--art-pad-cut));margin:22px 0;color:#fff }
.blog-scope .step-list { display:flex;flex-direction:column;gap:11px;margin:14px 0;counter-reset:step }
.blog-scope .field { margin-bottom:12px }
.blog-scope .field label { display:block;font-size:13px;font-weight:600;color:var(--ink);margin-bottom:4px }
.blog-scope .field input { width:100%;padding:11px 14px;border:1.5px solid var(--line);border-radius: var(--site-radius-sm);font-size:15px;font-family:var(--font-b) }
.blog-scope .field input:focus { outline:none;border-color:var(--primary) }
.blog-scope .field input::placeholder { color:#a8a4be }
.blog-scope .form-note { font-size:12px;color:var(--muted);margin-top:8px;text-align:center }
.blog-scope .ok { text-align:center;padding:16px 0 }
.blog-scope .ok .check { width:60px;height:60px;border-radius: 50%;background:var(--lav-2);color:var(--primary);font-size:30px;display:flex;align-items:center;justify-content:center;margin:0 auto 14px }

@media(max-width:900px) {
  .blog-scope .page-layout { grid-template-columns:1fr }
  .blog-scope h1.atitle { font-size:23px }
  /* .section тут більше немає — правило переїхало в blog-base.css разом із
     самою карткою секції. */
  .blog-scope { padding-bottom:72px }
  /* Тут стояв список блоків із `margin: 10px 0 !important` — «на мобільному
     тісніше». Прибрано: тепер вертикальний ритм статті тримає одне число
     (--art-block-gap, див. кінець файлу), і воно саме стискається до 10px на
     вузькому екрані. !important тут лише заважав би тому правилу. */
}


/* ── art-content.css ─────────────────────────────── */
/* art-content.css — блок макета блогу.
   Стилі виділені з прототипу Jira (LIGA-9364) і переведені на
   токени UI сайту: кольори/радіуси через var(--site-*), шрифт Inter.
   Згенеровано shared/build-blocks.py — правити тут, не в index.html. */

.blog-scope .callout { border-radius: var(--site-radius-sm);padding:14px 18px;margin:14px 0;display:flex;gap:11px;align-items:flex-start; width: 100%;}
.blog-scope .callout .ico { font-size:18px;flex-shrink:0;margin-top:1px }
/* Заголовок виноски — по класу, а НЕ по тегу strong: текст виноски тепер rich
   text (міграція v50), і правило на тезі робило блоком кожне жирне слово
   всередині абзацу. */
.blog-scope .callout .callout-title { display:block;font-size:13.5px;font-weight:700;margin-bottom:3px }
.blog-scope .callout p { font-size:13.5px;margin:0;line-height:1.6;color:inherit }
/* Той самий rich text дозволив кілька абзаців і списки — без цих правил
   абзаци злипались би (margin:0 вище), а список лишався б без розміру
   й відступів. Зроблено так само, як для .pb-header (міграція v47). */
.blog-scope .callout p + p { margin-top:6px }
.blog-scope .callout ul,
.blog-scope .callout ol { font-size:13.5px;line-height:1.6;margin:6px 0 0 18px }
.blog-scope .callout li { margin-bottom:3px }
.blog-scope .callout.warning { background:var(--yellow-bg);border-left:4px solid var(--yellow);color:#5D4037 }
.blog-scope .callout.danger { background:var(--red-bg);border-left:4px solid var(--red);color:#7B1212 }
.blog-scope .callout.success { background:var(--green-bg);border-left:4px solid var(--green);color:#1A4731 }
.blog-scope .callout.info { background:var(--lav-2);border-left:4px solid var(--primary);color:#2D1B6E }
.blog-scope .roles-grid { display:grid;grid-template-columns:1fr 1fr;gap:13px;margin:18px 0 }
.blog-scope .role-card { border-radius: var(--site-radius-sm);padding:16px;border:1px solid var(--line);background:var(--lav) }
.blog-scope .role-card.ceo { border-left:4px solid #E65100;background:#FFF3E0 }
.blog-scope .role-card.hr { border-left:4px solid var(--green);background:var(--green-bg) }
.blog-scope .role-card.lawyer { border-left:4px solid #1565C0;background:#EBF4FF }
.blog-scope .role-card.accountant { border-left:4px solid #7B1FA2;background:#F3E5F5 }
.blog-scope .role-card.military { border-left:4px solid #455A64;background:#F5F5F5;grid-column:span 2 }
.blog-scope .role-hdr { display:flex;align-items:center;gap:9px;margin-bottom:9px }
.blog-scope .role-ico { font-size:20px }
.blog-scope .role-title { font-size:13.5px;font-weight:700 }
.blog-scope .role-card.ceo .role-title { color:#E65100 }
.blog-scope .role-card.hr .role-title { color:var(--green) }
.blog-scope .role-card.lawyer .role-title { color:#1565C0 }
.blog-scope .role-card.accountant .role-title { color:#7B1FA2 }
.blog-scope .role-card.military .role-title { color:#455A64 }
.blog-scope .role-card p { font-size:13px;color:var(--site-muted);margin:0;line-height:1.6 }
.blog-scope .change-block { border:1px solid var(--line);border-radius: var(--site-radius-sm);padding:20px 22px;background:var(--white);display:flex;gap:16px }
.blog-scope .change-num { font-size:30px;font-weight:800;color:var(--primary);opacity:.18;flex-shrink:0;line-height:1;min-width:38px;font-family:var(--font-h) }
.blog-scope .change-body h3 { font-size:15.5px;font-weight:700;color:var(--ink);margin:0 0 7px }
.blog-scope .change-body p { font-size:13.5px;color:var(--site-muted);margin:0 0 9px;line-height:1.65 }
.blog-scope .change-body p:last-child { margin:0 }
.blog-scope .mistake-item { display:flex;gap:13px;align-items:flex-start;padding:14px 16px;background:var(--lav);border:1px solid var(--line);border-radius: var(--site-radius-sm);border-left:4px solid var(--primary);counter-increment:mistake }
.blog-scope .mistake-num { font-size:11px;font-weight:800;color:#fff;background:var(--primary);width:22px;height:22px;border-radius: 50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;font-family:var(--font-h) }
.blog-scope .mistake-num::after { content:counter(mistake) }
.blog-scope .mistake-body strong { font-size:14.5px;font-weight:700;color:var(--ink);display:block;margin-bottom:4px }
.blog-scope .mistake-body p { font-size:13.5px;color:var(--site-muted);margin:0;line-height:1.6 }
.blog-scope .checklist-hdr { background:linear-gradient(135deg,var(--site-accent-hover),var(--site-accent));padding:calc(20px - var(--art-pad-cut) * .5) calc(26px - var(--art-pad-cut) * .7);color:#fff }
.blog-scope .checklist-hdr h3 { font-size:17px;font-weight:800;font-family:var(--font-h);margin-bottom:4px }
.blog-scope .checklist-hdr p { font-size:12.5px;color: #ffffff;margin:0 }
.blog-scope .checklist-body { padding:calc(18px - var(--art-pad-cut) * .4) calc(26px - var(--art-pad-cut) * .7) }
.blog-scope .checklist-items { display:flex;flex-direction:column;gap:8px }
.blog-scope .cl-item { display:flex;gap:11px;align-items:flex-start;padding:9px 0;border-bottom:1px solid var(--lav) }
.blog-scope .cl-item:last-child { border-bottom:none }
.blog-scope .cl-box { width:20px;height:20px;border:2px solid var(--line);border-radius: 5px;flex-shrink:0;margin-top:2px }
.blog-scope .cl-item span { font-size:13.5px;color:var(--site-muted);line-height:1.55;font-weight:500 }
.blog-scope .checklist-cta { display:flex;flex-direction:column;gap:16px;background:var(--lav);border-top:1px solid var(--line);padding:calc(22px - var(--art-pad-cut) * .4) calc(28px - var(--art-pad-cut) * .7) calc(24px - var(--art-pad-cut) * .4) }
.blog-scope .checklist-cta p { font-size:13.5px;color:var(--site-muted);margin-bottom:13px;line-height:1.6 }
.blog-scope .checklist-cta__text > :first-child { margin-top:0 !important }
.blog-scope .checklist-cta__text > :last-child { margin-bottom:0 !important }
.blog-scope .checklist-cta__actions { display:flex;flex-direction:column;gap:8px }
.blog-scope .checklist-cta strong { color:var(--ink) }
.blog-scope .risk-item { display:flex;gap:9px;align-items:flex-start;padding:9px 13px;background:var(--red-bg);border-radius: 8px;border-left:3px solid var(--red) }
.blog-scope .risk-item .ri { font-size:14px;flex-shrink:0;margin-top:2px }
.blog-scope .risk-item span { font-size:13.5px;color:var(--site-muted);line-height:1.5 }
.blog-scope .step-item { display:flex;gap:13px;align-items:flex-start;counter-increment:step }
.blog-scope .step-n { min-width:28px;height:28px;background:var(--primary);color:#fff;border-radius: 50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:800;flex-shrink:0;margin-top:2px;font-family:var(--font-h) }
.blog-scope .step-n::after { content:counter(step) }
.blog-scope .step-body { font-size:14px;color:var(--site-muted);line-height:1.6;padding-top:4px }
.blog-scope .step-body strong { color:var(--ink) }
.blog-scope .sources-card { background:var(--white);border:1px solid var(--line);border-radius: var(--site-radius-sm);padding:18px 22px;margin-bottom:18px }
.blog-scope .sources-card h4 { font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--muted);margin-bottom:10px }
.blog-scope .sources-card ol { padding-left:18px;display:flex;flex-direction:column;gap:6px }
.blog-scope .sources-card li { font-size:12.5px;color:var(--muted);line-height:1.5 }
.blog-scope .seg-toggle { display:flex;gap:6px;background:var(--lav);border-radius: var(--site-radius-sm);padding:5px;margin-bottom:16px }
.blog-scope .seg-toggle button { flex:1;border:none;background:transparent;padding:8px 6px;border-radius: var(--site-radius-sm);cursor:pointer;font-weight:600;font-size:12.5px;color:var(--muted);font-family:var(--font-b);transition:.15s }
.blog-scope .seg-toggle button.active { background:#fff;color:var(--primary);box-shadow:var(--shadow-s) }

@media(max-width:900px) {
  .blog-scope .roles-grid { grid-template-columns:1fr }
  .blog-scope .role-card.military { grid-column:span 1 }
    .blog-scope .page-layout { gap: 20px; }
}


/* ── art-cta.css ─────────────────────────────── */
/* art-cta.css — блок макета блогу.
   Стилі виділені з прототипу Jira (LIGA-9364) і переведені на
   токени UI сайту: кольори/радіуси через var(--site-*), шрифт Inter.
   Згенеровано shared/build-blocks.py — правити тут, не в index.html. */

.blog-scope .inline-cta { background:linear-gradient(135deg,var(--site-accent-hover) 0%,var(--site-accent) 55%,var(--site-accent-soft) 120%);border-radius: var(--radius-lg);padding:calc(26px - var(--art-pad-cut) * .6) calc(30px - var(--art-pad-cut));margin:24px 0;color:#fff;display:flex;gap:22px;align-items:center }
.blog-scope .inline-cta-text h3 { font-size:18px;font-weight:800;font-family:var(--font-h);margin-bottom:6px }
.blog-scope .inline-cta-text p { font-size:13px;color: #ffffff;margin:0;line-height:1.6 }
/* Текст CTA — rich text (міграція v50): абзаци, посилання й списки. На
   градієнті штатний колір посилання нечитабельний, тому біле з підкресленням —
   як у .pb-header (v47). */
.blog-scope .inline-cta-text p + p { margin-top:6px }
.blog-scope .inline-cta-text a { color:#fff;text-decoration:underline }
.blog-scope .inline-cta-text ul,
.blog-scope .inline-cta-text ol { font-size:13px;color:#fff;line-height:1.6;margin:6px 0 0 18px }
.blog-scope .inline-cta-text li { margin-bottom:3px }
.blog-scope .inline-cta-text { flex:1 }
.blog-scope .inline-cta-btns { display:flex;flex-direction:column;gap:8px;flex-shrink:0 }
.blog-scope .pb-badge { display:inline-block;background:rgba(255,255,255,.12);color:#ffffff;font-size:10px;font-weight:700;padding:4px 11px;border-radius: var(--site-radius-card);letter-spacing:.7px;text-transform:uppercase;margin-bottom:10px;font-family:var(--font-h) }
.blog-scope .pb-header h3 { font-size:21px;font-weight:800;font-family:var(--font-h);margin-bottom:7px }
.blog-scope .pb-header p { font-size:13.5px;color: #ffffff;margin-bottom:22px;line-height:1.6 }
/* Текст блока — rich text (міграція v47), тож редактор може поставити
   посилання чи список. На темному градієнті штатні кольори були б нечитані,
   а списку без цих правил бракувало б розміру й відступів. */
.blog-scope .pb-header a { color:#fff;text-decoration:underline }
.blog-scope .pb-header ul,
.blog-scope .pb-header ol { font-size:13.5px;color:#fff;line-height:1.6;margin:0 0 22px 18px }
.blog-scope .pb-header li { margin-bottom:4px }
.blog-scope .pb-features { display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:24px }
.blog-scope .pb-feat { background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.12);border-radius: var(--site-radius-sm);padding:14px 16px }
.blog-scope .pb-feat-icon { font-size:20px;display:block;margin-bottom:7px }
.blog-scope .pb-feat-title { font-size:13.5px;font-weight:700;color:#fff;margin-bottom:4px;font-family:var(--font-h) }
.blog-scope .pb-feat-desc { font-size:12.5px;color: #ffffff;line-height:1.5 }
.blog-scope .pb-cta { display:flex;gap:10px;flex-wrap:wrap }
.blog-scope .sidebar-cta { background:linear-gradient(160deg,var(--site-accent-hover) 0%,var(--site-accent) 100%);border-radius: var(--radius-lg);padding:24px;color:#fff;margin-bottom:14px;box-shadow:var(--shadow) }
/* Рев'ю #18: на темному фоні текст лише білий. Прозорість лишаємо як
   ієрархію, але піднімаємо найблідніші рівні (.5/.4) до читабельних. */
.blog-scope .sb-badge { font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color: #ffffff;margin-bottom:8px;font-family:var(--font-h) }
.blog-scope .sidebar-cta h3 { font-size:16px;font-weight:800;font-family:var(--font-h);margin-bottom:10px;line-height:1.35 }
.blog-scope .sidebar-cta p { font-size:13px;color:#ffffff;margin-bottom:16px;line-height:1.6 }
.blog-scope .sidebar-cta ul { list-style:none;margin-bottom:18px }
.blog-scope .sidebar-cta ul li { font-size:13px;color:#ffffff;padding:4px 0 4px 20px;position:relative }
.blog-scope .sidebar-cta ul li::before { content:"✓";position:absolute;left:0;color:#fff;font-weight:700 }
.blog-scope .sb-trust { font-size:11.5px;color:#ffffff;text-align:center;margin-top:11px;line-height:1.5 }
.blog-scope .sidebar-links-card { background:var(--white);border:1px solid var(--line);border-radius: var(--site-radius-sm);padding:16px 18px }
.blog-scope .sidebar-links-card h4 { font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--muted);margin-bottom:10px }
.blog-scope .sb-link { display:block;color:var(--primary);text-decoration:none;font-size:13px;padding:7px 0;border-bottom:1px solid var(--line);line-height:1.45 }
.blog-scope .sb-link:last-child { border-bottom:none }
.blog-scope .sb-link:hover { color:var(--ink) }

@media(max-width:900px) {
  .blog-scope .pb-features { grid-template-columns:1fr }
  .blog-scope .inline-cta { flex-direction:column }
}


/* ── art-faq.css ─────────────────────────────── */
/* art-faq.css — блок макета блогу.
   Стилі виділені з прототипу Jira (LIGA-9364) і переведені на
   токени UI сайту: кольори/радіуси через var(--site-*), шрифт Inter.
   Згенеровано shared/build-blocks.py — правити тут, не в index.html. */

/* Акордеон FAQ (.faq-*) переїхав у blog-base.css — блок дозволений і на
   листингах, а вони цей файл не підключають. */


/* ── art-hero.css ─────────────────────────────── */
/* art-hero.css — блок макета блогу.
   Стилі виділені з прототипу Jira (LIGA-9364) і переведені на
   токени UI сайту: кольори/радіуси через var(--site-*), шрифт Inter.
   Згенеровано shared/build-blocks.py — правити тут, не в index.html. */

.blog-scope .alead { font-size:17px;color:#4a4760;line-height:1.65;margin-bottom:22px }
/* Цифри тягнуться по всій смузі, скільки б їх не було. Було
   grid-template-columns:repeat(3,1fr) — рівно три колонки: одна цифра займала
   третину смуги, а дві третини лишались порожнім градієнтом; четверта цифра
   падала в другий ряд і висла ліворуч.
   Тепер flex із базою 0 (flex:1 1 0): скільки цифр — стільки й рівних часток
   рядка. База саме 0, а не 180px: із ненульовою базою три цифри в смузі 610px
   уже не вміщались за розрахунком переносу й ставали 2+1 — тобто ламався той
   випадок, який раніше працював (заміряно на статті про бронювання).
   min-width:0 — щоб частка справді ділилась порівну, а не впиралась у
   найдовше слово підпису. */
.blog-scope .deadline-box { background:linear-gradient(135deg,var(--site-accent-hover) 0%,var(--site-accent) 55%,var(--site-accent-soft) 120%);border-radius: 12px;padding:calc(22px - var(--art-pad-cut) * .5) calc(26px - var(--art-pad-cut) * .8);margin-bottom:22px;display:flex;flex-wrap:wrap;gap:18px;position:relative;overflow:hidden }
.blog-scope .deadline-box > * { flex:1 1 0;min-width:0 }
.blog-scope .deadline-box::before { content:'';position:absolute;top:-30px;right:-30px;width:130px;height:130px;background:rgba(255,255,255,.06);border-radius: 50% }
.blog-scope .dl-label { font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color: #ffffff;margin-bottom:5px }
.blog-scope .dl-value { font-size:17px;font-weight:800;color:#fff;line-height:1.2;font-family:var(--font-h) }
/* Рев'ю #18: на темному фоні текст лише білий. Акцент числа тримає
   насиченість (font-weight:800 успадкований), а не жовтий колір. */
.blog-scope .dl-value span { color:#fff }
.blog-scope .dl-sub { font-size:11px;color: #ffffff;margin-top:2px }
.blog-scope .author-av { width:42px;height:42px;background:var(--lav-2);border-radius: 50%;display:flex;align-items:center;justify-content:center;color:var(--primary);font-weight:800;font-size:15px;flex-shrink:0;font-family:var(--font-h) }
.blog-scope .author-info strong { font-size:14px;font-weight:700;color:var(--ink);display:block;margin-bottom:2px }
.blog-scope .author-info span { font-size:12px;color:var(--muted);display:block;margin-bottom:3px }
.blog-scope .author-info p { font-size:13px;color:var(--site-muted);margin:0;line-height:1.5 }
.blog-scope .hero-cta { display:flex;gap:12px;flex-wrap:wrap;margin-bottom:0;padding-top:18px }

@media(max-width:900px) {
  .blog-scope .deadline-box { flex-direction:column }
}

@media(max-width:600px) {
  .blog-scope .hero-cta { flex-direction:column }
}


/* ── art-layout.css ─────────────────────────────── */
/* art-layout.css — блок макета блогу.
   Стилі виділені з прототипу Jira (LIGA-9364) і переведені на
   токени UI сайту: кольори/радіуси через var(--site-*), шрифт Inter.
   Згенеровано shared/build-blocks.py — правити тут, не в index.html. */

.blog-scope .article-col { min-width:0 }

/* ⚠️ Правка Serg 04.08.2026: «зверху зайвий відступ, треба щоб було
   притиснуто догори».
   Причина була не у відступі: після переїзду змісту (#14) сайдбар став ВИЩИМ
   за вікно, а `position:sticky` для задовгого елемента не чіпляє верх — він
   їде разом зі сторінкою, доки не покажеться його низ. Звідси й «пливучий»
   проміжок над CTA.
   Лікуємо причину: тримаємо колонку в межах вікна (max-height) і робимо її
   флекс-колонкою — тоді sticky справді фіксує верх, а зміст унизу отримує
   власний скрол (art-toc.css) замість того, щоб вилазити за екран. */
.blog-scope .sidebar-col {
  position:sticky;
  top:88px;                        /* 80px липкої шапки + 8px подих */
  display:flex;
  flex-direction:column;
  gap:14px;
  /* мінус липка шапка (88) і нижня смуга CTA (~76) + подих */
  max-height:calc(100vh - 88px - 76px - 16px);
}
/* проміжки віддані flex-gap, щоб не складались із власними margin карток */
.blog-scope .sidebar-col > * { margin-bottom:0 }
.blog-scope .sidebar-col .sidebar-cta { flex:0 0 auto }
/* картка змісту може стискатись і віддавати свою висоту під внутрішній скрол */
.blog-scope .sidebar-col .toc-card { flex:0 1 auto;min-height:0;display:flex;flex-direction:column }

/* Рев'ю #14: зміст переїхав у сайдбар під CTA — стікі він отримує від
   .sidebar-col вище. Висоту обмежує сам список (art-toc.css: 5 рядків
   згорнуто, розгортання на ховер), тому картку тут не ріжемо. */

/* Рев'ю #14: «Пов'язані матеріали» тепер у кінці статті, на всю ширину
   колонки — розкладаємо лінки у дві колонки, щоб блок не був вузькою смугою. */
/* margin-top:22px звідси прибрано — відступ над «Пов'язаними матеріалами» тепер
   такий самий, як між рештою блоків (--art-block-gap, кінець файлу). Правило
   мало специфічність (0,3,0) і перебивало б спільний ритм. */
.blog-scope .article-col > .sidebar-links-card h4 { margin-bottom:4px }

@media(min-width:640px) {
  .blog-scope .article-col > .sidebar-links-card { display:grid;grid-template-columns:1fr 1fr;column-gap:26px }
  .blog-scope .article-col > .sidebar-links-card h4 { grid-column:1 / -1 }
}

@media(max-width:900px) {
  /* Планшет і мобільний. Сайдбарний CTA сховано (його дублює нижня смуга),
     а зміст лишається — інакше правка #14 забирає навігацію по статті.

     ⚠️ Правка Serg 04.08.2026: зміст має бути ПІД першим блоком (обкладинка,
     заголовок, лід, ключові цифри, CTA), а не над усією статтею. Самим
     `order` на <aside> цього не досягти: він сусід <main>, тож стає лише
     ДО або ПІСЛЯ всієї статті. Тому на цій ширині розпускаємо колонку
     статті (`display:contents`) — її діти стають елементами того самого
     флекс-контейнера, і тоді порядком керуємо поштучно:
       −2 перший блок → −1 зміст → 0 решта секцій (у своєму DOM-порядку). */
  .blog-scope .page-layout { display:flex;flex-direction:column }
  .blog-scope .article-col { display:contents }
  .blog-scope .article-col > .article-card { order:-2 }
  .blog-scope .sidebar-col { position:static;order:-1;max-height:none;display:block }
  .blog-scope .sidebar-col > :not(.toc-card) { display:none }
  .blog-scope .sidebar-col .toc-card { max-height:none;overflow:visible;margin-bottom:18px }
}


/* ── art-modal.css ─────────────────────────────── */
/* art-modal.css — блок макета блогу.
   Стилі виділені з прототипу Jira (LIGA-9364) і переведені на
   токени UI сайту: кольори/радіуси через var(--site-*), шрифт Inter.
   Згенеровано shared/build-blocks.py — правити тут, не в index.html. */

.blog-scope .ov { position:fixed;inset:0;background:rgba(27,24,48,.65);display:none;align-items:center;justify-content:center;z-index:10000;padding:20px }
.blog-scope .ov.show { display:flex }
.blog-scope .modal { background:#fff;border-radius: var(--radius-lg);max-width:540px;width:100%;max-height:92vh;overflow:auto;padding:30px;position:relative;box-shadow:0 24px 60px rgba(0,0,0,.32) }
.blog-scope .modal h3 { font-size:22px;font-family:var(--font-h);margin-bottom:5px }
.blog-scope .modal .sub { font-size:14px;color:var(--muted);margin-bottom:18px }
.blog-scope .modal .x { position:absolute;top:14px;right:18px;border:none;background:none;font-size:28px;color:var(--muted);cursor:pointer;line-height:1;font-family:serif }


/* ── art-related.css ─────────────────────────────── */
/* art-related.css — блок макета блогу.
   Стилі виділені з прототипу Jira (LIGA-9364) і переведені на
   токени UI сайту: кольори/радіуси через var(--site-*), шрифт Inter.
   Згенеровано shared/build-blocks.py — правити тут, не в index.html. */

/* Падінг — через --art-pad-cut (blog-base.css): нуль відняти при ≥1400px, тож
   десктоп лишається 32/36, а на ≤640px виходить ~22/21 — те саме, що давав
   стрибок на 900px, тільки плавно. */
.blog-scope .article-card { background:var(--white);border:1px solid var(--line);border-radius: var(--radius-lg);padding:calc(32px - var(--art-pad-cut) * .7) calc(36px - var(--art-pad-cut) * 1.1);margin-bottom:20px;box-shadow:var(--shadow-s) }


/* ── art-sticky.css ─────────────────────────────── */
/* art-sticky.css — блок макета блогу.
   Стилі виділені з прототипу Jira (LIGA-9364) і переведені на
   токени UI сайту: кольори/радіуси через var(--site-*), шрифт Inter.
   Згенеровано shared/build-blocks.py — правити тут, не в index.html. */

/* Правка Serg 04.08.2026: смуга CTA внизу — ГЛОБАЛЬНА, не лише мобільна.
   Раніше CSS ховав її >900px, а inline-стиль зі скрипта показував —
   тобто на десктопі вона жила «випадково». Тепер це рішення, а не збіг. */
.blog-scope .mob-sticky { display:block;position:fixed;bottom:0;left:0;right:0;background:#fff;border-top:1px solid var(--line);padding:12px 16px;z-index:99;box-shadow:0 -4px 20px rgba(76,45,150,.12) }
.blog-scope .mob-sticky-inner { display:flex;gap:10px;max-width:600px;margin:0 auto }
.blog-scope .mob-sticky-inner .btn { flex:1;justify-content:center;font-size:13.5px;padding:11px 14px }



/* ── art-toc.css ─────────────────────────────── */
/* art-toc.css — блок макета блогу.
   Стилі виділені з прототипу Jira (LIGA-9364) і переведені на
   токени UI сайту: кольори/радіуси через var(--site-*), шрифт Inter.
   Згенеровано shared/build-blocks.py — правити тут, не в index.html. */

.blog-scope .toc-card { background:var(--white);border:1px solid var(--line);border-left:4px solid var(--primary);border-radius: var(--site-radius-sm);padding:18px 22px;margin-bottom:18px }
.blog-scope .toc-title { font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--muted);margin-bottom:10px }
.blog-scope .toc-card ol { padding-left:18px;display:flex;flex-direction:column;gap:5px }
.blog-scope .toc-card li { font-size:13.5px }
.blog-scope .toc-card a { color:var(--primary);text-decoration:none }
.blog-scope .toc-card a:hover { text-decoration:underline }

/* ── Локальна правка L4 (Serg, 04.08.2026) ──────────────────────────────────
   Зміст лишається у правому сайдбарі (як просив менеджер у #14), але стає
   інтерактивним: згорнутий показує вікно ~5 рядків, підсвічує поточний
   розділ, на наведення розгортається у повний список.
   Навіщо: щоб не конфліктував по висоті з CTA над ним і щоб з будь-якого
   місця статті було видно, де ти зараз, і можна було стрибнути далі. */
.blog-scope .sidebar-col .toc-card { position:relative }
.blog-scope .sidebar-col .toc-card ol {
  /* вікно ~5 рядків: рядок ≈26px (з паддингом підсвітки) + проміжок 5px */
  max-height:calc(5 * 26px + 4 * 5px);
  overflow:hidden;
  /* Анімації тут свідомо НЕМАЄ: розгорнутий стан — max-height:none (щоб
     список сам віддав висоту сайдбару під скрол), а `none` не інтерполюється,
     тож будь-який transition однаково стрибнув би. Розгортання миттєве,
     як у меню; натомість плавно згасає градієнт-натяк унизу. */
}
/* розгортання: наведення або фокус з клавіатури (доступність).
   ⚠️ Правка Serg 04.08.2026: розгорнутий список упирався в низ екрана і
   «хвіст» було не дістати. Тепер висоту обмежує сам сайдбар (art-layout.css
   тримає його в межах вікна), а список отримує ВЛАСНИЙ скрол. */
.blog-scope .sidebar-col .toc-card:hover ol,

.blog-scope .sidebar-col .toc-card:focus-within ol {
  max-height:none;
  flex:1 1 auto;
  min-height:0;
  overflow-y:auto;
  overscroll-behavior:contain;   /* скрол списку не «пробиває» на сторінку */
  scrollbar-width:thin;
}
/* натяк, що список триває далі; у розгорнутому стані зникає */
.blog-scope .sidebar-col .toc-card::after {
  content:'';position:absolute;left:1px;right:1px;bottom:1px;height:26px;
  background:linear-gradient(to bottom, transparent, var(--white));
  border-radius:0 0 var(--site-radius-sm) var(--site-radius-sm);
  pointer-events:none;transition:opacity .2s;
}
.blog-scope .sidebar-col .toc-card:hover::after,

.blog-scope .sidebar-col .toc-card:focus-within::after { opacity:0 }

/* ── Поточний розділ (правка Serg 04.08.2026) ───────────────────────────────
   Була тонка «паличка» ліворуч від номера — виглядала сиротливо. Тепер це
   цілий рядок-плашка: напівпрозора акцентна підкладка, а паличка живе
   всередині неї (inset-тінь). Номери переводимо на CSS-лічильник, бо
   стандартний маркер <ol> лишається ЗА межами плашки й не підсвічується.
   На видимий текст це не впливає: номери й раніше малював CSS. */
.blog-scope .toc-card ol { list-style:none;padding-left:0;counter-reset:toc }
/* Клемп 2 рядки: анкери тепер збираються з РЕАЛЬНИХ заголовків тіла статті
   (BlogHeadings), а вони бувають довгі — один пункт займав чотири рядки й
   зміст переставав читатись як список. Клемпимо сам <li>, а не <a>: номер
   малює ::before, і якби -webkit-box стояв на посиланні, воно стало б блоком
   і поїхало під номер. */
.blog-scope .toc-card li {
  counter-increment:toc;border-radius:6px;padding:3px 9px;transition:background-color .15s;
  display:-webkit-box;
  -webkit-line-clamp:2;
  line-clamp:2;
  -webkit-box-orient:vertical;
  overflow:hidden;
}

@supports not (-webkit-line-clamp: 1) {
  .blog-scope .toc-card li { display:block;max-height:calc(2 * 1lh + 6px) }
}

.blog-scope .toc-card li::before { content:counter(toc) ". ";color:var(--muted) }
.blog-scope .toc-card li:hover { background:rgba(77,71,157,.06) }
.blog-scope .toc-card li.is-current {
  background:rgba(77,71,157,.12);
  box-shadow:inset 3px 0 0 var(--primary);
}
.blog-scope .toc-card li.is-current::before { color:var(--primary) }
/* Правка Serg 04.08.2026: жирність прибрано — плашки й палиці досить,
   а напівжирний рядок стрибав по ширині й ламав ритм списку. */
.blog-scope .toc-card li.is-current a { color:var(--ink) }

/* Якір не має ховатись під липкими смугами при переході зі змісту.
   ⚠️ Тут стояло глухе 96px — висота ОДНІЄЇ смуги. А їх дві: шапка сайту й
   стрічка категорій, і разом вони закінчуються на 105–134px залежно від
   ширини й висоти вікна. Тобто заголовок опинявся під стрічкою на будь-якому
   екрані, і першим під нею було видно вже текст розділу.
   Тримаємо одне число на всі ширини — те саме, на яке липнуть колонки
   (--art-sticky-top нижче), плюс 8px подиху. */
.blog-scope .article-col [id] { scroll-margin-top: calc(var(--art-sticky-top, 142px) + 8px) }

@media(max-width:900px) {
  /* на мобільному зміст іде НАД статтею — там згортати нема сенсу */
  .blog-scope .sidebar-col .toc-card ol { max-height:none;overflow:visible }
  .blog-scope .sidebar-col .toc-card::after { display:none }
}


/* ── ld-avatar.css ─────────────────────────────── */
/* ld-avatar.css — компонент з дизайн-системи liga-ds.
   Навіщо: блок 1.5 — аватар автора у футері картки; сторінка автора
   Джерело: liga-ds/src/lib/avatar/avatar.component.ts (styles: []).
   Компонент оголошений з ViewEncapsulation.None, тому це звичайний
   глобальний CSS на токенах — виноситься у ваніль без змін.
   ⛔ Значення тут не правити: усе через токени ДС + шар site-brand.css.

   Розмітка (класи з template ДС):
     • ld-avatar__img
   Модифікатори: ld-avatar--lg, ld-avatar--md, ld-avatar--sm, ld-avatar--square, ld-avatar--xl
*/

.blog-scope ld-avatar {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      flex: none;
      overflow: hidden;
      background-color: var(--cntnr-bg-third-default);
      color: var(--text-subtle);
      font-family: var(--liga-font-family);
      font-weight: 600;
      line-height: 1;
      border-radius: var(--cntnr-corner-infinity);
      user-select: none;
    }
    .blog-scope ld-avatar.ld-avatar--square { border-radius: var(--cntnr-corner-normal); }
    .blog-scope .ld-avatar__img { width: 100%; height: 100%; object-fit: cover; display: block; }
    .blog-scope ld-avatar.ld-avatar--sm { width: 24px; height: 24px; font-size: 11px; }
    .blog-scope ld-avatar.ld-avatar--md { width: 32px; height: 32px; font-size: 12px; }
    .blog-scope ld-avatar.ld-avatar--lg { width: 40px; height: 40px; font-size: 14px; }
    .blog-scope ld-avatar.ld-avatar--xl { width: 48px; height: 48px; font-size: 16px; }


/* ── ld-badge.css ─────────────────────────────── */
/* ld-badge.css — компонент з дизайн-системи liga-ds.
   Навіщо: блок 1.5 — бейдж категорії на картці
   Джерело: liga-ds/src/lib/badge/badge.component.ts (styles: []).
   Компонент оголошений з ViewEncapsulation.None, тому це звичайний
   глобальний CSS на токенах — виноситься у ваніль без змін.
   ⛔ Значення тут не правити: усе через токени ДС + шар site-brand.css.

   Модифікатори: ld-badge--dot, ld-badge--size-md, ld-badge--size-sm, ld-badge--solid, ld-badge--subtle, ld-badge--tone-danger, ld-badge--tone-info, ld-badge--tone-neutral, ld-badge--tone-primary, ld-badge--tone-success, ld-badge--tone-warning
*/

.blog-scope ld-badge {
      display: inline-flex;
      align-items: center;
      gap: var(--space-050);
      width: fit-content;
      font-family: var(--liga-font-family);
      border-radius: var(--cntnr-corner-infinity);
      white-space: nowrap;
      box-sizing: border-box;
    }
    .blog-scope ld-badge.ld-badge--size-sm {
      min-height: 18px;
      padding: 0 var(--space-075);
      font-size: 11px;
      line-height: 14px;
      font-weight: 600;
      letter-spacing: 0.18px;
    }
    .blog-scope ld-badge.ld-badge--size-md {
      min-height: 24px;
      padding: 0 var(--space-100);
      font-size: 12px;
      line-height: 15px;
      font-weight: 600;
      letter-spacing: 0.25px;
    }
    .blog-scope ld-badge.ld-badge--dot {
      width: 8px; height: 8px;
      min-height: 0; padding: 0;
      border-radius: var(--cntnr-corner-infinity);
    }

    /* solid */
    .blog-scope ld-badge.ld-badge--solid.ld-badge--tone-primary { background: var(--status-filled-primary);  color: var(--text-alternative); }
    .blog-scope ld-badge.ld-badge--solid.ld-badge--tone-success { background: var(--status-filled-positive); color: var(--text-alternative); }
    .blog-scope ld-badge.ld-badge--solid.ld-badge--tone-danger { background: var(--status-filled-negative); color: var(--text-alternative); }
    .blog-scope ld-badge.ld-badge--solid.ld-badge--tone-warning { background: var(--status-filled-warning);  color: var(--text-alternative); }
    .blog-scope ld-badge.ld-badge--solid.ld-badge--tone-info { background: var(--status-filled-blue);     color: var(--text-alternative); }
    .blog-scope ld-badge.ld-badge--solid.ld-badge--tone-neutral { background: var(--status-filled-passive);  color: var(--text-alternative); }

    /* subtle */
    .blog-scope ld-badge.ld-badge--subtle.ld-badge--tone-primary { background: var(--status-trasperent-primary);  color: var(--text-accent); }
    .blog-scope ld-badge.ld-badge--subtle.ld-badge--tone-success { background: var(--status-trasperent-positive); color: var(--text-success); }
    .blog-scope ld-badge.ld-badge--subtle.ld-badge--tone-danger { background: var(--status-trasperent-negative); color: var(--text-danger); }
    .blog-scope ld-badge.ld-badge--subtle.ld-badge--tone-warning { background: var(--status-trasperent-warning);  color: var(--text-warning); }
    .blog-scope ld-badge.ld-badge--subtle.ld-badge--tone-info { background: var(--status-trasperent-blue);     color: var(--text-information); }
    .blog-scope ld-badge.ld-badge--subtle.ld-badge--tone-neutral { background: var(--status-trasperent-passive);  color: var(--text-default); }


/* ── ld-breadcrumbs.css ─────────────────────────────── */
/* ld-breadcrumbs.css — компонент з дизайн-системи liga-ds.
   Навіщо: блок 1.2 — хлібні крихти на всіх внутрішніх сторінках
   Джерело: liga-ds/src/lib/breadcrumbs/breadcrumbs.component.ts (styles: []).
   Компонент оголошений з ViewEncapsulation.None, тому це звичайний
   глобальний CSS на токенах — виноситься у ваніль без змін.
   ⛔ Значення тут не правити: усе через токени ДС + шар site-brand.css.

   Розмітка (класи з template ДС):
     • ld-bc
     • ld-bc__item
     • ld-bc__item ld-bc__item--link
     • ld-bc__li
     • ld-bc__list
     • ld-bc__sep
*/

.blog-scope .ld-bc { font-family: var(--liga-font-family); }
    .blog-scope .ld-bc__list { display: flex; flex-wrap: wrap; align-items: center; margin: 0; padding: 0; list-style: none; }
    .blog-scope .ld-bc__li { display: inline-flex; align-items: center; }
    .blog-scope .ld-bc__item { display: inline-flex; align-items: center; gap: var(--space-075); font-size: 14px; line-height: 20px; font-weight: 500; letter-spacing: 0.15px; border-radius: var(--cntnr-corner-small, 6px); color: var(--text-subtle); text-decoration: none; }
    .blog-scope .ld-bc__item--link { color: var(--link-default); cursor: pointer; transition: color 160ms ease; }
    .blog-scope .ld-bc__item--link:hover { color: var(--text-click); text-decoration: underline; }
    .blog-scope .ld-bc__item--link:focus-visible { outline: 2px solid var(--color-primary-500); outline-offset: 2px; }
    .blog-scope .ld-bc__item--current { color: var(--text-default); font-weight: 600; }
    .blog-scope .ld-bc__sep { display: inline-flex; align-items: center; justify-content: center; margin: 0 var(--space-075); color: var(--icon-subtlest); }
    .blog-scope .ld-bc__sep svg { display: block; }


/* ── ld-checkbox.css ─────────────────────────────── */
/* ld-checkbox.css — компонент з дизайн-системи liga-ds.
   Навіщо: блок 1.9 — чекбокс згоди + опційний дайджест
   Джерело: liga-ds/src/lib/checkbox/checkbox.component.ts (styles: []).
   Компонент оголошений з ViewEncapsulation.None, тому це звичайний
   глобальний CSS на токенах — виноситься у ваніль без змін.
   ⛔ Значення тут не правити: усе через токени ДС + шар site-brand.css.

   Розмітка (класи з template ДС):
     • ld-checkbox
     • ld-checkbox__box
     • ld-checkbox__check
     • ld-checkbox__dash
     • ld-checkbox__input
     • ld-checkbox__label
   Модифікатори: ld-checkbox--disabled
*/

.blog-scope .ld-checkbox {
      display: inline-flex; align-items: center; gap: var(--space-100);
      cursor: pointer; font-family: var(--liga-font-family);
    }
    .blog-scope .ld-checkbox--disabled { cursor: not-allowed; }
    .blog-scope .ld-checkbox__input {
      position: absolute; width: 1px; height: 1px;
      margin: 0; padding: 0; opacity: 0; white-space: nowrap;
    }
    .blog-scope .ld-checkbox__box {
      position: relative; flex: none;
      width: 16px; height: 16px;
      display: inline-flex; align-items: center; justify-content: center;
      border-radius: var(--checkbox-corner-checkbox-corner);
      background-color: var(--cntnr-bg-primary-default);
      border: 1px solid var(--color-neutral-solid-500);
      color: var(--icon-alternative-active);
      transition: background-color 160ms ease, border-color 160ms ease;
    }
    .blog-scope .ld-checkbox:hover .ld-checkbox__input:not(:disabled):not(:checked):not(:indeterminate) ~ .ld-checkbox__box {
      border-color: var(--checkbox-color-hover-checkbox);
    }
    .blog-scope .ld-checkbox__input:checked ~ .ld-checkbox__box,

    .blog-scope .ld-checkbox__input:indeterminate ~ .ld-checkbox__box {
      background-color: var(--checkbox-color-default-checkbox);
      border-color: var(--checkbox-color-default-checkbox);
    }
    .blog-scope .ld-checkbox__input:focus-visible ~ .ld-checkbox__box { outline: 2px solid var(--color-primary-500); outline-offset: 2px; }
    .blog-scope .ld-checkbox__input:disabled ~ .ld-checkbox__box { background-color: var(--cntnr-bg-primary-default); border-color: var(--cntnr-border-disabled); }
    .blog-scope .ld-checkbox__input:disabled:checked ~ .ld-checkbox__box,

    .blog-scope .ld-checkbox__input:disabled:indeterminate ~ .ld-checkbox__box {
      background-color: var(--btn-bg-primary-disable); border-color: var(--btn-bg-primary-disable);
    }
    .blog-scope .ld-checkbox__check,
 .blog-scope .ld-checkbox__dash { display: none; }
    .blog-scope .ld-checkbox__check { width: 11px; height: 8px; }
    .blog-scope .ld-checkbox__dash { width: 9px; height: 2px; border-radius: 1px; background-color: currentColor; }
    .blog-scope .ld-checkbox__input:checked:not(:indeterminate) ~ .ld-checkbox__box .ld-checkbox__check { display: block; }
    .blog-scope .ld-checkbox__input:indeterminate ~ .ld-checkbox__box .ld-checkbox__dash { display: block; }
    .blog-scope .ld-checkbox__label { color: var(--text-default); }
    .blog-scope .ld-checkbox__input:disabled ~ .ld-checkbox__label { color: var(--text-disabled); }


/* ── ld-chip.css ─────────────────────────────── */
/* ld-chip.css — компонент з дизайн-системи liga-ds.
   Навіщо: блок 1.4 — чіпси тегів у фільтрах; хмара тегів 1.8
   Джерело: liga-ds/src/lib/chip/chip.component.ts (styles: []).
   Компонент оголошений з ViewEncapsulation.None, тому це звичайний
   глобальний CSS на токенах — виноситься у ваніль без змін.
   ⛔ Значення тут не правити: усе через токени ДС + шар site-brand.css.

   Розмітка (класи з template ДС):
     • ld-chip
     • ld-chip__icon
   Модифікатори: ld-chip--size-md, ld-chip--size-sm, ld-chip--solid, ld-chip--subtle, ld-chip--tone-danger, ld-chip--tone-info, ld-chip--tone-neutral, ld-chip--tone-primary, ld-chip--tone-success, ld-chip--tone-warning
*/

.blog-scope .ld-chip {
      display: inline-flex; align-items: center; gap: var(--space-050);
      width: fit-content; font-family: var(--liga-font-family);
      border-radius: var(--cntnr-corner-infinity); white-space: nowrap; box-sizing: border-box;
      border: 1px solid transparent; cursor: pointer;
      transition: background-color 160ms ease, border-color 160ms ease, filter 120ms ease;
    }
    .blog-scope .ld-chip--size-sm { min-height: 18px; padding: 0 var(--space-075); font-size: 11px; line-height: 14px; font-weight: 600; letter-spacing: 0.18px; }
    .blog-scope .ld-chip--size-md { min-height: 24px; padding: 0 var(--space-100); font-size: 12px; line-height: 15px; font-weight: 600; letter-spacing: 0.25px; }
    .blog-scope .ld-chip:hover:not(:disabled) { filter: brightness(0.97); }
    .blog-scope .ld-chip:focus-visible { outline: 2px solid var(--color-primary-500); outline-offset: 2px; }
    .blog-scope .ld-chip:disabled { cursor: not-allowed; opacity: 0.5; }

    /* subtle (off) */
    .blog-scope .ld-chip--subtle.ld-chip--tone-primary { background: var(--status-trasperent-primary);  color: var(--text-accent); }
    .blog-scope .ld-chip--subtle.ld-chip--tone-success { background: var(--status-trasperent-positive); color: var(--text-success); }
    .blog-scope .ld-chip--subtle.ld-chip--tone-danger { background: var(--status-trasperent-negative); color: var(--text-danger); }
    .blog-scope .ld-chip--subtle.ld-chip--tone-warning { background: var(--status-trasperent-warning);  color: var(--text-warning); }
    .blog-scope .ld-chip--subtle.ld-chip--tone-info { background: var(--status-trasperent-blue);     color: var(--text-information); }
    .blog-scope .ld-chip--subtle.ld-chip--tone-neutral { background: var(--status-trasperent-passive);  color: var(--text-default); }
    /* solid (selected) */
    .blog-scope .ld-chip--solid.ld-chip--tone-primary { background: var(--status-filled-primary);  color: var(--text-alternative); }
    .blog-scope .ld-chip--solid.ld-chip--tone-success { background: var(--status-filled-positive); color: var(--text-alternative); }
    .blog-scope .ld-chip--solid.ld-chip--tone-danger { background: var(--status-filled-negative); color: var(--text-alternative); }
    .blog-scope .ld-chip--solid.ld-chip--tone-warning { background: var(--status-filled-warning);  color: var(--text-alternative); }
    .blog-scope .ld-chip--solid.ld-chip--tone-info { background: var(--status-filled-blue);     color: var(--text-alternative); }
    .blog-scope .ld-chip--solid.ld-chip--tone-neutral { background: var(--status-filled-passive);  color: var(--text-alternative); }

    .blog-scope .ld-chip__icon { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 14px; height: 14px; }
    .blog-scope .ld-chip__icon svg { width: 100%; height: 100%; display: block; }


/* ── ld-field.css ─────────────────────────────── */
/* ld-field.css — компонент з дизайн-системи liga-ds.
   Навіщо: блок 1.9 — обгортка поля підписки
   Джерело: liga-ds/src/lib/field/field.component.ts (styles: []).
   Компонент оголошений з ViewEncapsulation.None, тому це звичайний
   глобальний CSS на токенах — виноситься у ваніль без змін.
   ⛔ Значення тут не правити: усе через токени ДС + шар site-brand.css.

   Розмітка (класи з template ДС):
     • ld-field__desc
     • ld-field__error
     • ld-field__label
     • ld-field__required
*/

.blog-scope ld-field {
      display: flex;
      flex-direction: column;
      gap: var(--space-075);
      font-family: var(--liga-font-family);
    }
    .blog-scope .ld-field__label { color: var(--text-default); font-size: 14px; font-weight: 600; line-height: 16px; letter-spacing: 0.15px; cursor: default; }
    .blog-scope .ld-field__required { color: var(--text-danger); }
    .blog-scope .ld-field__desc { color: var(--text-subtle); font-size: 12px; line-height: 16px; }
    .blog-scope .ld-field__error { color: var(--text-danger); font-size: 12px; line-height: 16px; }


/* ── ld-input.css ─────────────────────────────── */
/* ld-input.css — компонент з дизайн-системи liga-ds.
   Навіщо: блок 1.9 — email підписки; 1.x — пошук по блогу
   Джерело: liga-ds/src/lib/input/input.component.ts (styles: []).
   Компонент оголошений з ViewEncapsulation.None, тому це звичайний
   глобальний CSS на токенах — виноситься у ваніль без змін.
   ⛔ Значення тут не правити: усе через токени ДС + шар site-brand.css.

   Розмітка (класи з template ДС):
     • ld-input__field
     • ld-input__icon
   Модифікатори: ld-input--size-lg, ld-input--size-md, ld-input--size-sm, ld-input--size-xl
*/

.blog-scope ld-input {
      display: inline-flex;
      align-items: center;
      gap: var(--space-100);
      box-sizing: border-box;
      width: 100%;
      background-color: var(--cntnr-bg-primary-default);
      border: 1px solid var(--cntnr-border-default);
      border-radius: var(--field-corner-field-corner);
      color: var(--text-default);
      transition: border-color 200ms ease, box-shadow 200ms ease;
    }
    .blog-scope ld-input:hover:not([data-disabled]):not([data-readonly]):not([data-invalid]) { border-color: var(--cntnr-border-hover); }
    .blog-scope ld-input:focus-within:not([data-disabled]) { border-color: var(--cntnr-border-active); box-shadow: 0 0 0 3px var(--color-primary-100); }
    .blog-scope ld-input[data-invalid] { border-color: var(--cntnr-border-error); }
    .blog-scope ld-input[data-invalid]:focus-within { box-shadow: 0 0 0 3px var(--color-other-colors-red-100); }
    .blog-scope ld-input[data-readonly] { background-color: var(--cntnr-bg-secondary-default); }
    .blog-scope ld-input[data-disabled] { background-color: var(--cntnr-bg-other-readonly-elements); border-color: var(--cntnr-border-disabled); color: var(--text-disabled); cursor: not-allowed; }

    .blog-scope ld-input.ld-input--size-sm { height: 24px; padding: 0 var(--space-100); }
    .blog-scope ld-input.ld-input--size-md { height: 32px; padding: 0 var(--space-150); }
    .blog-scope ld-input.ld-input--size-lg { height: 40px; padding: 0 var(--space-200); }
    .blog-scope ld-input.ld-input--size-xl { height: 48px; padding: 0 var(--space-200); }

    .blog-scope .ld-input__field {
      flex: 1 1 auto; min-width: 0; width: 100%;
      margin: 0; border: none; outline: none; background: transparent;
      font-family: var(--liga-font-family); font-size: 14px; line-height: 16px;
      letter-spacing: 0.29px; font-weight: 400; color: inherit; padding: 0;
    }
    .blog-scope .ld-input__field::placeholder { color: var(--text-subtlest); opacity: 1; }
    .blog-scope .ld-input__field:disabled { cursor: not-allowed; color: var(--text-disabled); -webkit-text-fill-color: var(--text-disabled); }

    .blog-scope .ld-input__icon {
      display: inline-flex; align-items: center; justify-content: center;
      flex: none; color: var(--icon-subtle);
    }
    .blog-scope .ld-input__icon svg { width: 100%; height: 100%; display: block; }
    .blog-scope ld-input.ld-input--size-sm .ld-input__icon { width: 16px; height: 16px; }
    .blog-scope ld-input.ld-input--size-md .ld-input__icon { width: 18px; height: 18px; }
    .blog-scope ld-input.ld-input--size-lg .ld-input__icon,

    .blog-scope ld-input.ld-input--size-xl .ld-input__icon { width: 20px; height: 20px; }


/* ── ld-modal.css ─────────────────────────────── */
/* ld-modal.css — компонент з дизайн-системи liga-ds.
   Навіщо: розділ 6 — модалка лід-форми
   Джерело: liga-ds/src/lib/modal/modal.component.ts (styles: []).
   Компонент оголошений з ViewEncapsulation.None, тому це звичайний
   глобальний CSS на токенах — виноситься у ваніль без змін.
   ⛔ Значення тут не правити: усе через токени ДС + шар site-brand.css.

   Розмітка (класи з template ДС):
     • ld-modal
     • ld-modal__close
     • ld-modal__desc
     • ld-modal__title
*/

.blog-scope .ld-modal {
      position: relative;
      width: 100%;
      max-width: 480px;
      max-height: calc(100vh - 64px);
      overflow: auto;
      padding: var(--space-400);
      background-color: var(--cntnr-bg-primary-default);
      border-radius: var(--cntnr-corner-large);
      box-shadow: 0 20px 60px rgb(15 23 42 / 0.25);
      color: var(--text-default);
      font-family: var(--liga-font-family);
      outline: none;
    }
    .blog-scope .ld-modal__title {
      margin: 0 var(--space-600) var(--space-100) 0;
      font-size: 20px; line-height: 24px; font-weight: 600; color: var(--text-default);
    }
    .blog-scope .ld-modal__desc {
      margin: 0 0 var(--space-300);
      font-size: 14px; line-height: 20px; letter-spacing: 0.29px; color: var(--text-subtle);
    }
    .blog-scope .ld-modal__close {
      position: absolute; top: var(--space-200); right: var(--space-200);
      display: inline-flex; align-items: center; justify-content: center;
      width: 28px; height: 28px; padding: 0;
      border: none; background: transparent;
      color: var(--icon-subtle); border-radius: var(--cntnr-corner-infinity);
      cursor: pointer; transition: background-color 120ms ease, color 120ms ease;
    }
    .blog-scope .ld-modal__close:hover { background-color: var(--cntnr-bg-third-hover); color: var(--icon-default); }
    .blog-scope .ld-modal__close:focus-visible { outline: 2px solid var(--color-primary-500); outline-offset: 2px; }
    .blog-scope .ld-modal__close svg { width: 14px; height: 14px; display: block; }
  
    .blog-scope .cdk-overlay-backdrop.ld-modal-backdrop {
      background-color: var(--blanket-popup-background, rgb(0 0 0 / 0.5));
    }


/* ── ld-pagination.css ─────────────────────────────── */
/* ld-pagination.css — компонент з дизайн-системи liga-ds.
   Навіщо: блок 1.6 — посторінкова навігація ?page=N
   Джерело: liga-ds/src/lib/pagination/pagination.component.ts (styles: []).
   Компонент оголошений з ViewEncapsulation.None, тому це звичайний
   глобальний CSS на токенах — виноситься у ваніль без змін.
   ⛔ Значення тут не правити: усе через токени ДС + шар site-brand.css.

   Розмітка (класи з template ДС):
     • ld-pag
     • ld-pag__ellipsis
     • ld-pag__item
     • ld-pag__item ld-pag__arrow
     • ld-pag__list
*/

.blog-scope .ld-pag { font-family: var(--liga-font-family); }
    .blog-scope .ld-pag__list { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-050); margin: 0; padding: 0; list-style: none; }
    .blog-scope .ld-pag__item {
      appearance: none; border: none; background: transparent; cursor: pointer;
      display: inline-flex; align-items: center; justify-content: center;
      box-sizing: border-box; min-width: 36px; height: 36px; padding: 0 var(--space-075);
      border-radius: var(--corner-radius-infinity);
      font-family: inherit; font-size: 14px; line-height: 1; font-weight: 500;
      color: var(--text-default); transition: background-color 160ms ease, color 160ms ease;
    }
    .blog-scope .ld-pag__list[data-size='sm'] .ld-pag__item { min-width: 28px; height: 28px; font-size: 13px; }
    .blog-scope .ld-pag__item:hover:not(:disabled):not(.ld-pag__item--selected) { background-color: var(--color-primary-100); color: var(--text-accent); }
    .blog-scope .ld-pag__item:focus-visible { outline: 2px solid var(--color-primary-500); outline-offset: 2px; }
    .blog-scope .ld-pag__item:disabled { cursor: not-allowed; color: var(--text-disabled); }
    .blog-scope .ld-pag__item--selected { background-color: var(--btn-bg-primary-active); color: var(--text-alternative); }
    .blog-scope .ld-pag__arrow { color: var(--icon-subtle); padding: 0; }
    .blog-scope .ld-pag__arrow:hover:not(:disabled) { background-color: var(--color-primary-100); color: var(--text-accent); }
    .blog-scope .ld-pag__arrow:disabled { color: var(--icon-disabled); background: transparent; }
    .blog-scope .ld-pag__arrow svg { display: block; }
    .blog-scope .ld-pag__ellipsis { display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box; min-width: 36px; height: 36px; color: var(--text-subtle); user-select: none; }
    .blog-scope .ld-pag__list[data-size='sm'] .ld-pag__ellipsis { min-width: 28px; height: 28px; }


/* ── ld-tabs.css ─────────────────────────────── */
/* ld-tabs.css — компонент з дизайн-системи liga-ds.
   Навіщо: блок 1.4 — таби сортування (Нові / Найпопулярніші / У тренді)
   Джерело: liga-ds/src/lib/tabs/tabs.component.ts (styles: []).
   Компонент оголошений з ViewEncapsulation.None, тому це звичайний
   глобальний CSS на токенах — виноситься у ваніль без змін.
   ⛔ Значення тут не правити: усе через токени ДС + шар site-brand.css.

   Розмітка (класи з template ДС):
     • ld-tab-panel
     • ld-tabs__count
     • ld-tabs__list
     • ld-tabs__tab
*/

.blog-scope .ld-tab-panel { margin-top: var(--space-300); color: var(--text-default); font-family: var(--liga-font-family); } .blog-scope .ld-tab-panel:focus-visible { outline: 2px solid var(--color-primary-500); outline-offset: 2px; border-radius: var(--cntnr-corner-small); }
    .blog-scope .ld-tabs__list {
      display: inline-flex; align-items: center; gap: var(--space-050);
      font-family: var(--liga-font-family);
    }
    .blog-scope .ld-tabs__list[data-variant='underline'] { gap: var(--space-100); border-bottom: 1px solid var(--divider-divider); }
    .blog-scope .ld-tabs__list[data-orientation='vertical'] { flex-direction: column; align-items: stretch; }
    .blog-scope .ld-tabs__list[data-orientation='vertical'][data-variant='underline'] { border-bottom: none; border-inline-start: 1px solid var(--divider-divider); }

    .blog-scope .ld-tabs__tab {
      appearance: none; border: none; background: transparent; cursor: pointer;
      display: inline-flex; align-items: center; gap: var(--space-100);
      font-family: inherit; font-size: 14px; line-height: 16px; font-weight: 500; letter-spacing: 0.15px;
      color: var(--text-subtle); white-space: nowrap;
      transition: background-color 160ms ease, color 160ms ease, box-shadow 160ms ease, border-color 160ms ease;
    }
    .blog-scope .ld-tabs__tab[data-size='sm'] { font-size: 13px; gap: var(--space-075); }
    .blog-scope .ld-tabs__tab:disabled { color: var(--text-disabled); cursor: not-allowed; }
    .blog-scope .ld-tabs__tab:focus-visible { outline: 2px solid var(--color-primary-500); outline-offset: 2px; }

    /* pill */
    .blog-scope .ld-tabs__tab[data-variant='pill'] { border-radius: var(--tabs-corner-tabs-corner); padding: var(--space-100) var(--space-200); }
    .blog-scope .ld-tabs__tab[data-variant='pill'][data-size='sm'] { padding: var(--space-075) var(--space-150); }
    .blog-scope .ld-tabs__tab[data-variant='pill']:hover:not(:disabled):not([data-selected]) { background-color: var(--color-primary-100); color: var(--text-default); }
    .blog-scope .ld-tabs__tab[data-variant='pill'][data-selected] { background-color: var(--btn-bg-primary-active); color: var(--text-alternative); }
    .blog-scope .ld-tabs__tab[data-variant='pill'][data-selected] .ld-tabs__count { background-color: rgb(255 255 255 / 0.22); color: var(--text-alternative); }

    /* underline */
    .blog-scope .ld-tabs__tab[data-variant='underline'] { padding: var(--space-100) var(--space-100); border-radius: var(--cntnr-corner-small, 6px) var(--cntnr-corner-small, 6px) 0 0; border-bottom: 2px solid transparent; margin-bottom: -1px; }
    .blog-scope .ld-tabs__tab[data-variant='underline'][data-size='sm'] { padding: var(--space-075) var(--space-100); }
    .blog-scope .ld-tabs__tab[data-variant='underline']:hover:not(:disabled):not([data-selected]) { color: var(--text-default); }
    .blog-scope .ld-tabs__tab[data-variant='underline'][data-selected] { color: var(--text-active); border-bottom-color: var(--color-primary-500); }
    .blog-scope .ld-tabs__tab[data-variant='underline'][data-selected] .ld-tabs__count { background-color: var(--color-primary-100); color: var(--text-accent); }

    .blog-scope .ld-tabs__count {
      display: inline-flex; align-items: center; justify-content: center;
      min-width: 20px; height: 20px; padding: 0 var(--space-075);
      border-radius: var(--corner-radius-infinity);
      background-color: var(--color-primary-100); color: var(--text-default);
      font-size: 12px; line-height: 1; font-weight: 600;
    }


/* ── ld-tag.css ─────────────────────────────── */
/* ld-tag.css — компонент з дизайн-системи liga-ds.
   Навіщо: блок 1.8 — теги
   Джерело: liga-ds/src/lib/tag/tag.component.ts (styles: []).
   Компонент оголошений з ViewEncapsulation.None, тому це звичайний
   глобальний CSS на токенах — виноситься у ваніль без змін.
   ⛔ Значення тут не правити: усе через токени ДС + шар site-brand.css.

   Розмітка (класи з template ДС):
     • ld-tag__icon
     • ld-tag__remove
   Модифікатори: ld-tag--size-md, ld-tag--size-sm, ld-tag--solid, ld-tag--subtle, ld-tag--tone-danger, ld-tag--tone-info, ld-tag--tone-neutral, ld-tag--tone-primary, ld-tag--tone-success, ld-tag--tone-warning
*/

.blog-scope ld-tag {
      display: inline-flex; align-items: center; gap: var(--space-050);
      width: fit-content; font-family: var(--liga-font-family);
      border-radius: var(--cntnr-corner-infinity); white-space: nowrap; box-sizing: border-box;
    }
    .blog-scope ld-tag.ld-tag--size-sm { min-height: 18px; padding: 0 var(--space-075); font-size: 11px; line-height: 14px; font-weight: 600; letter-spacing: 0.18px; }
    .blog-scope ld-tag.ld-tag--size-md { min-height: 24px; padding: 0 var(--space-100); font-size: 12px; line-height: 15px; font-weight: 600; letter-spacing: 0.25px; }

    .blog-scope ld-tag.ld-tag--solid.ld-tag--tone-primary { background: var(--status-filled-primary);  color: var(--text-alternative); }
    .blog-scope ld-tag.ld-tag--solid.ld-tag--tone-success { background: var(--status-filled-positive); color: var(--text-alternative); }
    .blog-scope ld-tag.ld-tag--solid.ld-tag--tone-danger { background: var(--status-filled-negative); color: var(--text-alternative); }
    .blog-scope ld-tag.ld-tag--solid.ld-tag--tone-warning { background: var(--status-filled-warning);  color: var(--text-alternative); }
    .blog-scope ld-tag.ld-tag--solid.ld-tag--tone-info { background: var(--status-filled-blue);     color: var(--text-alternative); }
    .blog-scope ld-tag.ld-tag--solid.ld-tag--tone-neutral { background: var(--status-filled-passive);  color: var(--text-alternative); }
    .blog-scope ld-tag.ld-tag--subtle.ld-tag--tone-primary { background: var(--status-trasperent-primary);  color: var(--text-accent); }
    .blog-scope ld-tag.ld-tag--subtle.ld-tag--tone-success { background: var(--status-trasperent-positive); color: var(--text-success); }
    .blog-scope ld-tag.ld-tag--subtle.ld-tag--tone-danger { background: var(--status-trasperent-negative); color: var(--text-danger); }
    .blog-scope ld-tag.ld-tag--subtle.ld-tag--tone-warning { background: var(--status-trasperent-warning);  color: var(--text-warning); }
    .blog-scope ld-tag.ld-tag--subtle.ld-tag--tone-info { background: var(--status-trasperent-blue);     color: var(--text-information); }
    .blog-scope ld-tag.ld-tag--subtle.ld-tag--tone-neutral { background: var(--status-trasperent-passive);  color: var(--text-default); }

    .blog-scope .ld-tag__icon { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 14px; height: 14px; }
    .blog-scope .ld-tag__icon svg { width: 100%; height: 100%; display: block; }
    .blog-scope .ld-tag__remove {
      display: inline-flex; align-items: center; justify-content: center;
      flex: none; width: 16px; height: 16px;
      margin-inline-start: 2px; margin-inline-end: -4px;
      padding: 0; border: none; background: transparent; color: inherit;
      border-radius: var(--cntnr-corner-infinity); cursor: pointer; opacity: 0.65;
      transition: opacity 120ms ease, background-color 120ms ease;
    }
    .blog-scope .ld-tag__remove:hover { opacity: 1; background-color: var(--color-neutral-alpha-200); }
    .blog-scope .ld-tag__remove:focus-visible { outline: 2px solid currentColor; outline-offset: 1px; opacity: 1; }
    .blog-scope .ld-tag__remove svg { width: 10px; height: 10px; display: block; }


/* ── review-fixes.css ─────────────────────────────── */
/* review-fixes.css — точкові правки за коментарями дизайнера (Serg, 03.08.2026).

   Навіщо окремий файл, а не правка в блоках:
   • частина блоків ГЕНЕРУЄТЬСЯ (build-blocks.py) — правка там зникне при
     наступному прогоні;
   • решта — це РОЗМІРИ компонентів ДС у контексті конкретної сторінки. Розмір
     компонента задає дизайн-система, але наскільки він великий саме в цьому
     блоці — рішення композиції. Тримаємо всі такі рішення в одному місці, щоб
     їх було видно й легко відкотити, а не розмазаними по десятку файлів.

   ⚠️ Сюди НЕ можна класти вигляд компонента (колір, форму, стани) — це
   власність liga-ds. Тільки габарити в контексті й дрібна розкладка.

   Підключається ОСТАННІМ (після ld-*.css та icons.css) — див. distribute.py.
*/

/* ── Аватар автора ────────────────────────────────────────────────────────
   «Зробив би аватарку трохи більшою». У шкалі ДС максимум ld-avatar--xl = 48px,
   для великої картки автора замало. */
.blog-scope .author-card ld-avatar.ld-avatar--xl,

.blog-scope .author-hero ld-avatar.ld-avatar--xl { width: 80px; height: 80px; font-size: 26px; }

/* ── Фільтри-чіпси на сторінці категорії ──────────────────────────────────
   «Давай по висоті зробимо ці теги сорок». У ДС chip--size-md = 24px: це
   компактний фільтр для щільних таблиць, а тут він головний елемент секції. */
/* Кнопка «Ще теги» бере рівно ту саму геометрію, що й чипи — одним
   правилом, а не копією чисел: інакше вони роз'їдуться при першій же
   правці розміру чипа (локальний коментар Serg 12.08.2026:
   «хай кнопка буде в стилі як самі теги і влазить у рядок»). */
.blog-scope .chips .ld-chip,

.blog-scope .chips .chips-more { height: 40px; padding-inline: var(--space-200); font-size: var(--typo-sizes-h300); }

/* ── Плашки в шапці статті ────────────────────────────────────────────────
   «Ці теги побільше — сороковими, мабуть, або тридцять другими».
   Взято 32: плашки стоять В ОДИН РЯДОК з датою, і 40 вже переважували б
   заголовок. Якщо треба 40 — це одне число нижче.
   «А дату змістимо вправо» — margin-left:auto відтискає її та все, що після
   неї, до правого краю рядка. */
.blog-scope .article-meta ld-badge,

.blog-scope .article-meta ld-tag { height: 32px; padding-inline: var(--space-150); font-size: var(--typo-sizes-h300); }
.blog-scope .article-meta .meta-date { margin-left: auto; }
.blog-scope .article-meta .meta-sep { display: none; }   /* крапка-роздільник зайва, коли є відступ */

/* ── Іконки ризиків — червоні ─────────────────────────────────────────────
   «Давайте іконки зробимо червоного кольору». Іконка бере колір з тексту
   (currentColor), тому фарбуємо саме її, а не весь рядок. */
.blog-scope .risk-item .ic--risk { color: var(--text-danger); }

/* ── Кнопки на всю ширину блока ───────────────────────────────────────────
   «Зроби кнопку на всю ширину, як і нижня» / «кнопку на всю ширину блока».
   Причина, чому вони були вужчі: це <button>, а у form-control ширина auto
   рахується як shrink-to-fit, тож display:block сам по собі не розтягує. */
.blog-scope .checklist-cta .btn-primary,

.blog-scope .btn-sb-primary,

.blog-scope .btn-sb-secondary { width: 100%; }

/* ── Фінальний CTA: орнамент із Figma ─────────────────────────────────────
   «Для цього блока на всіх сторінках треба зробити прикольний бекграунд…
   давай я тобі додам орнамент» + посилання на Figma.
   Джерело: SEO catalogs L360 → node 5029:107601 «Container», група «Flowers».
   Витягнуто через Desktop Bridge (exportAsync SVG) — не перемальовано, це
   ті самі вектори. Градієнт підкладки теж із того вузла:
   білий → #E5E2FF (50%) → білий, горизонтально.
   Орнамент декоративний → у ::before, поза потоком і поза доступністю. */
.blog-scope .cta-final {
  position: relative;
  overflow: hidden;
  background: linear-gradient(90deg, #ffffff 0%, #e5e2ff 50%, #ffffff 100%);
}
.blog-scope .cta-final::before {
  content: '';
  position: absolute;
  inset: 0;
  /* SVG уже обрізаний по кадру Figma (1134×260) — тягнемо його `cover`, щоб
     товщина ліній лишалась близькою до оригіналу на будь-якій ширині блока */
  background: url('/assets/img/blog/ornament-flowers.svg') center / cover no-repeat;
  pointer-events: none;
}
.blog-scope .cta-final > * { position: relative; }   /* контент над орнаментом */

/* ── Активний пункт у мега-меню ───────────────────────────────────────────
   «Додати в блок Медіа посилання на блог і зробити його активним, ніби ми
   там знаходимось». Позначка активності — і візуальна, і машинна
   (aria-current="page" у розмітці). */
.blog-scope .mega-list .is-current {
  color: var(--site-accent);
  font-weight: 600;
}

/* ── Іконка ролі — в колір своєї картки ───────────────────────────────────
   «Кожна іконка має бути в колір своєї підкладки». Заголовок ролі вже фарбує
   прототип (.role-card.ceo .role-title тощо) — іконка бере той самий колір.
   Значення не дублюємо: `color: inherit` від .role-title не працює (іконка —
   сусід, не нащадок), тому перелічуємо ті самі п'ять кольорів. */
.blog-scope .role-card.ceo .role-ico { color: #E65100; }
.blog-scope .role-card.hr .role-ico { color: var(--green); }
.blog-scope .role-card.lawyer .role-ico { color: #1565C0; }
.blog-scope .role-card.accountant .role-ico { color: #7B1FA2; }
.blog-scope .role-card.military .role-ico { color: #455A64; }

/* ── Відступи, яких бракувало ─────────────────────────────────────────────
   «Між цими кнопками має бути паддинг, зараз вони впритул» — кнопки сайдбару
   стали блоками на всю ширину й злиплися.
   «Бракує паддинга між переглядами і кількістю коментарів» — обидва лічильники
   лежали в одному .stats без проміжку. */
.blog-scope .sidebar-cta .btn-sb-primary { margin-bottom: var(--space-150); }
.blog-scope .card-foot .stats,

.blog-scope .stats { display: inline-flex; align-items: center; gap: var(--space-200); }
.blog-scope .stats > * { display: inline-flex; align-items: center; gap: var(--space-075); }

/* ── Обгортка навколо табів ───────────────────────────────────────────────
   ⚠️ ЦЕ ВІДСТУП ВІД ДИЗАЙН-СИСТЕМИ, свідомий (рішення Serg, 03.08.2026).
   У liga-ds у tabs лише два варіанти: pill (голі пілюлі) і underline (лінія
   під групою). Заповненої підкладки навколо групи в бібліотеці немає — я
   перевірив компонент. Дизайнер попросив саме її: «навколо табів у нас є така
   обгортка, щоб було зрозуміло, що це не кнопочки, а таби».
   Тому малюємо сегментний контрол ТУТ, а не правкою ld-tabs.css: щоб було
   видно, що це блог-специфіка, і щоб оновлення бібліотеки її не затерло.
   Якщо такий контрол зʼявиться в ДС — цей блок треба зняти. */
.blog-scope .ld-tabs__list[data-variant='pill'] {
  background: var(--color-primary-100);
  border: 1px solid var(--cntnr-border-default);
  border-radius: var(--corner-radius-infinity);
  padding: var(--space-050);
  gap: var(--space-025);
}
.blog-scope .ld-tabs__list[data-variant='pill'] .ld-tabs__tab {
  height: 32px;
  /* ховер поверх підкладки має бути світлішим за неї, інакше «тоне» */
  --tabs-hover: var(--cntnr-bg-primary-default);
}
.blog-scope .ld-tabs__list[data-variant='pill'] .ld-tabs__tab:hover:not([data-selected]) {
  background: var(--tabs-hover);
}
/* Той самий сегментний контрол ДС у модалці ліда — розтягнутий на всю ширину
   трьома рівними частинами (як був кастомний .seg-toggle). Це лише розкладка
   в контексті модалки; вигляд сегмента лишається ДС-івським. */
.blog-scope .modal .ld-tabs__list[data-variant='pill'] { display: flex; margin-bottom: var(--space-200); }
.blog-scope .modal .ld-tabs__list[data-variant='pill'] .ld-tabs__tab { flex: 1; justify-content: center; }

/* ── Футер впритул до останнього блока ────────────────────────────────────
   «Між футером і блоком промо теж зʼявився паддинг, треба прибрати».
   Джерело — реальний CSS сайту: `.site-footer { margin-top: 64px }`. На
   ligazakon.net під футером зазвичай білий контент, і відступ там доречний.
   У блозі останній блок (CTA) має власний фон і градієнт, тож 64px читались
   як випадкова біла смуга. Прибираємо тільки тут, сам site-chrome.css
   лишається копією сайту байт-у-байт. */
.blog-scope .site-footer { margin-top: 0; }

/* ── Обкладинка в картці «Обране редакцією» ───────────────────────────────
   У блоці 5.1 картка має власну смугу .img (120px) — там була текстова
   заглушка «Hero-зображення», тепер справжня обкладинка. Кадруємо по
   заповненню, щоб висота смуги лишалась як у прототипі. */
.blog-scope .feat-card .img { padding: 0; overflow: hidden; }
.blog-scope .feat-card .img img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* ── Контраст другорядного тексту на КОЛЬОРОВИХ підкладках ────────────────
   «Тут текст треба трохи контрастніше, по дизайн-системі. І подивись суміжні
   блоки — може, і десь ще».
   Виміряно: --site-muted #6b6b80 на лавандовій #c2c7f8 дає 3.17 при нормі
   4.5; на зеленій 4.01, на рожевій 3.89 — усі нижче норми.
   Беремо СУСІДНІЙ токен ДС на крок темніше: --text-subtle #4b4b55 →
   5.26 / 6.64 / 6.45 відповідно. Свій колір не вигадуємо. */
.blog-scope .salary-badge .sl,

.blog-scope .salary-badge .ss,

.blog-scope .callout p,

.blog-scope .role-card p,

.blog-scope .mistake-item p,

.blog-scope .risk-item span,

.blog-scope .checklist-cta p { color: var(--text-subtle); }

/* Заголовок ролі кольоровий за задумом (кодує роль), але помаранчевий на
   кремовому давав 3.46. Затемнюємо ТОЙ САМИЙ колір домішкою чорнила —
   відтінок ролі лишається, контраст доходить до норми.
   ⚠️ Селектори повторюють специфічність прототипу (.role-card.ceo .role-title
   = 3 класи) — інакше його правило перемагає. І `currentColor` тут не годиться:
   у `color:` він означає УСПАДКОВАНИЙ колір, а не власний колір елемента. */
.blog-scope .role-card.ceo .role-title,
        .blog-scope .role-card.ceo .role-ico { color: color-mix(in srgb, #E65100 60%, var(--text-default)); }
.blog-scope .role-card.hr .role-title,
         .blog-scope .role-card.hr .role-ico { color: color-mix(in srgb, var(--green) 70%, var(--text-default)); }
.blog-scope .role-card.lawyer .role-title,
     .blog-scope .role-card.lawyer .role-ico { color: color-mix(in srgb, #1565C0 80%, var(--text-default)); }
.blog-scope .role-card.accountant .role-title,
 .blog-scope .role-card.accountant .role-ico { color: color-mix(in srgb, #7B1FA2 85%, var(--text-default)); }
.blog-scope .role-card.military .role-title,
   .blog-scope .role-card.military .role-ico { color: color-mix(in srgb, #455A64 75%, var(--text-default)); }

/* ── Шапка статті: розміри й проміжок ─────────────────────────────────────
   «Теги 32 по висоті, і гэп між ними 8 або 12». Висота вже 32 (вище),
   тут — проміжок 12px кроком ДС. */
.blog-scope .article-meta { gap: var(--space-150); }

/* ── Ховер на картках ─────────────────────────────────────────────────────
   «Хай бордер навколо стає більш фіолетовим». Колір — активна межа
   контейнера з ДС (--cntnr-border-active), не власний. */
.blog-scope .author-card,

.blog-scope article.card,

.blog-scope .art-related .article-card { transition: border-color .15s ease, transform .15s ease, box-shadow .15s ease; }
.blog-scope .author-card:hover,

.blog-scope article.card:hover,

.blog-scope .art-related .article-card:hover { border-color: var(--cntnr-border-active); }

/* ── Стрілки слайдера «Обране редакцією» ──────────────────────────────────
   «Ці маленькі іконки й кнопки треба по нашому стилю решти кнопок
   secondary». Беремо контурну кнопку сайту, у колі, з іконкою ДС. */
.blog-scope .slider-nav button {
  width: 40px; height: 40px; padding: 0;
  border: 1px solid var(--btn-main, var(--site-accent));
  border-radius: var(--corner-radius-infinity);
  background: transparent;
  color: var(--site-accent);
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer;
  transition: background-color .3s ease-out, border-color .3s ease-out, color .3s ease-out;
}
.blog-scope .slider-nav button:hover { background: var(--color-primary-100); border-color: var(--site-accent-hover); color: var(--site-accent-hover); }
.blog-scope .slider-nav .ic { font-size: 20px; }

/* ── Очищення поля пошуку ─────────────────────────────────────────────────
   «Хрестик має бути з наших іконок, а не якась ліва». Нативний хрестик
   WebKit малює сам браузер і перефарбувати його не можна — ховаємо його й
   ставимо власну кнопку з іконкою ДС.

   Правка Serg (03.08.2026): «іконка не з краю інпута, посунути ближче до
   правого краю». Раніше кнопка була `position:absolute` в самій `.searchbar`
   з `right:150px` — магічне число, підігнане під ширину кнопки «Знайти».
   Через це хрестик стояв усередині поля, а не при його краї, і будь-яка
   зміна ширини «Знайти» його зсувала. Тепер поле пошуку загорнуте у
   `.search-field`, і хрестик прив'язаний до ПРАВОГО КРАЮ САМОГО ІНПУТА
   (`right:16px`) — без магічних чисел і незалежно від кнопки поряд. */
.blog-scope .searchbar input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; appearance: none; }
.blog-scope .searchbar .search-field { flex: 1; position: relative; display: flex; }
.blog-scope .searchbar .search-field input { flex: 1; padding-right: 44px; }  /* місце під хрестик */
.blog-scope .searchbar .search-clear {
  position: absolute;
  right: 16px;                      /* при правому краї інпута */
  top: 50%; transform: translateY(-50%);
  border: 0; background: none; padding: var(--space-050);
  color: var(--text-subtle); cursor: pointer; line-height: 0;
}
.blog-scope .searchbar .search-clear:hover { color: var(--text-default); }
.blog-scope .searchbar .search-clear .ic { font-size: 18px; }

/* ── Поля форм — за дизайн-системою ───────────────────────────────────────
   «Потрібно, щоб поля в модалці були по дизайн-системі. Вони в нас круглі».
   Перевірено: у liga-ds радіус поля — --field-corner-field-corner (10000px),
   тобто повна пілюля; рамка --cntnr-border-default, активна --cntnr-border-active.
   Прототип у модалці мав 10px і власний фіолетовий фокус.
   Поля розсилки й пошуку вже були круглі — тепер уся форма однакова. */
/* :not([type="checkbox"]) — правила «поля модалки за ДС» писались під
   текстові поля: пілюля 10000px, min-height 48 і бічні падінги. Чекбокс під них
   потрапляв просто тому, що він теж input, і виходив прямокутником 34×16 із
   круглими краями. Його вигляд задає css/ld-checkbox.css. */
.blog-scope .field input:not([type="checkbox"]),

.blog-scope .field textarea,

.blog-scope .modal input:not([type="checkbox"]) {
  border-radius: var(--field-corner-field-corner);
  border: 1px solid var(--cntnr-border-default);
  min-height: 48px;                      /* ld-input--size-xl */
  padding: 0 var(--space-200);
  font-family: var(--site-font);
  font-size: var(--typo-sizes-h350);
  color: var(--text-default);
  background: var(--cntnr-bg-primary-default);
}
.blog-scope .field input:not([type="checkbox"]):focus,

.blog-scope .modal input:not([type="checkbox"]):focus {
  outline: none;
  border-color: var(--cntnr-border-active);
  box-shadow: 0 0 0 3px var(--color-primary-100);   /* фокус-кільце ДС */
}
.blog-scope .field input::placeholder,

.blog-scope .modal input::placeholder { color: var(--text-subtlest); }

/* ── Рев'ю #26 і #27 (11.08.2026): вирівнювання у блоці підписки ───────────
   #26 «Банер не рівний по осях, всі блоки текстів на різних висотах».
   Причина не в «різних висотах текстів», а в тому, що .nl-in — сітка з
   `align-items:center`: колонки центрувались ОДНА ВІДНОСНО ОДНОЇ, і оскільки
   ліва вища за праву (157px проти 128px), права з'їжджала вниз. Заміряно:
   заголовок починався на 29px від верху банера, поле вводу — на 44px.
   Ставимо `start` — обидві колонки починаються з однієї лінії. */
.blog-scope .nl-inline .nl-in,

.blog-scope .nl-in { align-items: start; }

/* #27 «чекбокс вирівняний по-різному для кожного пункту, краще за першим
   реченням». Причина — в компоненті ДС: `ld-checkbox` має `align-items:
   center`, і для дворядкового підпису бокс опинявся на 11px нижче першого
   рядка, а для однорядкового — на 1px. Звідси й «по-різному».
   Правимо ТІЛЬКИ в контексті сторінки (.nl-consent), а не сам компонент:
   для звичайного однорядкового чекбокса центрування коректне, і міняти
   його в ДС — не наше рішення. Питання до ДС записано в HANDOFF. */
.blog-scope .nl-consent.ld-checkbox { align-items: flex-start; }
/* 1px — оптична компенсація: бокс 18px проти рядка 16px, без зсуву він
   здається піднятим над текстом. */
.blog-scope .nl-consent.ld-checkbox .ld-checkbox__box { margin-top: 1px; }

/* ═══ РАУНД #3 · рев'ю Василя Баранця (31.08.2026) ══════════════════════════
   #30 «розвести ці блоки — cta залишаємо тут, table of content перенести в
   ліву частину екрану, зміст синхронізувати по розмірах з cta».
   #32 «для мобільної версії зміст статті ставимо під цим блоком (не стікі)».

   ⚠️ ШИРИНА — свідома ціна, а не недогляд. Три колонки в контейнер сайту
   (1160px) не влазять: при рівних бічних колонках по 308px на текст статті
   лишалось би 444px — вужче за сам сайдбар. Заміряно на живій сторінці.
   Рішення Serg 31.08.2026: розкладку СТАТТІ розширюємо до 1400px, а шапка,
   крихти й футер лишаються 1160 — стик між ними видно, і це прийнято.
   Ціляємось у той .wrap, що містить розкладку, а не у всі підряд.

   ⚠️ Поріг трьох колонок — 1400px, а не 1100, як було спочатку. Три колонки
   коштують 1400px контейнера (коментар вище), тому на 1100 вони просто не
   вміщались: заміряно на живій сторінці при вікні 1100px — зміст 308, CTA 308,
   а на сам текст лишалось 384px. Саме це й було в рев'ю: «1100px поле з
   контентом дуже вузьке, пропоную прибрати зміст статті і розширити блок з
   контентом». Тепер до 1400px колонок дві — текст і бічна картка (див.
   наступний блок). */
@media (min-width: 1400px) {
  .blog-scope .wrap:has(> .page-layout) { max-width: 1400px; }
  .blog-scope .page-layout { grid-template-columns: 308px minmax(0, 1fr) 308px; }

  /* ── Колонок стільки, скільки їх насправді ──────────────────────────────
     Зміст малюється лише коли він увімкнений і в тілі є заголовки, сайдбар —
     коли редактор поклав у нього блоки. А колонки були прописані намертво:
     без змісту стаття ставала в ПЕРШУ колонку — 308px тексту й порожнє
     праворуч (саме це й видно на скрині «прибрав зміст — дизайн кривий»).

     Заодно повертаємо контейнер на 1160px: розширення до 1400 було платою
     саме за ТРИ колонки (див. коментар вище). Без змісту плата не потрібна,
     і стик із шапкою та крихтами зникає.
     ⚠️ :has() не можна вкладати в :has(), тому дві перевірки стоять поруч:
     «цей .wrap тримає розкладку» і «змісту всередині немає». */
  .blog-scope .wrap:has(> .page-layout):not(:has(.toc-col)),
  .blog-scope .wrap:has(> .page-layout):not(:has(.sidebar-col)) { max-width: 1160px; }
  .blog-scope .page-layout:not(:has(.toc-col)) { grid-template-columns: minmax(0, 1fr) 308px; }
  .blog-scope .page-layout:not(:has(.sidebar-col)) { grid-template-columns: 308px minmax(0, 1fr); }
  .blog-scope .page-layout:not(:has(.toc-col)):not(:has(.sidebar-col)) { grid-template-columns: minmax(0, 1fr); }

  /* Без бічної картки колонка статті стає вдвічі ширшою за звичайну (заміряно:
     1020px замість 684), а такий рядок тексту вже не читається. Тримаємо
     ширину близькою до штатної; без ОБОХ карток ще й центруємо, бо ліворуч
     нічого не лишається. */
  .blog-scope .page-layout:not(:has(.toc-col)) .article-col,
  .blog-scope .page-layout:not(:has(.sidebar-col)) .article-col { max-width: 820px; }
  .blog-scope .page-layout:not(:has(.toc-col)):not(:has(.sidebar-col)) .article-col { margin: 0 auto; }

  /* Липкість тепер своя в кожної колонки: до цього зміст і CTA були одним
     елементом (.sidebar-col), і липнули разом. Верх той самий — 88px, тобто
     80px липкої шапки сайту + 8px подиху, щоб картки не торкались її межі. */
  .blog-scope .toc-col {
    position: sticky;
    top: 88px;
    align-self: start;
    /* мінус липка шапка (88) і нижня смуга CTA (~76) + подих: довгий зміст
       отримує власний скрол, а не вилазить за екран */
    max-height: calc(100vh - 88px - 76px - 16px);
    overflow-y: auto;
    overscroll-behavior: contain;   /* скрол списку не «пробиває» на сторінку */
    scrollbar-width: thin;
  }
  .blog-scope .toc-col .toc-card { margin-bottom: 0 }

  /* Картка змісту тримає висоту свого списку — і нічого понад те.
     Тут стояло `min-height: var(--art-aside-h, 508px)` — «дотягнути зміст до
     висоти CTA». Ціна виявилась більшою за користь: висоту колонки зверху
     обмежує вікно (max-height вище), і щойно 508px у нього не влазять,
     з'являється скрол — на змісті, який вміщався цілком. Заміряно на вікні
     720px: список 353px, картка примусово 508px, колонка 486px → скрол на
     дев'яти пунктах. Саме це й помітив менеджер («пунктів менше, ніж влізає
     в блок, але зʼявляється скрол»).
     Потрібна парність із CTA — задаємо її на обох картках однаковим числом,
     а не мінімумом на одній. */
}

/* 1100–1399px — дві колонки: текст і бічна картка CTA.
   Рішення з рев'ю: у цьому діапазоні зміст ЗАБИРАЄМО З БІЧНОЇ КОЛОНКИ, а
   ширину віддаємо тексту. Заміряно після правки (вікно 1100px): колонка статті
   780px замість 384px.
   Сам зміст не зникає — він стає карткою в потоці одразу під героєм, рівно як
   нижче 1100px (#32). Тобто навігація по статті є на всіх ширинах, змінюється
   лише її місце.
   Бічна картка лишається липкою — position:sticky вона має з базового правила
   .sidebar-col, а top/max-height їй далі задає блок із --art-sticky-top. */
@media (min-width: 1100px) and (max-width: 1399.98px) {
  /* ⚠️ Колонка в сітці ОДНА явна, друга — неявна, і це не хитрість заради
     хитрості. Щоб покласти зміст між героєм і тілом статті, .article-col має
     стати display:contents — інакше герой і тіло лишаються одним боксом, і
     вклинити між них сусідній <aside> нема куди. А щойно колонка «розчинилась»,
     її блоки стають елементами сітки — і розкидати їх по колонках поштучно вже
     не вийде: герой приїжджає всередині обгортки включення (.include-host, яка
     теж display:contents), тож селектор `.article-col > *` ловить обгортку, а
     не той елемент, що реально лежить у сітці.
     Тому робимо навпаки: явна колонка одна, і автопозиціонуванню просто нема
     куди відхилитись — усі блоки статті лягають у неї. Другу колонку створює
     сам сайдбар своїм grid-column: 2, а ширину їй задає grid-auto-columns.

     minmax(0, 1fr), а не 1fr: інакше широка дитина (таблиця, довгий рядок
     коду) роздуває колонку понад контейнер — та сама причина, що й у
     .callout-grid. */
  .blog-scope .page-layout {
    grid-template-columns: minmax(0, 1fr);
    grid-auto-columns: 308px;
    /* ⚠️ Рядки — це блоки статті, і відступ між ними задає --art-block-gap.
       Базовий `gap: 28px` тут довелось розчепити: у сітці margin НЕ
       схлопуються, тому gap ДОДАВАВСЯ до власних margin блоків і замість
       рівного ритму виходило 28/46/50/52/64/68/70 (заміряно на 1300px).
       Колонковий проміжок лишаємо — він відділяє текст від бічної картки. */
    row-gap: 0;
    column-gap: 28px;
  }

  /* Зміст іде в тому ж ритмі, що й блоки статті */
  .blog-scope .toc-col { margin-bottom: var(--art-block-gap) }

  /* Ті самі три правила, що й нижче 1100px, і з тієї ж причини: селектор
     descendant, а не дочірній, бо герой у дереві — онук (див. коментар у блоці
     max-width: 1099px). */
  .blog-scope .article-col { display: contents }
  .blog-scope .article-col .article-card { order: -2 }
  .blog-scope .toc-col {
    order: -1;
    position: static;      /* у потоці й НЕ липкий — це вже не бічна колонка */
    max-height: none;
    overflow: visible;
    width: 100%;
  }
  /* 10px — те саме значення, що нижче 1100px: перехід через 1100 не має
     стрибати відступом під карткою змісту */
  .blog-scope .toc-col .toc-card { margin-bottom: 0; min-height: 0 }

  /* Сайдбар тримає ВСІ рядки сітки, а не свій один. Без цього липкість не
     працює: sticky рухає елемент лише в межах його комірки, а комірка = висота
     першого блоку статті (та сама пастка, що описана вище для .listing-layout).
     `1 / -1` тут не годиться — мінус-лінії рахуються від ЯВНОЇ сітки, а рядки
     в нас усі неявні, тож -1 означав би просто перший рядок. Тому явний span;
     200 — свідомо з запасом на найдовшу статтю. */
  .blog-scope .sidebar-col {
    grid-column: 2;
    grid-row: 1 / span 200;
  }

  /* Стаття без бічної картки — колонка одна; тримаємо рядок читабельним і
     центруємо, бо праворуч нічого не лишається. Ширину задаємо САМІЙ КОЛОНЦІ,
     а не .article-col: у неї тепер display:contents, тобто власного боксу, до
     якого можна причепити max-width, у неї немає. */
  .blog-scope .page-layout:not(:has(.sidebar-col)) {
    grid-template-columns: minmax(0, 820px);
    justify-content: center;
  }
}

/* Нижче 1100px і друга колонка втрачає сенс: текст статті став би вужчим за
   бічну картку. Складаємось у одну колонку — зміст під першим блоком і НЕ
   липкий (#32), CTA ховаємо: його роль грає нижня смуга .mob-sticky, яка
   з 04.08.2026 показується на всіх ширинах.
   `display:contents` на колонці статті — щоб порядком керувати поштучно:
   сам <aside> сусідить із <main>, тож без цього він міг би стати лише ДО
   або ПІСЛЯ всієї статті, а не одразу за героєм. */
@media (max-width: 1099px) {
  /* row-gap: 0 — з тієї ж причини, що й у блоці 1100–1399: колонка розчинена,
     тож блоки статті стають елементами флексу, а flex-gap додавався б до їхніх
     власних margin (заміряно до правки на 900px: 20/30/40 замість рівного
     ритму). Відступ тримає --art-block-gap. */
  .blog-scope .page-layout { display: flex; flex-direction: column; row-gap: 0 }
  .blog-scope .article-col { display: contents }
  .blog-scope .toc-col { margin-bottom: var(--art-block-gap) }
  /* ⚠️ Селектор НЕ дочірній, і це не стиль, а причина коментаря #32.
     У art-layout.css стоїть `.article-col > .article-card` — воно працювало,
     доки сторінка була цілою. Після розбивки на віджети (it5) герой приїжджає
     всередині обгортки включення (`div.include-host`), тож у ДЕРЕВІ він тепер
     онук, а не син. `display:contents` прибирає в обгортки лише БОКС — на
     збіг селекторів це не впливає, тому `>` перестав знаходити героя, і
     порядок не застосовувався: зміст мовчки поїхав НАД статтю. Симптом і
     помітив менеджер («зміст ставимо під цим блоком»). Заміряно на it6:
     зміст 242px, герой 675px — тобто над. Лікуємо причину, а не наслідок. */
  .blog-scope .article-col .article-card { order: -2 }
  .blog-scope .toc-col {
    order: -1;
    position: static;
    max-height: none;
    overflow: visible;
    width: 100%;
  }
  .blog-scope .toc-col .toc-card { margin-bottom: 0; min-height: 0 }
  .blog-scope .sidebar-col { display: none }

    .blog-scope .pullquote,
    .blog-scope .fig-chart,
    .blog-scope .checklist-card,
    .blog-scope .section,
    .blog-scope .inline-cta,
    .blog-scope .sidebar-links-card {
        width: 100%;
    }

}


/* ── Локальні коментарі Serg до it7 (31.08.2026) ────────────────────────────
   L1 «коли скролимо вниз, зміст і CTA заходять під шапочку — має лишатись
   гэп зверху до меню».
   Причина: липких смуг ДВІ, а не одна. Заміряно на сторінці при скролі:
   header.site-header — sticky, 0–80px, z-index 1000;
   nav.blog-cats     — sticky, 79–134px, z-index 999.
   Колонки липнули на 88px, тобто рівно під смугу категорій. Правильний
   орієнтир — низ ДРУГОЇ смуги: 134 + 8px подиху = 142px.
   Тримаємо це одним числом: зміниться висота смуг — міняти тут. */
.blog-scope {
    --art-sticky-top: 142px;
}

@media (min-width: 1100px) {
  .blog-scope .toc-col,

  .blog-scope .sidebar-col {
    top: var(--art-sticky-top);
    /* мінус обидві липкі смуги і нижня смуга CTA (~76) + подих */
    max-height: calc(100vh - var(--art-sticky-top) - 76px - 16px);
  }

  /* Бічна картка CTA не стискається (flex: 0 0 auto вище), тож на невисокому
     вікні вона ВИЩА за max-height колонки. Без власного скролу картка
     вилазила за бокс колонки, а бокс липне лише в межах сітки статті — у
     кінці статті хвіст картки налазив на підвал (рев'ю блогу, п. 5.6).
     Так само, як у змісту: вміщається — скролу немає, не вміщається —
     картка прокручується всередині колонки й зупиняється перед підвалом. */
  .blog-scope .sidebar-col {
    overflow-y: auto;
    overscroll-behavior: contain;
    scrollbar-width: thin;
  }
  /* якір зі змісту не має ховатись під ОБИДВІ смуги, а не лише під шапку */
  .blog-scope .article-col [id] { scroll-margin-top: calc(var(--art-sticky-top) + 8px) }
}

/* L2 «смугу категорій вирівняти по центру — зараз кривувато».
   Заміряно: рядок 1140px (150→1290), а шість пунктів займають 170→721 —
   тобто збиті вліво, і праворуч 569px порожнечі. Сама смуга симетрична
   (поля 150px з обох боків), тому центрування пунктів у рядку = центрування
   у вікні.
   ⚠️ Смуга спільна для всіх 8 сторінок, тож правка глобальна: на сторінках
   із сіткою карток пункти більше не починаються від лівого краю сітки.

   `safe center`, а не просто `center`: смуга тепер nowrap із горизонтальним
   скролом (blog-base.css), а центрування переповненого флекс-рядка виносить
   його початок у відʼємну область — перші категорії опиняються ліворуч від
   нуля скролу, і доскролити до них неможливо. Ключове слово safe вимикає
   центрування саме тоді, коли вміст не влазить. Широкі екрани, де порожнеча
   праворуч і була проблемою, поводяться як раніше.
   Перший рядок — фолбек для рушіїв без safe; вони його просто лишають. */
.blog-scope .blog-cats__row { justify-content: center; justify-content: safe center }


/* ── site-buttons.css ─────────────────────────────── */
/* site-buttons.css — ОДНА система кнопок на весь блог (рішення Serg, 03.08.2026).

   Що було не так. Правила кнопок ligazakon.net у `site-chrome.css` записані як
   `.site-header .btn` — тобто діяли ЛИШЕ в шапці. У тілі сторінки лишалися
   кнопки прототипу: `.btn-primary`, `.btn-outline`, `.btn-demo`, `.btn-ghost`,
   `.btn-sb-primary`, `.btn-sb-secondary`, `.seg-toggle button` — шість різних
   класів тільки на сторінці статті, кожен зі своїм радіусом, висотою і тінню.
   Питання дизайнера «ці кнопки точно в загальному стилі сайту?» — ні, не були.

   Що робимо. Базу `.btn` розшпилюємо з шапки (тут вона глобальна, ті самі
   значення з живого сайту: висота 46, радіус 29, вага 500), а класи прототипу
   перекладаємо на варіанти сайту через ті самі змінні `--btn-*`. Розмітку не
   чіпаємо: класи в HTML лишаються, змінюється лише те, що вони означають.

   Прототипні правила цих кнопок викинуті з блоків (build-blocks.py → BTN_DROP),
   інакше вони конкурували б із цим файлом.

   Підключається після блоків, перед review-fixes.css — див. distribute.py.
*/

.blog-scope .btn,

.blog-scope .btn-primary,

.blog-scope .btn-outline,

.blog-scope .btn-demo,

.blog-scope .btn-ghost,

.blog-scope .btn-sb-primary,

.blog-scope .btn-sb-secondary {
  --btn-main: var(--site-accent);
  --btn-hover: var(--site-accent-hover);
  --btn-bg: transparent;
  --btn-border: transparent;
  --btn-color: inherit;
  --btn-hover-bg: var(--btn-bg);
  --btn-hover-border: var(--btn-border);
  --btn-hover-color: var(--btn-color);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-100);
  height: 46px;
  padding: 0 22px;
  border-radius: 29px;
  border: 1px solid var(--btn-border);
  background: var(--btn-bg);
  color: var(--btn-color);
  font-family: var(--site-font);
  font-size: 14px;
  font-weight: 500;
  line-height: 1;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  user-select: none;
  box-shadow: none;                     /* прототипні кнопки несли власні тіні */
  transition: background-color .3s ease-out, border-color .3s ease-out,
              color .3s ease-out, transform .15s ease;
}
.blog-scope .btn:hover,

.blog-scope .btn-primary:hover,

.blog-scope .btn-outline:hover,

.blog-scope .btn-demo:hover,

.blog-scope .btn-ghost:hover,

.blog-scope .btn-sb-primary:hover,

.blog-scope .btn-sb-secondary:hover {
  background: var(--btn-hover-bg);
  border-color: var(--btn-hover-border);
  color: var(--btn-hover-color);
  text-decoration: none;
}
.blog-scope .btn:active,

.blog-scope .btn-primary:active,

.blog-scope .btn-outline:active,

.blog-scope .btn-demo:active,

.blog-scope .btn-ghost:active,

.blog-scope .btn-sb-primary:active,

.blog-scope .btn-sb-secondary:active { transform: translateY(1px); }

/* ── Варіанти сайту ─────────────────────────────────────────────────────── */
.blog-scope .btn--solid { --btn-bg: var(--btn-main); --btn-border: var(--btn-main); --btn-color: #fff;
               --btn-hover-bg: var(--btn-hover); --btn-hover-border: var(--btn-hover); --btn-hover-color: #fff; }
.blog-scope .btn--outline { --btn-bg: transparent; --btn-border: var(--btn-main); --btn-color: var(--btn-main);
                --btn-hover-bg: transparent; --btn-hover-border: var(--btn-hover); --btn-hover-color: var(--btn-hover); }
.blog-scope .btn--primary { --btn-main: var(--site-accent); --btn-hover: var(--site-accent-hover); }
.blog-scope .btn--black { --btn-main: var(--site-heading); --btn-hover: #0a0914; }
.blog-scope .btn--lg { height: 50px; padding: 0 26px; }
.blog-scope .btn--sm { height: 40px; padding: 0 18px; }

/* ── Класи прототипу → варіанти сайту ───────────────────────────────────── */
.blog-scope .btn-primary { --btn-bg: var(--btn-main); --btn-border: var(--btn-main); --btn-color: #fff;
               --btn-hover-bg: var(--btn-hover); --btn-hover-border: var(--btn-hover); --btn-hover-color: #fff; }
.blog-scope .btn-outline,

.blog-scope .btn-demo { --btn-bg: #fff; --btn-border: var(--btn-main); --btn-color: var(--btn-main);
               --btn-hover-bg: var(--color-primary-100); --btn-hover-border: var(--btn-hover); --btn-hover-color: var(--btn-hover); }
.blog-scope .btn-sm { height: 40px; padding: 0 18px; }

/* На ТЕМНОМУ фоні кнопка сайту інвертується: суцільна біла — головна дія,
   контурна біла — другорядна. Тими самими змінними, без окремої системи. */
.blog-scope .btn-sb-primary { --btn-bg: #fff; --btn-border: #fff; --btn-color: var(--site-accent);
                  --btn-hover-bg: var(--color-primary-100); --btn-hover-border: var(--color-primary-100);
                  --btn-hover-color: var(--site-accent-hover); }
.blog-scope .btn-ghost,

.blog-scope .btn-sb-secondary { --btn-bg: transparent; --btn-border: rgb(255 255 255 / .45); --btn-color: #fff;
                    --btn-hover-bg: rgb(255 255 255 / .14); --btn-hover-border: #fff; --btn-hover-color: #fff; }

/* Головна кнопка всередині інвертованих блоків — теж біла (див. global.css,
   там перелік таких поверхонь). Дублюємо тут значеннями змінних. */
.blog-scope .inline-cta .btn-primary,

.blog-scope .product-bridge .btn-primary,

.blog-scope .feat-card .btn-primary,

.blog-scope [data-surface="inverted"] .btn-primary {
  --btn-bg: #fff; --btn-border: #fff; --btn-color: var(--site-accent);
  --btn-hover-bg: var(--color-primary-100); --btn-hover-border: var(--color-primary-100);
  --btn-hover-color: var(--site-accent-hover);
}


/* ── tooltip.css ─────────────────────────────── */
/* =====================================================================
   tooltip.css — підказка блогу.

   Навіщо: вимога LIGA-9360 — коли авторів троє й більше, показувати «+N»
   і підказку зі списком імен. У прототипі Jira підказки немає.

   Чому НЕ перефарбований компонент ДС. У liga-ds тултіп є — директива
   `src/lib/tooltip/tooltip.directive.ts`, усередині `ld-tooltip-box` зі
   стилями `.ld-tooltip`. Але він ТЕМНИЙ (`--color-neutral-solid-900`) і
   позиціюється через CDK Overlay, тобто у статичному HTML не працює.
   Правка Serg (03.08.2026): «просто tooltip біленький з легенькою тінню».
   Тому це ОКРЕМА сайтова підказка — так само, як окремою є сайтова система
   кнопок (site-buttons.css). Компонент ДС при цьому не чіпаємо: його вигляд
   — власність ДС, а перефарбувати темний тултіп у білий = змінити компонент.
   ⚠️ Для розробника: у продукті це має бути `[ldTooltip]` з ДС; якщо
   потрібен саме білий варіант — це запит на новий варіант у ДС, а не
   локальний оверрайд.

   Значення — з токенів (свого hex/px тут немає):
     фон   --white, рамка --cntnr-border-default (як у статичних поверхонь ДС),
     тінь  --ds-elevation-2 (0 0 50px 10px #A8A8A826 — нейтральна висота ДС,
           та сама «легенька»), радіус --cntnr-corner-normal,
     текст --text-default, метрика 12/15 з .ld-tooltip (не вигадана).

   Механіка: CSS-only, текст живе в атрибуті `data-tip` і виводиться через
   content: attr(). Так підказка нічого не додає в DOM — макет лишається
   розфарбовуванням оригіналу, і check-content.py не бачить нового тексту.
   Доступність у статиці тримає `aria-label` на самому тригері.
   ===================================================================== */

.blog-scope [data-tip] {
  position: relative;
}

.blog-scope [data-tip]::after,

.blog-scope [data-tip]::before {
  opacity: 0;
  visibility: hidden;
  transition: opacity .15s ease-out, visibility .15s ease-out;
  pointer-events: none;
  z-index: 1600;                      /* z-index з .ld-tooltip ДС */
}

.blog-scope [data-tip]::after {
  content: attr(data-tip);
  position: absolute;
  bottom: calc(100% + var(--space-100));
  left: 50%;
  transform: translateX(-50%);
  width: max-content;
  max-width: 260px;                   /* як у .ld-tooltip */
  padding: var(--space-075) var(--space-100);
  border: 1px solid var(--cntnr-border-default);
  border-radius: var(--cntnr-corner-normal);
  background: var(--white);
  box-shadow: var(--ds-elevation-2);
  color: var(--text-default);
  font-family: var(--site-font);
  font-size: 12px;
  line-height: 15px;
  letter-spacing: 0.25px;
  font-weight: 400;
  text-align: left;
  white-space: normal;
}

/* Хвостик — той самий квадрат, повернутий на 45°: так рамка й тінь
   продовжуються без окремих кольорів. */
.blog-scope [data-tip]::before {
  content: '';
  position: absolute;
  bottom: calc(100% + var(--space-100) - 4px);
  left: 50%;
  width: 8px;
  height: 8px;
  transform: translateX(-50%) rotate(45deg);
  border-right: 1px solid var(--cntnr-border-default);
  border-bottom: 1px solid var(--cntnr-border-default);
  background: var(--white);
}

.blog-scope [data-tip]:hover::after,

.blog-scope [data-tip]:hover::before,

.blog-scope [data-tip]:focus-visible::after,

.blog-scope [data-tip]:focus-visible::before {
  opacity: 1;
  visibility: visible;
}

.blog-scope [data-tip]:focus-visible {
  outline: 2px solid var(--site-accent);
  outline-offset: 2px;
  border-radius: var(--cntnr-corner-small);
}


/* ── art-blocks.css ─────────────────────────────── */
/* art-blocks.css — додаткові контентні блоки статті.
   Рев'ю менеджера #17 (04.08.2026): графіки/інфографіка, цитата (з автором і
   без), велика картинка, картинка з описом.
   Стиль — той самий, що в решті статті: токени --site-*, радіуси й лінії як у
   .change-block / .sources-card, шрифти var(--font-h) / var(--font-b).
   Правити тут, не в index.html. */

/* Радіус усіх блоків цього файлу — var(--radius) (20px), як у .section
   і .article-card. Спершу стояв --site-radius-sm (10px), і блоки випадали
   з ритму сторінки (правка Serg 04.08.2026). */

/* Спільна підпис-мітка блоків (як .sources-card h4 / .toc-title) */
.blog-scope .fig-label { font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--muted);margin-bottom:10px }
.blog-scope .fig-cap { font-size:12.5px;color:var(--muted);line-height:1.5;margin-top:10px }
.blog-scope .fig-cap b { color:var(--ink);font-weight:600 }

/* ── Інфографіка / графік ───────────────────────────────────────────────────
   Стовпчики будуються на CSS-змінній --v (висота у %), значення — у розмітці.
   Дані демонстраційні (умовні), не статистика: у прод-версії блок віддає
   редакція або дашборд. */
.blog-scope .fig-chart { background:var(--white);border:1px solid var(--line);border-radius:var(--radius);padding:18px 22px;margin:18px 0 }
.blog-scope .chart-bars { display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:14px;align-items:end;height:180px;padding-top:8px }
.blog-scope .chart-bar { display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:8px;height:100% }
.blog-scope .chart-bar i { display:block;width:100%;max-width:56px;height:var(--v,50%);background:linear-gradient(180deg,var(--site-accent) 0%,var(--site-accent-hover) 100%);border-radius:6px 6px 0 0 }
.blog-scope .chart-bar.is-muted i { background:var(--lav-2) }
.blog-scope .chart-val { font-size:13px;font-weight:800;color:var(--ink);font-family:var(--font-h);line-height:1 }
.blog-scope .chart-key { font-size:11.5px;color:var(--muted);text-align:center;line-height:1.35 }

/* ── Цитата ─────────────────────────────────────────────────────────────────
   Локальні правки L5+L6 (Serg, 04.08.2026).
   Було: плашка з фоном var(--lav). Помилка — це ТОЙ САМИЙ колір, що й фон
   сторінки (`body{background:var(--lav)}`), а бордер брався з var(--line),
   який теж дорівнює --lav. Тобто цитата зливалася з фоном, а рамки не було
   видно в принципі.
   Стало: редакційна типографіка замість плашки — великий знак лапок
   акцентом, збільшений текст і волосяні лінії зверху/знизу кольором
   --site-lav-2 (він контрастує до фону сторінки). Плашки навмисно немає:
   на сторінці вже багато карток, ще одна не читалась би як цитата. */
/* Правка Serg 04.08.2026 (друга ітерація цього блоку): роздільники зверху й
   знизу прибрано — «не дуже красиво». Цитата лягає на БІЛУ картку, як решта
   блоків статті (.section / .fig-chart), і цим відділяється від лавандового
   фону сторінки. Знак лапок лишається — він і робить блок цитатою. */
.blog-scope .pullquote { margin:24px 0;padding:calc(22px - var(--art-pad-cut) * .5) calc(26px - var(--art-pad-cut) * .8);background:var(--white);
  border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow-s) }
.blog-scope .pullquote::before { content:'\201C';display:block;font-family:var(--font-h);
  font-size:52px;line-height:.7;color:var(--primary);opacity:.4;margin-bottom:10px }
.blog-scope .pullquote blockquote { font-family:var(--font-h);font-size:20px;line-height:1.5;
  color:var(--ink);margin:0;font-weight:600;max-width:58ch }
.blog-scope .pullquote figcaption { display:flex;align-items:center;gap:10px;margin-top:16px;font-size:13px;color:var(--site-muted) }
.blog-scope .pullquote figcaption b { color:var(--ink);font-weight:700;font-size:13.5px }
.blog-scope .pullquote figcaption .pq-role { color:var(--muted);font-size:12.5px }
/* без автора — та сама мова, лише трохи стриманіший знак лапок */
.blog-scope .pullquote--plain::before { opacity:.28 }

/* ── Велика картинка (на всю ширину колонки) ────────────────────────────────*/
.blog-scope .fig-wide { margin:22px 0 }
.blog-scope .fig-wide img { display:block;width:100%;height:auto;border-radius:var(--radius);border:1px solid var(--line) }

/* ── Картинка з описом ──────────────────────────────────────────────────────*/
.blog-scope .fig-caption { margin:22px 0 }
.blog-scope .fig-caption img { display:block;width:100%;height:auto;border-radius:var(--radius);border:1px solid var(--line) }
/* Кадр 16:9 тримає браузер, а не сервер: blog/_Picture ріже на сервері лише
   великі оригінали, решту віддає як є (рев'ю MR LIGA-11426). Без цього
   картинка в тексті мала б пропорції оригіналу, а не бокса. */
.blog-scope .fig-wide img,
.blog-scope .fig-caption img { aspect-ratio:16/9;object-fit:cover }
/* Підпис без «вкладки» зліва: та сама пастка, що й у цитаті — var(--line)
   дорівнює фону сторінки, тож смужку однаково не було видно. Підпис і так
   читається як підпис за розміром і кольором. */
.blog-scope .fig-caption figcaption { font-size:12.5px;color:var(--muted);line-height:1.5;margin-top:10px }

@media(max-width:600px) {
  .blog-scope .chart-bars { height:150px;gap:8px }
  .blog-scope .pullquote blockquote { font-size:15.5px }
}


/* ── site-surface.css ─────────────────────────────── */
/* =====================================================================
   site-surface.css — фірмова графіка ligazakon.net на сторінках блогу.

   Навіщо окремий файл, а не правки в CSS блоків: це не «стиль блоку», а
   наскрізна ознака бренду, яку треба тримати в ОДНОМУ місці й не втратити
   при перегенерації блоків (build-blocks.py переписує art-*.css, blog-*.css).
   Підключається ОСТАННІМ (див. distribute.py), тому перебиває і блоки, і ld-*.

   Джерело всіх значень — computed styles живого https://ligazakon.net/
   і https://ligazakon.net/price/, зняті 05.08.2026. Самі кольори лежать
   токенами у variables.css, тут — тільки їх застосування.

   Рішення Serg 05.08.2026 (варіант A2 «Хаб»): на головній блогу робимо
   бук-енд + один кольоровий крок усередині, а НЕ повний 11-ступеневий
   ланцюг головної сайту. Причина: під сіткою карток кольорові смуги
   заважають читати список, а біла робоча зона — ні. Сайт сам так робить:
   у нього два регістри, маркетингова головна з ланцюгом і внутрішні
   сторінки з чергуванням білого й #F8F7FF.
   ===================================================================== */

/* ── D. Бордер контейнера — те саме напівпрозоре чорнило ─────────────────
   У блозі ДВІ системи ліній, і правки лише в одній не досить:
     • --line / --site-line — токени сайту, ними тримаються блоки art- і blog-
       (виправлено у variables.css);
       ⚠️ саме тут я щойно написав дві маски через скісну риску й закрив
       коментар передчасно послідовністю «зірочка-риска» — правило нижче
       мовчки загинуло. Та сама пастка описана у variables.css; не повторювати.
     • --cntnr-border-default — токен ДС, ним тримаються .card, .sb-card і
       компоненти ld-*. Саме він малює рамку карток на головній.
   Другий у site-brand.css відображений на --color-primary-200 (#eaebfc) —
   тобто РІВНО колір лавандової плашки, та сама пастка. Показово, що в самій
   ДС цей токен нейтральний (--color-neutral-solid-300), а на брендову
   лаванду його перевів наш же мапінг site-brand.css. Тобто повертаємо
   задум ДС і водночас попадаємо в реальне значення сайту.
   ⚠️ Правимо ТІЛЬКИ роль «лінія». --cntnr-bg-primary-active лишається на
   --color-primary-200: там лаванда — це ЗАЛИВКА, і вона там доречна.
   Перевизначення тут, а не в site-brand.css, бо site-brand-tokens.css
   (генерований) підключається пізніше й перебив би правку в джерелі. */
.blog-scope {
  --cntnr-border-default: var(--site-line);
}

/* ── A. Фонова прогресія головної ────────────────────────────────────────
   Градієнт живе на <body>, а не на секціях, і це не лінь: .blog-hero, .featured,
   .filters і .grid лежать УСЕРЕДИНІ одного div.wrap (max-width 1140px), тож
   фон на них був би шириною з колонку, а не на весь екран. Повнобічність
   через `width:100vw` свідомо не беремо — 100vw включає смугу скролу й дає
   горизонтальний скрол (у нас уже є такий борг, див. HANDOFF пункт 6).
   Фон <body> повнобічний за визначенням і нічого не ламає.

   Перші 45px перекриває непрозора .crumbs-bar, тому старт градієнта під нею
   не видно; висота 420px — це крихти (45) + герой (262) + верх слайдера,
   щоб картки виїжджали з ледь помітного тону, як секції на сайті. */
.blog-scope[data-bg="hub"] {
  background-color: var(--white);
  background-image: linear-gradient(180deg, var(--site-lav) 0%, var(--white) 100%);
  background-repeat: no-repeat;
  background-position: 0 0;
  background-size: 100% 420px;
}

/* Крок кольору всередині сторінки. Повнобічної смуги тут бути не може з тієї
   ж причини (блок живе в сітці .grid), тому колір несе сама картка дайджесту:
   лаванда → м'ята, той самий перехід, що .roles → .folders на сайті.
   Без прив'язки до [data-bg]: блок дайджесту стоїть і на решті сторінок-списків,
   і виглядати він там має так само — інакше один блок має два вигляди. */
.blog-scope .grid > .nl-inline {
  background: linear-gradient(135deg, var(--site-lav) 0%, var(--site-tint-mint) 100%);
}

/* Шов перед футером. Футер починається з #C2C7F8, а .cta-final закінчувався
   білим — на стику була різка лінія, і орнамент обривався просто по ній.
   На сайті шва немає, бо .section_subscribe доводить фон до тієї ж лаванди.
   Нижнім шаром лишається горизонтальний градієнт із Figma (підкладка
   орнаменту, node 5029:107601), верхнім — вертикальний вихід у #C2C7F8.
   Прозорий до 55%, щоб не забруднити середину блока. */
.blog-scope .cta-final {
  background:
    linear-gradient(180deg, rgba(194, 199, 248, 0) 55%, var(--site-lav-2) 100%),
    linear-gradient(90deg, #ffffff 0%, #e5e2ff 50%, #ffffff 100%);
}

/* ── B. Заливка слова в заголовку ────────────────────────────────────────
   Ознака сайту: одне слово в H1/H2 залите градієнтом через background-clip.
   Не наша вигадка — так зроблені «All-in-one», «АІ-офіс», «Одна підписка».
   ⚠️ color:transparent без підтримки clip-у = невидимий текст, тому фолбек
   обов'язковий, а не «про всяк випадок». */
.blog-scope .grad-text {
  background-image: var(--site-grad-text);
  -webkit-background-clip: text;
          background-clip: text;
  color: transparent;
}
@supports not ((-webkit-background-clip: text) or (background-clip: text)) {
  .blog-scope .grad-text { background-image: none; color: var(--site-accent); }
}

/* ── C. Темні поверхні — на справжній градієнт сайту ──────────────────────
   Було: наша власна пара #091D4A → --site-accent-hover → --site-accent.
   Її ніхто не затверджував, вона просто «схожа на фіолетовий». Справжня —
   #1B1937 → #7169E6, знята з блока підписки на головній.
   Високі панелі беруть діагональ 140deg (як на сайті), низькі смуги —
   100deg, бо на висоті 60–80px діагональ показує лише темний край. */
.blog-scope .sidebar-cta,

.blog-scope .sb-banner,

.blog-scope .feat-card,

.blog-scope .product-bridge { background-image: var(--site-grad-dark); }

.blog-scope .inline-cta,

.blog-scope .checklist-hdr,

.blog-scope .deadline-box { background-image: var(--site-grad-dark-wide); }

/* Шапка картки слайдера має власний, світліший градієнт — щоб її було видно
   на тілі картки, беремо ту саму пару, але зсунуту в бік світлого кінця. */
.blog-scope .feat-card .img { background-image: linear-gradient(135deg, #3A3568 0%, #7169E6 120%); }

/* ── E. Пастельна плашка під іконку ──────────────────────────────────────
   Плашка 72×72 з діагональним пастельним градієнтом — така сама, як під
   іконками в .solution і .section_academy на сайті. Ставимо одну, у блок
   дайджесту: там є справжня іконка за змістом (дзвіночок = підписка).
   Більше плашок — це вже питання контенту (які іконки, до чого), тому їх
   тут немає навмисно. */
.blog-scope .nl-tile {
  width: 72px;
  height: 72px;
  border-radius: var(--site-radius-card);
  background-image: var(--site-grad-tile);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 30px;
  color: var(--site-accent);
}
/* Розкладка явна, бо плашка стоїть у розмітці ПІСЛЯ тексту: так додавання
   не зсуває існуючі вузли (на них тримаються прив'язки коментарів канваса),
   а сітка ставить її туди, де вона потрібна оку — ліворуч. */
.blog-scope .nl-inline .nl-in > div:first-child {
  display: grid;
  grid-template-columns: 72px 1fr;
  column-gap: 18px;
  align-items: start;
}
.blog-scope .nl-inline .nl-in > div:first-child > h2 { grid-column: 2; grid-row: 1 }
.blog-scope .nl-inline .nl-in > div:first-child > .sub { grid-column: 2; grid-row: 2 }
.blog-scope .nl-inline .nl-in > div:first-child > .nl-tile { grid-column: 1; grid-row: 1 / span 2 }

@media (max-width: 640px) {
  /* Плашка на вузькому екрані з'їдає пів рядка заголовка — прибираємо колонку. */
  .blog-scope .nl-inline .nl-in > div:first-child { grid-template-columns: 1fr }
  .blog-scope .nl-inline .nl-in > div:first-child > .nl-tile { display: none }
  .blog-scope .nl-inline .nl-in > div:first-child > h2 { grid-column: 1 }
  .blog-scope .nl-inline .nl-in > div:first-child > .sub { grid-column: 1 }
}




/* ── Вертикальний ритм статті: одне число на всі блоки ─────────────────────
   Рев'ю: «між блоками відступ нерівний, а від 1200px ще й завеликий».

   Джерел відступу було два одночасно:
   • власний margin кожного блоку — і в кожного свій: .section 18px,
     .article-card 20px, .fig-wide/.fig-caption 22px, .pullquote/.inline-cta 24px;
   • row-gap розкладки .page-layout (28px) — він працює там, де .article-col
     розчинена в display:contents, тобто нижче 1400px.

   У звичайному потоці (≥1400px) сусідні margin схлопуються, тож лишалось
   18/20/22/24 — уже нерівно. А у флексі й сітці margin НЕ схлопуються й
   ДОДАЮТЬСЯ до gap: заміряно на 1300px — 28/46/50/52/64/68/70, на 900px —
   20/30/40. Це і є обидві скарги одразу.

   Лікуємо причину: гасимо власні вертикальні margin верхньорівневих блоків, а
   весь ритм тримаємо ОДНИМ margin-bottom на верхньому рівні. У потоці він і є
   відступом (гасити нічого — margin-top скрізь нуль), у сітці/флексі row-gap
   виставлений у 0, тож нічого не додається. Результат однаковий на всіх
   ширинах, а не залежить від режиму розкладки.

   Другий селектор — про порожню обгортку: частина блок-партіалів віддає
   `<div><div class="checklist-card">…`, тобто справжня картка лежить на рівень
   глибше. Обгортка без класу — це завжди такий прохідний <div>, і її дітям
   власні margin теж не потрібні.

   Ширина діапазону навмисно та сама, що в --art-pad-cut: 640→1400px. Тоді
   падінги карток і проміжки між ними стискаються разом, а не врозріз. */
.blog-scope {
  --art-block-gap: clamp(10px, calc(10px + 8 * (100vw - 640px) / 760), 18px);
}

.blog-scope .article-col > *,
.blog-scope .article-col > div:not([class]) > * {
  margin-top: 0;
  margin-bottom: 0;
}

.blog-scope .article-col > * { margin-bottom: var(--art-block-gap) }

/* під останнім блоком відступ дає сама розкладка (.page-layout padding-bottom) */
.blog-scope .article-col > :last-child { margin-bottom: 0 }
