/* blog.css — blog-specific styles, loaded after main.css */

/* Override SPA layout lock — blog pages must scroll freely.
   Put the scroll on <html> only; if both html AND body have overflow:auto
   the wheel can hit the body's scroller and the window stays stuck.
   main.css sets body{display:flex} for the SPA shell — undo it so the
   footer stacks below content on blog pages. */
html{height:auto!important;overflow-x:hidden!important;overflow-y:auto!important;max-width:100%}
body.blog-root{display:block!important;height:auto!important;overflow:visible!important;max-width:100%}

/* ── Layout ───────────────────────────────────────────────────────────────── */
.blog-root{min-height:100vh;background:var(--bg);color:var(--text);font-family:var(--sans)}
.blog-nav{display:flex;align-items:center;gap:16px;padding:0 24px;height:52px;border-bottom:1px solid var(--border);background:var(--bg2);position:sticky;top:0;z-index:50}
.blog-nav-logo{display:flex;align-items:center;gap:8px;text-decoration:none;color:var(--text);font-weight:700;font-size:15px}
.blog-nav-logo-icon{width:28px;height:28px;background:#f5c842;border-radius:6px;display:grid;place-items:center;font-size:16px;flex-shrink:0;color:#0d0d0d}
.blog-nav-back{display:inline-flex;align-items:center;justify-content:center;gap:6px;font-size:13px;color:var(--text2);text-decoration:none;padding:5px 10px;border-radius:var(--r);border:1px solid var(--border2);background:var(--bg3);transition:all .15s;white-space:nowrap;cursor:pointer}
.blog-nav-back:hover{color:var(--text);background:var(--bg4)}
.blog-nav-theme{padding:5px 9px;font-size:14px;line-height:1}
.blog-nav-theme #theme-icon{display:inline-block;line-height:1}
.blog-nav-spacer{flex:1}

/* ── Blog index ───────────────────────────────────────────────────────────── */
.blog-index-hero{max-width:860px;margin:60px auto 40px;padding:0 24px;text-align:center}
.blog-index-hero h1{font-size:clamp(28px,5vw,42px);font-weight:700;margin:0 0 12px}
.blog-index-hero p{color:var(--text2);font-size:16px;margin:0}
.blog-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;max-width:1280px;margin:0 auto 60px;padding:0 24px;box-sizing:border-box}
@media(max-width:540px){.blog-grid{grid-template-columns:1fr;gap:16px;padding:0 16px}}

/* ── Post card ───────────────────────────────────────────────────────────── */
.blog-card{background:var(--bg2);border:1px solid var(--border);border-radius:var(--r2);overflow:hidden;display:flex;flex-direction:column;text-decoration:none;color:inherit;transition:border-color .15s,transform .15s}
.blog-card:hover{border-color:var(--border3);transform:translateY(-2px)}
.blog-card-cover{width:100%!important;height:auto!important;aspect-ratio:16/9!important;object-fit:cover;object-position:center;background:var(--bg3);display:block;max-height:none!important;min-height:0!important}
.blog-card-cover-placeholder{width:100%;aspect-ratio:16/9;background:linear-gradient(135deg,var(--bg3) 0%,var(--bg4) 100%);display:flex;align-items:center;justify-content:center;font-size:36px;color:var(--border3)}
.blog-card-body{padding:16px;flex:1;display:flex;flex-direction:column}
.blog-card-tags{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:10px}
.blog-tag{font-size:11px;font-weight:500;padding:2px 8px;border-radius:20px;background:var(--accent-bg);color:var(--accent);border:1px solid rgba(245,200,66,0.2)}
.blog-card-title{font-size:16px;font-weight:600;line-height:1.4;margin:0 0 8px;color:var(--text)}
.blog-card-excerpt{font-size:13px;color:var(--text2);line-height:1.6;flex:1;margin:0 0 12px}
.blog-card-meta{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text3)}
.blog-card-meta-dot{color:var(--border3)}

/* ── Post page layout ─────────────────────────────────────────────────────── */
.blog-post-wrap{display:grid;grid-template-columns:1fr min(720px,100%) 1fr;column-gap:0;max-width:1200px;margin:0 auto;padding:0 0 80px}
/* min-width:0 stops grid children from expanding the track to fit unbreakable content (long <pre> lines, long URLs). Without this, pre's overflow-x:auto never triggers because the column already grew to fit. */
.blog-post-wrap > *{grid-column:2;min-width:0}
.blog-post-wide{grid-column:1/-1}
.blog-post-cover{width:100%;height:auto;aspect-ratio:1200/630;max-height:420px;object-fit:cover;display:block;border-radius:var(--r2);margin:32px 0}
.blog-post-cover-wrap{grid-column:1/-1;padding:0 24px}

/* ── Post header ─────────────────────────────────────────────────────────── */
.blog-post-header{padding:32px 24px 0}
.blog-post-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px}
.blog-post-title{font-size:clamp(24px,4.5vw,38px);font-weight:700;line-height:1.25;margin:0 0 16px}
.blog-post-byline{display:flex;flex-wrap:wrap;align-items:center;gap:12px;font-size:13px;color:var(--text2);padding-bottom:20px;border-bottom:1px solid var(--border)}
.blog-post-byline strong{color:var(--text)}
.blog-post-byline-sep{color:var(--border3)}

/* ── TOC ─────────────────────────────────────────────────────────────────── */
.blog-toc-aside{grid-column:3;padding:32px 24px 0 20px;position:relative}
.blog-toc{position:sticky;top:72px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r);padding:16px;font-size:13px;max-height:calc(100vh - 100px);overflow-y:auto}
.blog-toc-title{font-size:11px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:var(--text3);margin-bottom:12px}
.blog-toc-list{list-style:none;margin:0;padding:0;display:grid;gap:4px}
.blog-toc-list li.toc-h3{padding-left:12px}
.blog-toc-list a{color:var(--text2);text-decoration:none;line-height:1.4;display:block;padding:3px 0;transition:color .15s}
.blog-toc-list a:hover{color:var(--accent)}

/* ── Article body ─────────────────────────────────────────────────────────── */
.blog-article{padding:28px 24px 0;line-height:1.75;font-size:16px;min-width:0;overflow-wrap:break-word;word-break:break-word}
.blog-article h2{font-size:22px;font-weight:700;margin:2em 0 .6em;padding-top:.2em;border-top:1px solid var(--border)}
.blog-article h3{font-size:18px;font-weight:600;margin:1.6em 0 .5em}
.blog-article h4{font-size:15px;font-weight:600;margin:1.4em 0 .4em}
.blog-article p{margin:0 0 1em}
.blog-article ul,.blog-article ol{padding-left:1.4em;margin:0 0 1em}
.blog-article li{margin-bottom:.35em}
.blog-article blockquote{border-left:3px solid var(--accent);margin:1.2em 0;padding:.6em 1.2em;background:var(--accent-bg);border-radius:0 var(--r) var(--r) 0;color:var(--text2)}
.blog-article pre{position:relative;background:#282c34;border:1px solid #3e4451;border-radius:8px;padding:20px 20px 20px 20px;overflow-x:auto;margin-bottom:24px;line-height:1.6}
.blog-article pre code{background:none;border:none;padding:0;font-size:13px;line-height:1.65;color:#abb2bf}
.blog-article code{background:#1e2127;border:1px solid #3e4451;border-radius:4px;padding:2px 7px;font-size:13px;font-family:var(--mono);color:#e5c07b}
.blog-article pre.mermaid{background:var(--bg2);border:1px solid var(--border);text-align:center;padding:16px;font-family:var(--mono);font-size:13px;color:var(--text2);overflow-x:auto;display:flex;justify-content:center;align-items:center;min-height:60px}
.blog-article pre.mermaid svg{max-width:100%;height:auto}
.blog-article figure.diagram{background:var(--bg2);border:1px solid var(--border);border-radius:8px;padding:18px;margin:1.4em 0;overflow-x:auto}
.blog-article figure.diagram svg{display:block;width:100%;max-width:100%;height:auto}
.blog-article figure.diagram figcaption{margin-top:10px;font-size:12px;color:var(--text3);text-align:center;font-style:italic}
.code-copy-btn{position:absolute;top:10px;right:10px;background:#3e4451;border:1px solid #4b5263;border-radius:5px;color:#abb2bf;font-size:11px;font-family:var(--sans,system-ui);padding:4px 10px;cursor:pointer;transition:all .15s;z-index:2}
.code-copy-btn:hover{background:#f5c842;color:#000;border-color:#f5c842}
.code-copy-btn:active{transform:scale(.96)}
.blog-article a{color:var(--accent);text-decoration:underline;text-decoration-color:rgba(245,200,66,.35);text-underline-offset:3px}
.blog-article a:hover{color:var(--accent2)}
.blog-article a[target="_blank"]::after{content:" ↗";font-size:.75em;opacity:.6}
.blog-article img{max-width:100%;border-radius:var(--r);margin:1em 0}
/* Tables are wrapped in .table-scroll by the markdown renderer so wide tables scroll horizontally on mobile without breaking the page layout. */
.table-scroll{margin:1em 0;overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch}
.blog-article .table-scroll table{margin:0}
.blog-article table{width:100%;border-collapse:collapse;margin:1em 0;font-size:14px}
.blog-article th{text-align:left;padding:8px 12px;background:var(--bg3);border:1px solid var(--border2);font-weight:600;white-space:nowrap}
.blog-article td{padding:8px 12px;border:1px solid var(--border2)}
.blog-article hr{border:none;border-top:1px solid var(--border2);margin:2em 0}

/* ── Related sections ─────────────────────────────────────────────────────── */
.blog-related{padding:32px 24px 0}
.blog-related h2{font-size:18px;font-weight:700;margin:0 0 14px}
.blog-related-tools{display:flex;flex-wrap:wrap;gap:8px}
.blog-related-posts{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;margin-top:4px}
.blog-related-post-card{background:var(--bg2);border:1px solid var(--border);border-radius:var(--r);padding:14px;text-decoration:none;color:inherit;display:block;transition:border-color .15s}
.blog-related-post-card:hover{border-color:var(--border3)}
.blog-related-post-card-title{font-size:14px;font-weight:600;margin:0 0 4px;color:var(--text)}
.blog-related-post-card-meta{font-size:12px;color:var(--text3)}

/* ── Engagement placeholder ───────────────────────────────────────────────── */
#blog-engagement{padding:32px 24px 0;min-height:1px}

/* ── Facet nav (categories + tag cloud on list pages) ─────────────────────── */
.blog-facets{max-width:1280px;margin:0 auto 32px;padding:0 24px;display:flex;flex-direction:column;gap:18px}
.blog-facet-group{display:flex;flex-direction:column;gap:8px}
.blog-facet-title{font-size:13px;font-weight:600;color:var(--text2);text-transform:uppercase;letter-spacing:.5px;margin:0;display:flex;align-items:center;gap:10px}
.blog-facet-all{font-size:11px;font-weight:500;text-transform:none;letter-spacing:0;color:var(--accent);text-decoration:none;margin-left:auto}
.blog-facet-all:hover{text-decoration:underline}
.blog-facet-list{display:flex;flex-wrap:wrap;gap:6px}
.blog-facet-chip{display:inline-flex;align-items:center;gap:6px;font-size:12px;padding:4px 10px;border-radius:20px;background:var(--bg2);color:var(--text2);border:1px solid var(--border2);text-decoration:none;transition:all .15s}
.blog-facet-chip:hover{border-color:var(--accent);color:var(--text);background:var(--accent-bg)}
.blog-facet-count{font-size:10px;color:var(--text3);background:var(--bg3);padding:1px 6px;border-radius:10px;font-weight:500}
.blog-facet-chip-lg{font-size:14px;padding:8px 14px}
.blog-tags-index{max-width:1100px;margin:0 auto 60px;padding:0 24px;display:flex;flex-wrap:wrap;gap:10px;justify-content:center}
.blog-empty{color:var(--text3);text-align:center;padding:40px 24px}

/* ── Pagination controls (list pages) ─────────────────────────────────────── */
.blog-pagination{max-width:1280px;margin:8px auto 60px;padding:24px;display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap;border-top:1px solid var(--border)}
.blog-page-link,.blog-page-current,.blog-page-disabled{font-size:13px;padding:8px 14px;border-radius:var(--r);text-decoration:none;line-height:1;border:1px solid var(--border2);background:var(--bg2);color:var(--text2);transition:all .15s}
.blog-page-link:hover{border-color:var(--accent);color:var(--text);background:var(--accent-bg)}
.blog-page-current{border-color:var(--accent);color:var(--accent);background:var(--accent-bg);font-weight:600}
.blog-page-disabled{opacity:.4;cursor:default}
.blog-page-numbers{display:inline-flex;gap:4px;flex-wrap:wrap;justify-content:center}
.blog-page-ellipsis{padding:8px 6px;color:var(--text3);font-size:13px}
.blog-page-prev,.blog-page-next{font-weight:500}
@media(max-width:540px){
  .blog-pagination{padding:16px 12px;gap:6px}
  .blog-page-link,.blog-page-current,.blog-page-disabled{padding:7px 11px;font-size:12px}
}

/* ── Footer ───────────────────────────────────────────────────────────────── */
.blog-footer{border-top:1px solid var(--border);padding:20px 24px;text-align:center;font-size:13px;color:var(--text3)}
.blog-footer a{color:var(--text2);text-decoration:none}
.blog-footer a:hover{color:var(--text)}

/* ── Site footer overrides ────────────────────────────────────────────────── */
/* responsive.css gives .site-footer negative side margins so it can break out
   of a SPA tool/hub container with internal padding. On blog pages the footer
   is a direct child of body (no padding), so those negatives push it past the
   viewport edge — undo them. */
.blog-root .site-footer{margin-left:0;margin-right:0}

/* ── Responsive ───────────────────────────────────────────────────────────── */
@media(max-width:1024px){
  .blog-post-wrap{grid-template-columns:1fr;padding:0 0 60px}
  .blog-post-wrap > *,.blog-post-wide,.blog-post-cover-wrap{grid-column:1}
  .blog-toc-aside{display:none}
}
@media(max-width:640px){
  .blog-grid{grid-template-columns:1fr}
  .blog-index-hero{margin:32px auto 24px}
  .blog-nav{padding-left:16px;padding-right:16px;height:56px;gap:8px}
  /* Touch targets ≥44×44 (Apple HIG / Material Design). The visible chip stays
     compact via font-size; min-height + padding give the tap surface. */
  .blog-nav-back{min-height:44px;padding:10px 14px;font-size:13px}
  .blog-nav-theme{min-width:44px;min-height:44px;padding:8px 10px;font-size:18px}
  .blog-post-header,.blog-article,.blog-related,.blog-post-cover-wrap{padding-left:16px;padding-right:16px}
  /* Tag chips in post header become reachable; chip stays small visually but
     adds vertical padding for tap. */
  .blog-post-tags a{min-height:32px;padding:6px 12px;font-size:12px;display:inline-flex;align-items:center}
  /* Code-block padding-top reserved for the floating Copy button so it doesn't
     overlap the first line of code. Smaller side padding reclaims width. */
  .blog-article pre{padding:38px 14px 14px}
  .code-copy-btn{min-height:32px;padding:7px 12px;font-size:12px;top:8px;right:8px}
}
