
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,300&display=swap">

<style>
/* ── ADMIN BAR OFFSETS ───────────────────────────────────────── */
body.admin-bar #cvProgressBar          { top: 112px !important; }
body.admin-bar .cv-chapter-nav         { top: 112px !important; }
body.admin-bar .cv-breadcrumb-wrap     { padding-top: 36px !important; }
@media screen and (max-width: 782px) {
  body.admin-bar #cvProgressBar        { top: 126px !important; }
  body.admin-bar .cv-chapter-nav       { top: 126px !important; }
  body.admin-bar .cv-breadcrumb-wrap   { padding-top: 50px !important; }
}

/* ── RESET ───────────────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }
html { overflow-x: hidden; }
body.cv-blog-page {
  font-family: 'DM Sans', system-ui, sans-serif;
  background: #fff;
  color: #0F172A;
  -webkit-font-smoothing: antialiased;
  /* Restored from v2.8. Removing this changed <body> from a scroll container
     back to a plain block — which changes what a position:sticky site header
     sticks to. The inner scrollbar that prompted the removal was actually
     .cv-blog-embed's own overflow-x, fixed separately. Leave this alone. */
  overflow-x: hidden;
}

/* Back-to-top removed: the sticky chapter nav replaces it */
body.cv-blog-page a.go-top,
body.cv-blog-page a.go-top.show {
  display: none !important;
}

/* ── PROGRESS BAR ────────────────────────────────────────────── */
#cvProgressBar { position: fixed; top: var(--cv-header-h, 80px); left: 0; width: 100%; height: 3px; background: rgba(22,163,74,.1); z-index: 9999; pointer-events: none; }
#cvProgressFill { height: 100%; width: 0%; background: #16A34A; transition: width .1s linear; }

/* ── DESIGN TOKENS ───────────────────────────────────────────── */
:root {
  --ink: #0F172A; --ink-20: rgba(15,23,42,.12);
  --white: #FFFFFF;
  --blue: #2563EB; --blue-soft: #EFF6FF; --blue-line: #BFDBFE;
  --green: #16A34A; --green-dark: #15803D; --green-soft: #F0FDF4; --green-line: #BBF7D0;
  /* Button greens are DARKER than brand green on purpose: white text on
     #16A34A is 3.30:1, below the WCAG AA 4.5:1 minimum for 15px text.
     #15803D = 5.02:1, #166534 = 7.13:1. Brand green stays for borders,
     accents and soft fills, where it carries no text. */
  --cta-bg: #15803D; --cta-bg-hover: #166534;
  --surface: #F8FAFC; --border: #E2E8F0;
  --muted: #64748B; --slate: #475569;
  --amber: #D97706; --amber-soft: #FEF3C7;
  --font: 'DM Sans', system-ui, sans-serif;
  --r: 12px; --r-lg: 20px;

  /* ── ONE CONTENT WIDTH ────────────────────────────────────────
     Every block on the page — breadcrumb, H1, author, article, share,
     author bio, Read Next, exit CTA — is bounded by this and nothing
     else. Change --max-w alone to move the whole page.

     1040px of content (1080 minus 2x20 padding) paired with 19px body
     text = ~97 characters per line — identical to the old 840px column at
     16px, but 200px wider and easier to read. Width and type size move
     TOGETHER: widening without growing the text is what pushes lines past
     110 characters. Nothing breaks out; nothing sets its own width. */
  --max-w: 1080px;
  --content-w: 1080px;
  --page-pad: 20px;
}

/* ── PAGE STRUCTURE ──────────────────────────────────────────── */

/* ── FIRST-FOLD TIGHTENING ───────────────────────────────────────
   Defensive: many themes add their own top padding to the content wrapper,
   which stacks on top of ours. Zero it on this template only. */
body.cv-blog-page #main,
body.cv-blog-page #content,
body.cv-blog-page #primary,
body.cv-blog-page .site-main,
body.cv-blog-page .site-content,
body.cv-blog-page .content-area,
body.cv-blog-page .entry-content,
body.cv-blog-page .page-content { padding-top: 0 !important; margin-top: 0 !important; }

.cv-breadcrumb-wrap { max-width: var(--max-w); margin: 0 auto; padding: 26px var(--page-pad) 0; }
.cv-breadcrumb { display: flex; gap: 6px; align-items: center; font-size: 13px; color: var(--muted); flex-wrap: wrap; line-height: 1.3; }
.cv-breadcrumb a { color: var(--blue); text-decoration: none; }
.cv-breadcrumb a:hover { text-decoration: underline; }
.cv-breadcrumb .sep { opacity: .4; }
.cv-breadcrumb .cv-crumb-cat { color: var(--muted); }
.cv-breadcrumb .cv-crumb-current { color: var(--muted); }

/* ── HERO — single column. Breadcrumb → H1 → author+date. Nothing else. ── */
.cv-hero { max-width: var(--max-w); margin: 0 auto; padding: 14px var(--page-pad) 0; }
.cv-hero-inner { max-width: 920px; }
.cv-hero h1 {
  font-family: var(--font);
  font-size: clamp(25px,3.2vw,32px);
  font-weight: 700; line-height: 1.1; letter-spacing: -1.2px;
  color: var(--ink); margin: 0 0 14px;
  /* 36px, not 42px, so real titles fit on ONE line in the 1120px content
     area. Measured single-line width at 42px vs 36px: 32px. Long titles
     wrap to two balanced lines inside the 840px column — contained, never
     overflowing it. Still comfortably above the 26px section headings, so
     the hierarchy reads correctly. Do not drop below ~28px to chase a
     one-line title: that puts the page H1 under its own subheads and
     inverts the hierarchy.

     No max-width: a one-line headline has no return sweep, so body-text
     measure limits do not apply. text-wrap:balance is kept for the
     genuinely long titles that still must wrap — it splits them into two
     even lines instead of a full line plus a one-word orphan.

     Do NOT use white-space: nowrap: a 79-character title needs 1408px even
     at 32px and would push the page into horizontal scroll. */
  text-wrap: balance;
}
.cv-hero-meta { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; font-size: 14px; color: var(--muted); padding-bottom: 14px; border-bottom: 1px solid var(--border); }
.cv-hero-author { display: flex; align-items: center; gap: 9px; }
.cv-avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--ink); color: #fff; font-size: 11px; font-weight: 700; display: flex; align-items: center; justify-content: center; flex-shrink: 0; overflow: hidden; }
.cv-avatar img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; display: block; }
.cv-author-name-link { color: var(--ink); text-decoration: none; font-weight: 600; border-bottom: 1px solid var(--border); transition: border-color .15s; }
.cv-author-name-link:hover { border-bottom-color: var(--ink); }
.cv-meta-sep { opacity: .35; }
.cv-date-lbl { font-weight: 600; }
.cv-date-updated { color: var(--green); font-weight: 600; }

/* ── CHAPTER NAV — unchanged from v2.8 ───────────────────────── */
.cv-chapter-nav { position: fixed; top: var(--cv-header-h, 80px); left: 0; right: 0; z-index: 9998; background: var(--white); border-bottom: 1px solid var(--border); width: 100%; box-shadow: 0 1px 0 var(--border); display: none; }
.cv-chapter-nav.visible { display: block; }
body.admin-bar .cv-chapter-nav { top: 112px; }
.cv-chapter-inner { max-width: var(--max-w); margin: 0 auto; padding: 0 var(--page-pad); display: flex; overflow-x: auto; scrollbar-width: none; }
.cv-chapter-inner::-webkit-scrollbar { display: none; }
.cv-chapter-link { flex-shrink: 0; padding: 9px 16px; font-size: 13px; font-weight: 500; color: var(--muted); text-decoration: none; border-bottom: 2px solid transparent; transition: color .15s, border-color .15s; white-space: nowrap; }
.cv-chapter-link:hover { color: var(--ink); }
.cv-chapter-link.active { color: var(--ink); font-weight: 600; border-bottom-color: var(--green); }

/* Nav slides away once the article ends, and on phones while scrolling down */
.cv-chapter-nav { transition: transform .25s ease, visibility 0s linear 0s; }
.cv-chapter-nav.cv-nav-hidden,
.cv-chapter-nav.cv-nav-ended { transform: translateY(-100%); visibility: hidden; pointer-events: none; transition: transform .25s ease, visibility 0s linear .25s; }
@media (prefers-reduced-motion: reduce) { .cv-chapter-nav { transition: none !important; } }

/* ── CONTENT ─────────────────────────────────────────────────── */
.cv-content-wrap { max-width: var(--content-w); margin: 0 auto; padding: 18px var(--page-pad) 40px; }
/* Whatever the embed ends with, it must not add trailing space of its own —
   the gap before the share row is owned here and nowhere else. */
.cv-article > :last-child { margin-bottom: 0 !important; }
.cv-chapter-nav.visible ~ .cv-content-wrap,
.cv-chapter-nav.visible + .cv-content-wrap { padding-top: 42px; }

.cv-article p { font-size: 19px; line-height: 1.7; margin-bottom: 20px; color: #374151; }
.cv-article h2 { font-size: clamp(24px,3vw,34px); font-weight: 700; line-height: 1.15; letter-spacing: -.5px; color: var(--ink); margin: 56px 0 20px; }
.cv-article h3 { font-size: 20px; font-weight: 700; color: var(--ink); margin: 40px 0 16px; }
.cv-article h4 { font-size: 17px; font-weight: 600; color: var(--ink); margin: 28px 0 12px; }
.cv-article h3 strong, .cv-article h4 strong { color: inherit; font-weight: inherit; }
.cv-article ul, .cv-article ol { padding-left: 24px; margin-bottom: 20px; }
.cv-article li { font-size: 19px; line-height: 1.7; margin-bottom: 10px; color: #374151; }
.cv-article ul li::marker { color: var(--blue); }
.cv-article a { color: var(--blue); text-decoration: none; border-bottom: 1px solid var(--blue-line); transition: border-color .15s; }
.cv-article a:hover { border-bottom-color: var(--blue); }
.cv-article strong { font-weight: 600; color: var(--ink); }
.cv-article blockquote { border-left: 3px solid var(--green); padding: 4px 0 4px 20px; margin: 28px 0; font-style: italic; color: var(--slate); }
.cv-article img { max-width: 100%; height: auto; border-radius: var(--r); margin: 28px 0; }

/* CTA colour guard — an anchor styled as a button must not inherit blue link text */
.cv-article a.cv-cta,
.cv-article a[class*="cta"],
.cv-article a[class*="btn"],
.cv-article a[class*="button"] { color: #fff !important; border-bottom: none !important; }
.cv-article a.cv-cta-outline { color: var(--ink) !important; }

/* Table */
.cv-article table { width: 100%; border-collapse: collapse; margin: 28px 0; font-size: 14px; }
.cv-article th { background: var(--surface); padding: 11px 16px; text-align: center; font-weight: 600; border-bottom: 2px solid var(--border); }
.cv-article td { padding: 11px 16px; border-bottom: 1px solid var(--border); text-align: center; }
.cv-article tr:nth-child(even) td { background: #fafbfd; }

/* Callout/highlight boxes: force font ≥ 16px */
.cv-article .kb-info-box-text, .cv-article .kb-info-box-text *,
.cv-article .kb-notice-body,   .cv-article .kb-notice-body *,
.cv-article [class*="mentor"],  .cv-article [class*="mentor"] *,
.cv-article [class*="insight"], .cv-article [class*="insight"] p,
.cv-article [class*="callout"], .cv-article [class*="callout"] p,
.cv-article [class*="highlight"], .cv-article [class*="highlight"] p,
.cv-article [class*="notice"],  .cv-article [class*="notice"] p,
.cv-article [class*="tip-box"], .cv-article [class*="tip-box"] p,
.cv-article .wp-block-pullquote p,
.cv-article .wp-block-quote p { font-size: 16px !important; line-height: 1.7 !important; }

/* TLDR: ensure box is fully visible, never clipped */
.cv-article [class*="tldr"], .cv-article [class*="tl-dr"], .cv-article [id*="tldr"] { max-height: none !important; overflow: visible !important; display: block !important; }
.cv-article [class*="tldr"] *, .cv-article [class*="tl-dr"] *, .cv-article [id*="tldr"] * { visibility: visible !important; opacity: 1 !important; color: #374151 !important; }
.cv-article .quick-answer-label { display: none !important; }

/* FAQ / Accordion — remove ALL CAPS */
.cv-article .kb-accordion-title, .cv-article .kb-accordion-title *,
.cv-article .ub-faq-item-question, .cv-article .ub-faq-item-question *,
.cv-article .wp-block-details summary,
.cv-article details summary,
.cv-article [class*="accordion"] .title,
.cv-article [class*="accordion"] .header,
.cv-article [class*="accordion"] summary,
.cv-article [class*="accordion"] button,
.cv-article [class*="faq"] .question,
.cv-article [class*="faq"] dt,
.cv-article [class*="faq"] summary,
.cv-article [class*="faq"] button,
.cv-article .faq-question,
.cv-article .accordion-title,
.cv-article .accordion-header { text-transform: none !important; letter-spacing: normal !important; font-size: 15px !important; }

/* Conclusion heading auto-style (applied via JS) */
.cv-conclusion-heading { display: flex; align-items: center; gap: 10px; font-size: 22px; font-weight: 700; color: var(--ink); margin: 48px 0 16px; }
.cv-conclusion-heading::before { content: ''; display: inline-block; width: 4px; height: 24px; background: var(--green); border-radius: 2px; flex-shrink: 0; }

/* ── SOCIAL SHARE ─────────────────────────────────────────────── */
.cv-social-share { max-width: var(--content-w); margin: 24px auto 0; padding: 18px var(--page-pad) 0; border-top: 1px solid var(--border); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.cv-share-label { font-size: 12px; font-weight: 600; color: var(--muted); letter-spacing: .04em; }
.cv-share-btn { display: inline-flex; align-items: center; gap: 6px; padding: 7px 14px; border-radius: 100px; border: 1.5px solid var(--border); font-size: 12px; font-weight: 600; color: var(--ink); text-decoration: none; background: var(--white); cursor: pointer; font-family: var(--font); transition: all .15s; }
.cv-share-btn:hover { border-color: var(--ink); background: var(--surface); }
.cv-share-btn svg { width: 14px; height: 14px; flex-shrink: 0; }
.cv-share-btn.copied { border-color: var(--green); color: var(--green); background: var(--green-soft); }

/* ── AUTHOR BIO ──────────────────────────────────────────────── */
.cv-author-bio { max-width: var(--content-w); margin: 32px auto 0; padding: 24px var(--page-pad); border: 1px solid var(--border); border-radius: var(--r-lg); display: flex; align-items: flex-start; gap: 20px; }
.cv-author-avatar { width: 56px; height: 56px; border-radius: 50%; flex-shrink: 0; background: var(--ink); color: #fff; font-size: 18px; font-weight: 700; display: flex; align-items: center; justify-content: center; overflow: hidden; }
.cv-author-avatar img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; }
.cv-author-content { flex: 1; min-width: 0; }
.cv-author-label { font-size: 10px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--muted); margin-bottom: 4px; }
.cv-author-name { font-size: 16px; font-weight: 700; color: var(--ink); margin-bottom: 2px; }
.cv-author-role { font-size: 13px; color: var(--blue); font-weight: 500; margin-bottom: 10px; }
.cv-author-text { font-size: 14px; color: var(--muted); line-height: 1.65; margin-bottom: 12px; }

/* ── READ NEXT ────────────────────────────────────────────────── */
.cv-read-next { max-width: var(--max-w); margin: 0 auto; padding: 0 var(--page-pad) 80px; }
.cv-read-next-label { font-size: 11px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--blue); display: flex; align-items: center; gap: 8px; margin-bottom: 20px; }
.cv-read-next-label::after { content: ''; flex: 0 0 16px; height: 1.5px; background: var(--blue); }
.cv-read-next-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; }
.cv-rn-card { border: 1px solid var(--border); border-radius: var(--r-lg); padding: 22px; background: var(--white); text-decoration: none; display: block; transition: border-color .2s, box-shadow .2s; }
.cv-rn-card:hover { border-color: var(--ink-20); box-shadow: 0 4px 16px rgba(0,0,0,.06); }
.cv-rn-tag { display: inline-block; font-size: 10px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; padding: 3px 9px; border-radius: 100px; margin-bottom: 12px; }
.cv-rn-tag-blue  { background: var(--blue-soft);  color: var(--blue); }
.cv-rn-tag-green { background: var(--green-soft); color: var(--green); }
.cv-rn-tag-amber { background: var(--amber-soft); color: var(--amber); }
.cv-rn-title { font-size: 15px; font-weight: 600; color: var(--ink); line-height: 1.7; margin-bottom: 8px; }
.cv-rn-desc { font-size: 13px; color: var(--muted); line-height: 1.7; margin-bottom: 14px; }
.cv-rn-meta { display: flex; align-items: center; justify-content: space-between; font-size: 12px; color: var(--muted); padding-top: 12px; border-top: 1px solid var(--border); }
.cv-rn-arrow { color: var(--blue); font-weight: 700; }
.cv-rn-time { font-size: 11px; font-weight: 600; color: var(--muted); background: var(--surface); padding: 3px 8px; border-radius: 100px; }

/* ── EXIT CTA — one primary CTA; brand stats live here ────────── */
.cv-exit-wrap { max-width: var(--max-w); margin: 64px auto 0; padding: 0 var(--page-pad) 56px; }
.cv-exit-inner { background: linear-gradient(135deg,var(--surface) 0%,var(--white) 100%); border: 1px solid var(--border); border-radius: var(--r-lg); padding: 64px 48px; text-align: center; }
.cv-exit-title { font-size: clamp(26px,3.5vw,40px); font-weight: 700; line-height: 1.2; letter-spacing: -.5px; color: var(--ink); margin-bottom: 16px; }
.cv-exit-title .accent { color: var(--green); }
.cv-exit-sub { font-size: 17px; color: var(--muted); line-height: 1.6; max-width: 580px; margin: 0 auto 32px; }
.cv-exit-btns { display: flex; gap: 16px; justify-content: center; margin-bottom: 24px; flex-wrap: wrap; }
.cv-exit-primary { display: inline-flex; align-items: center; gap: 8px; background: var(--cta-bg); font-size: 15px; font-weight: 600; padding: 14px 32px; border-radius: 100px; transition: background .2s, transform .2s; }
/* Lock the label colour across every link state. The theme's global
   a:hover rule was repainting this text near-black on hover. */
.cv-exit-primary,
.cv-exit-primary:link,
.cv-exit-primary:visited,
.cv-exit-primary:hover,
.cv-exit-primary:focus,
.cv-exit-primary:active { color: #fff !important; text-decoration: none !important; }
.cv-exit-primary:hover { background: var(--cta-bg-hover); transform: translateY(-2px); }
.cv-exit-primary:focus-visible { outline: 3px solid var(--ink); outline-offset: 3px; }
.cv-exit-secondary { display: inline-flex; align-items: center; gap: 8px; border: 1.5px solid var(--border); color: var(--ink); font-size: 15px; font-weight: 600; padding: 14px 32px; border-radius: 100px; text-decoration: none; transition: border-color .2s; }
.cv-exit-secondary:hover { border-color: var(--ink); }
.cv-exit-trust { display: flex; gap: 24px; justify-content: center; font-size: 13px; color: var(--muted); flex-wrap: wrap; }
.cv-exit-trust span::before { content: '✓ '; color: var(--green); font-weight: 700; }

/* ── RESPONSIVE ──────────────────────────────────────────────── */
@media(max-width:768px){
  :root { --page-pad: 20px; }
  /* 19px is right for a 1040px column; on a phone the line is only ~38
     characters, so step down. Still above the original 16px. */
  .cv-article p, .cv-article li { font-size: 17px; }
  .cv-chapter-inner { padding: 0 20px; }
  .cv-read-next-grid { grid-template-columns: 1fr; }
  .cv-exit-btns { flex-direction: column; align-items: stretch; }
  .cv-exit-primary, .cv-exit-secondary { justify-content: center; }
  .cv-breadcrumb-wrap { padding-top: 8px; }
  .cv-hero { padding-top: 10px; }
  .cv-hero h1 { font-size: 27px; }
  .cv-hero-meta { gap: 8px; font-size: 13px; }
  /* Keep the breadcrumb to one line on phones — the article title is long
     and wrapping it costs a whole row of first-fold height. */
  .cv-breadcrumb { flex-wrap: nowrap; overflow: hidden; }
  .cv-breadcrumb .cv-crumb-current { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
  .cv-chapter-link { padding: 8px 13px; font-size: 12.5px; }
  .cv-author-bio { flex-direction: column; }
}
</style>

<div id="cvProgressBar"><div id="cvProgressFill"></div></div>


<script>
/* ── Progress bar ── */
window.addEventListener('scroll', function() {
  var h = document.documentElement;
  var pct = (h.scrollTop / (h.scrollHeight - h.clientHeight)) * 100;
  var f = document.getElementById('cvProgressFill');
  if (f) f.style.width = pct + '%';
}, { passive: true });

/* ── Chapter nav — unchanged from v2.8 ── */
(function() {
  var art = document.getElementById('cvArticle');
  var nav = document.getElementById('cvChapterNav');
  var inner = document.getElementById('cvChapterInner');
  if (!art || !nav || !inner) return;
  var eyebrows = art.querySelectorAll('.sec-eyebrow');
  if (!eyebrows.length) return;
  var valid = [];
  eyebrows.forEach(function(eb, i) {
    var label = eb.textContent.trim();
    if (!label.match(/^\d/)) return;
    if (!eb.id) eb.id = 'cv-sec-' + i;
    eb.style.scrollMarginTop = '160px';
    var a = document.createElement('a');
    a.href = '#' + eb.id;
    a.className = 'cv-chapter-link' + (valid.length === 0 ? ' active' : '');
    a.dataset.sec = eb.id;
    a.textContent = label;
    inner.appendChild(a);
    valid.push(eb);
  });
  if (!inner.children.length) return;
  nav.classList.add('visible');

  /* Sit the nav on the header's actual bottom edge. Measured on the live
     site: <header> is position:fixed, 41px tall once scrolled, z-index
     99999. The nav was hardcoded at top:80px — a 39px transparent gap that
     page content scrolled through. Nothing else is touched. No white
     filler, no z-index change: the header outranks the nav 99999 to 9998,
     so it always paints on top and the nav can never clip it, even if the
     number is briefly stale. If no <header> exists, --cv-header-h is never
     set and the CSS falls back to the original 80px. */
  var siteHeader = document.querySelector('header');
  if (siteHeader) {
    var lastH = -1;
    var syncHeader = function () {
      var h = Math.round(siteHeader.getBoundingClientRect().bottom);
      if (h < 0) h = 0;
      if (h > 300) return;               /* ignore anything implausible */
      if (h === lastH) return;
      lastH = h;
      document.documentElement.style.setProperty('--cv-header-h', h + 'px');
    };
    syncHeader();
    /* The header animates its height, so observe the element itself
       rather than only scroll. */
    if (window.ResizeObserver) new ResizeObserver(syncHeader).observe(siteHeader);
    var queued = false;
    window.addEventListener('scroll', function () {
      if (queued) return;
      queued = true;
      window.requestAnimationFrame(function () { syncHeader(); queued = false; });
    }, { passive: true });
    window.addEventListener('resize', syncHeader, { passive: true });
  }

  /* ── Keep the active tab visible inside the horizontally scrolling nav ── */
  var navLock = false, lockTimer, lastActive = valid[0] ? valid[0].id : '';
  var reduceMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;

  function centerTab(link, smooth) {
    /* Nothing to do when every tab already fits (desktop). */
    if (!link || inner.scrollWidth <= inner.clientWidth + 1) return;
    var ir = inner.getBoundingClientRect(), lr = link.getBoundingClientRect();
    var left = inner.scrollLeft + (lr.left - ir.left) - (inner.clientWidth - lr.width) / 2;
    inner.scrollTo({ left: Math.max(0, left), behavior: (smooth && !reduceMotion) ? 'smooth' : 'auto' });
  }
  function releaseSoon(ms, recenter) {
    clearTimeout(lockTimer);
    lockTimer = setTimeout(function () {
      navLock = false;
      if (recenter) centerTab(inner.querySelector('.cv-chapter-link.active'), true);
    }, ms);
  }

  /* Reader taps a tab: centre it now, and hold off auto-centring until the page stops scrolling. */
  inner.addEventListener('click', function (e) {
    var link = e.target.closest && e.target.closest('.cv-chapter-link');
    if (!link) return;
    navLock = true;
    centerTab(link, true);
    releaseSoon(900, true);
  });
  /* Reader is swiping or wheeling the nav itself: don't fight them. */
  ['touchstart', 'wheel'].forEach(function (evt) {
    inner.addEventListener(evt, function () { navLock = true; releaseSoon(2500, false); }, { passive: true });
  });

  window.addEventListener('scroll', function () {
    var th = 160, cur = valid[0] ? valid[0].id : '', activeLink = null;
    valid.forEach(function (eb) { if (eb.getBoundingClientRect().top < th) cur = eb.id; });
    inner.querySelectorAll('.cv-chapter-link').forEach(function (a) {
      var on = a.dataset.sec === cur;
      a.classList.toggle('active', on);
      if (on) activeLink = a;
    });
    if (navLock) { releaseSoon(250, true); return; }   /* page still moving after a tap */
    if (cur !== lastActive) { lastActive = cur; centerTab(activeLink, true); }
  }, { passive: true });

  /* ── Hide the nav once the article ends; on phones also hide on scroll-down, show on scroll-up ── */
  var phone = window.matchMedia('(max-width: 768px)');
  var lastY = window.pageYOffset, phoneHidden = false, navTick = false;

  function updateNavVisibility() {
    navTick = false;
    var y = window.pageYOffset;
    var dy = y - lastY;
    var navTop = parseFloat(getComputedStyle(nav).top) || 0;
    var ended = art.getBoundingClientRect().bottom < navTop + nav.offsetHeight;

    if (!phone.matches || y < 120) {
      phoneHidden = false; lastY = y;
    } else if (navLock) {
      lastY = y;                      /* tab tap or nav swipe in progress: leave it as it is */
    } else if (Math.abs(dy) >= 6) {
      phoneHidden = dy > 0; lastY = y;
    }
    nav.classList.toggle('cv-nav-ended', ended);
    nav.classList.toggle('cv-nav-hidden', phoneHidden);
  }
  window.addEventListener('scroll', function () {
    if (!navTick) { navTick = true; window.requestAnimationFrame(updateNavVisibility); }
  }, { passive: true });
  window.addEventListener('resize', updateNavVisibility, { passive: true });
  updateNavVisibility();
})();

/* ── Copy link ── */
function cvCopyLink() {
  var b = document.getElementById('cvCopyBtn'), s = b.querySelector('span');
  navigator.clipboard.writeText(window.location.href).then(function() {
    b.classList.add('copied'); s.textContent = 'Copied!';
    setTimeout(function() { b.classList.remove('copied'); s.textContent = 'Copy link'; }, 2000);
  });
}

/* ── Hide explicit "Quick Answer" labels ── */
(function() {
  var art = document.getElementById('cvArticle');
  if (!art) return;
  art.querySelectorAll('.quick-answer-label').forEach(function(el) { el.style.display = 'none'; });
})();

/* ── Auto-style conclusion headings ── */
(function() {
  var art = document.getElementById('cvArticle');
  if (!art) return;
  var phrases = ['in conclusion','wrapping up','to summarise','to summarize','final thoughts','closing thoughts'];
  art.querySelectorAll('h2, h3').forEach(function(h) {
    var t = h.textContent.trim().toLowerCase();
    if (phrases.some(function(p) { return t.indexOf(p) !== -1; })) {
      h.classList.add('cv-conclusion-heading');
    }
  });
})();
</script>
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="//www.crackverbal.com/main-sitemap.xsl"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<sitemap>
		<loc>https://www.crackverbal.com/post-sitemap1.xml</loc>
		<lastmod>2026-10-08T14:40:15+00:00</lastmod>
	</sitemap>
	<sitemap>
		<loc>https://www.crackverbal.com/post-sitemap2.xml</loc>
		<lastmod>2026-10-08T04:14:04+00:00</lastmod>
	</sitemap>
	<sitemap>
		<loc>https://www.crackverbal.com/page-sitemap.xml</loc>
		<lastmod>2026-10-07T03:30:31+00:00</lastmod>
	</sitemap>
	<sitemap>
		<loc>https://www.crackverbal.com/local-sitemap.xml</loc>
		<lastmod>2023-11-17T11:18:02+00:00</lastmod>
	</sitemap>
</sitemapindex>
<!-- XML Sitemap generated by Rank Math SEO Plugin (c) Rank Math - rankmath.com -->