/* Blog component layer — charts, verdict tables, post cards.
   Extracted 2026-09-22 from the inline <style> blocks of the first two
   blog pages so that every post shares one implementation. Loaded only by
   /blog/*, which is why it is not in style.css. */

/* ---- post components: vt tables, vchart, wire, loss, stat-band ---- */
/* page-local: a negative colour the system lacks, both themes */
  :root                  { --z-neg: #d9575f; }
  html[data-theme='day'] { --z-neg: #a32b2e; }

  /* vertical comparison chart — same component as the benchmarks hub */
  .vchart { margin: var(--sp-6) 0 0; }
  .vc-legend { display:flex; flex-wrap:wrap; gap:22px; margin:0 0 var(--sp-8);
               font-family:var(--font-data); font-size:var(--fs-11);
               letter-spacing:var(--track-label); text-transform:uppercase; }
  .vc-legend b { display:inline-flex; align-items:center; gap:8px; font-weight:600; }
  .vc-legend b::before { content:''; width:11px; height:11px; border-radius:2px; background:currentColor; }
  .vc-legend .bare { color:var(--z-neg); } .vc-legend .native { color:var(--z-cmp); }
  .vc-legend .xerj { color:var(--z-accent); }
  .vc-groups { display:grid; gap:var(--sp-10) var(--sp-12);
               grid-template-columns:repeat(auto-fit, minmax(280px, 1fr)); }
  .vc-group  { min-width:0; }
  .vc-plot { box-sizing:border-box; height:238px; padding:30px var(--sp-2) 0;
             display:grid; grid-auto-flow:column; grid-auto-columns:1fr;
             gap:var(--sp-6); border-bottom:1px solid var(--z-line); }
  .vc-col  { display:flex; flex-direction:column; justify-content:flex-end;
             align-items:center; height:100%; min-width:0; }
  .vc-bar  { position:relative; display:block; width:100%; max-width:78px;
             min-height:3px; border-radius:2px 2px 0 0; background:currentColor; }
  .vc-v    { position:absolute; bottom:100%; left:50%; transform:translateX(-50%);
             margin-bottom:8px; white-space:nowrap; color:var(--z-ink);
             font-family:var(--font-data); font-size:var(--fs-13); font-weight:700; }
  .vc-col.bare   { color:var(--z-neg); }
  .vc-col.native { color:var(--z-cmp); }
  .vc-col.xerj   { color:var(--z-accent); }
  .vc-col.xerj .vc-v { color:var(--z-accent); }
  .vc-axis { display:grid; grid-auto-flow:column; grid-auto-columns:1fr; gap:var(--sp-6);
             padding:var(--sp-3) var(--sp-2) 0; text-align:center; min-height:46px;
             font-family:var(--font-data); font-size:var(--fs-11);
             letter-spacing:var(--track-label); text-transform:uppercase; color:var(--z-mute); }
  .vc-axis span { min-width:0; }
  .vc-axis .sub { display:block; font-style:normal; letter-spacing:.03em;
                  text-transform:none; opacity:.72; margin-top:3px; }
  .vc-axis .win { color:var(--z-accent); opacity:1; }
  .vc-title { margin-top:var(--sp-4); padding-top:var(--sp-3);
              border-top:1px solid var(--z-faint);
              font-family:var(--font-data); font-size:var(--fs-11);
              letter-spacing:var(--track-label); text-transform:uppercase; color:var(--z-mute); }
  .vc-title b { color:var(--z-ink); font-weight:600; }
  .vc-note { margin:var(--sp-4) 0 0; max-width:900px;
             font-family:var(--font-data); font-size:12px; letter-spacing:.03em; color:var(--z-mute); }
  @media (max-width:620px) {
    .vc-plot { height:196px; gap:var(--sp-3); padding-top:26px; }
    .vc-axis { gap:var(--sp-3); }
    .vc-v { font-size:11px; }
  }

  /* stat band */
  .stat-band { display:grid; grid-template-columns:repeat(auto-fit, minmax(220px,1fr));
               gap:1px; background:var(--z-line); border:1px solid var(--z-line);
               margin:var(--sp-8) 0 0; }
  .stat { background:var(--z-bg); padding:20px 22px; }
  .stat .v { font-family:var(--font-display); font-weight:800; font-size:var(--fs-32);
             color:var(--z-accent); line-height:1.05; }
  .stat .v.bad { color:var(--z-neg); }
  .stat .k { font-family:var(--font-data); font-size:var(--fs-11); letter-spacing:var(--track-label);
             text-transform:uppercase; color:var(--z-mute); margin-top:8px; }
  .stat .s { font-size:13px; color:var(--z-mute); margin-top:4px; line-height:1.5; }
  .stat .s a { color:var(--z-mute); }

  /* verdict table */
  .vt-wrap { overflow-x:auto; margin-top:var(--sp-6); }
  table.vt { width:100%; border-collapse:collapse; font-family:var(--font-data); font-size:13.5px; }
  .vt th { text-align:left; font-size:11px; letter-spacing:.06em; text-transform:uppercase;
           color:var(--z-mute); font-weight:600; padding:9px 12px 9px 0; border-bottom:1px solid var(--z-ink); }
  .vt td { padding:10px 12px 10px 0; border-bottom:1px solid var(--z-faint); vertical-align:top; }
  .vt td.n { font-variant-numeric:tabular-nums; white-space:nowrap; }
  .vt .w { color:var(--z-accent); font-weight:700; }
  .vt .t { color:var(--z-mute); font-weight:600; }
  .vt .l { color:var(--z-neg); font-weight:700; }

  /* Mobile scroll affordance (2026-09-21 fix round). Three of the six tables
     have min-content widths of 379 / 405 / 699 px and clip inside .vt-wrap on
     phones with nothing saying more columns sit sideways. The shell holds a
     right-edge scrim that fades to the page background — a soft cut line, not
     a shadow (brand: no shadows) — painted above the scrolled table because
     the shell itself does not scroll. Each modifier's gate is the measured
     viewport at which THAT table starts to clip (min-content + 2×18px
     gutter), so a table that fits never gets a fade over its last column.
     Pure CSS, pointer-events none, no JS. */
  .vt-shell { position:relative; }
  .vt-shell::after { content:''; position:absolute; top:0; right:0; bottom:0; width:26px;
                     background:linear-gradient(to right, transparent, var(--z-bg));
                     pointer-events:none; display:none; }
  @media (max-width:735px) { .vt-shell--bills::after { display:block; } }
  @media (max-width:440px) { .vt-shell--hist::after  { display:block; } }
  @media (max-width:420px) { .vt-shell--beir::after  { display:block; } }

  /* wire panels */
  .wire { display:grid; gap:var(--sp-4); margin-top:var(--sp-8); }
  .wp { border:1px solid var(--z-line); border-left:3px solid var(--z-accent); padding:18px 22px; }
  .wp .wh { display:flex; gap:14px; align-items:baseline; flex-wrap:wrap; }
  .wp .wn { font-family:var(--font-data); font-size:12px; font-weight:700; letter-spacing:.08em; color:var(--z-accent); }
  .wp h3 { margin:0; font-family:var(--font-display); font-weight:800; font-size:var(--fs-20); letter-spacing:.01em; }
  .wp .wm { margin-left:auto; font-family:var(--font-data); font-size:12px; color:var(--z-mute); letter-spacing:.04em; }
  .wp p { margin:8px 0 0; color:var(--z-mute); font-size:15px; line-height:1.6; max-width:920px; }
  .wp p strong { color:var(--z-ink); }
  .wp.neg { border-left-color:var(--z-neg); }
  .wp.neg .wn { color:var(--z-neg); }

  .loss { border:1px solid var(--z-line); border-left:3px solid var(--z-neg); padding:16px 20px;
          margin-top:var(--sp-6); font-size:15px; color:var(--z-mute); line-height:1.65; max-width:980px; }
  .loss strong { color:var(--z-ink); }
  .src { font-family:var(--font-data); font-size:12px; letter-spacing:.03em; color:var(--z-mute); margin-top:var(--sp-4); }

  /* terminal blocks */
  pre.code { margin:var(--sp-5) 0 0; padding:18px 20px; border:1px solid var(--z-line);
             overflow-x:auto; font-family:var(--font-data); font-size:12.5px; line-height:1.75;
             color:var(--z-mute); background:var(--z-bg); }
  pre.code .prompt { color:var(--z-accent); font-weight:700; user-select:none; }
  pre.code .out { color:var(--z-ink); }
  pre.code .cmt { opacity:.62; }

  /* bullet lists — same rule the hub carries locally */
  ul.deep { list-style:none; padding:0; max-width:920px; }
  ul.deep li { margin:14px 0; line-height:1.65; color:var(--z-mute); font-size:15px; }
  ul.deep li strong { color:var(--z-ink); }
  ul.deep code.inline { color:var(--z-ink); }

  /* blog post scaffolding — breadcrumb, byline, verdict lede */
  .blog-crumb { margin:0 0 var(--sp-6); font-family:var(--font-data); font-size:var(--fs-11);
                font-weight:600; letter-spacing:var(--track-label); text-transform:uppercase; }
  .blog-crumb a { color:var(--z-mute); text-decoration:none; border-bottom:1px solid var(--z-line);
                  padding-bottom:1px; }
  .blog-crumb a:hover, .blog-crumb a:focus-visible { color:var(--z-accent); border-color:var(--z-accent); }
  .blog-byline { margin:var(--sp-4) 0 0; font-family:var(--font-data); font-size:var(--fs-11);
                 font-weight:600; letter-spacing:var(--track-label); text-transform:uppercase;
                 color:var(--z-mute); }
  .verdict-panel { border:1px solid var(--z-line); border-left:3px solid var(--z-accent);
                   padding:var(--sp-6); margin:var(--sp-8) 0 0; text-align:left; }
  .verdict-panel .vh { display:flex; gap:14px; align-items:baseline; flex-wrap:wrap; margin-bottom:var(--sp-4); }
  .verdict-panel .vh .wn { font-family:var(--font-data); font-size:12px; font-weight:700;
                           letter-spacing:.08em; color:var(--z-accent); }
  .verdict-panel .vh .wm { margin-left:auto; font-family:var(--font-data); font-size:12px;
                           color:var(--z-mute); letter-spacing:.04em; }
  .verdict-panel p { margin:0 0 var(--sp-4); font-family:var(--font-prose); font-size:var(--fs-16);
                     line-height:1.7; color:var(--z-mute); max-width:900px; }
  .verdict-panel p:last-child { margin-bottom:0; }
  .verdict-panel p strong { color:var(--z-ink); }
  .verdict-panel p code.inline { color:var(--z-ink); }

/* ---- index components: bl-card, blp preview bars ---- */
/* page-local — blog index: dated cards, preview visual left, brand tokens
     only, 1px lines, no icons, no shadows, no filled shapes. */
  .blog-hero { padding: var(--sp-6) 0 var(--sp-8); }
  .blog-hero .uc-eyebrow { margin-bottom: var(--sp-4); }

  ol.blog-list { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--sp-6); }
  .bl-card {
    display: grid;
    grid-template-columns: minmax(240px, 320px) minmax(0, 1fr);
    gap: var(--sp-6);
    border: 1px solid var(--z-line);
    padding: var(--sp-5);
    text-decoration: none;
    color: inherit;
  }
  .bl-card:hover, .bl-card:focus-visible { border-color: var(--z-accent); }

  /* preview slot — a theme-native miniature scorecard, pure divs; no image
     file, correct in day and night by construction (site precedent: every
     chart in the benchmarks pages is CSS bars). */
  .bl-preview { border: 1px solid var(--z-line); padding: var(--sp-4); align-self: stretch; }
  .blp-kicker { font-family: var(--font-data); font-size: var(--fs-11); font-weight: 600;
                letter-spacing: var(--track-label); text-transform: uppercase;
                color: var(--z-mute); padding-bottom: var(--sp-3);
                border-bottom: 1px solid var(--z-line); }
  .blp-row { padding: var(--sp-3) 0; border-bottom: 1px solid var(--z-line); }
  .blp-row:last-of-type { border-bottom: 0; }
  .blp-ds { font-family: var(--font-data); font-size: var(--fs-11); font-weight: 600;
            letter-spacing: var(--track-label); text-transform: uppercase; color: var(--z-mute); }
  .blp-pair { display: grid; grid-template-columns: minmax(92px, 116px) minmax(0, 1fr);
              gap: var(--sp-2) var(--sp-3); align-items: center; margin-top: var(--sp-2); }
  .blp-bar { height: 4px; min-width: 2px; }
  .blp-bar.a { background: var(--z-accent); }
  .blp-bar.b { background: var(--z-cmp); }
  .blp-num { font-family: var(--font-mono); font-size: var(--fs-11); color: var(--z-ink);
             white-space: nowrap; display: flex; align-items: baseline; gap: 6px; }
  .blp-num i { font-style: normal; font-family: var(--font-data); font-size: 10px;
               letter-spacing: .02em; color: var(--z-mute); }
  .blp-num.b { color: var(--z-cmp); }
  .blp-chip { color: var(--z-cmp); font-weight: 700; }
  .blp-foot { margin: var(--sp-3) 0 0; padding-top: var(--sp-3); border-top: 1px solid var(--z-line);
              font-family: var(--font-mono); font-size: var(--fs-11); line-height: 1.6; color: var(--z-mute); }

  .bl-meta { min-width: 0; }
  .bl-date { font-family: var(--font-data); font-size: var(--fs-11); font-weight: 600;
             letter-spacing: var(--track-label); text-transform: uppercase; color: var(--z-mute);
             font-variant-numeric: tabular-nums; }
  .bl-title { margin: var(--sp-3) 0 0; font-family: var(--font-display); font-weight: 800;
              font-size: var(--fs-32); line-height: 1.05; color: var(--z-ink); }
  .bl-card:hover .bl-title, .bl-card:focus-visible .bl-title { color: var(--z-accent); }
  .bl-excerpt { margin: var(--sp-3) 0 0; font-family: var(--font-prose); font-size: var(--fs-16);
                line-height: 1.65; color: var(--z-mute); max-width: 68ch; }
  .bl-excerpt strong { color: var(--z-ink); }
  .bl-byline { margin: var(--sp-4) 0 0; font-family: var(--font-data); font-size: var(--fs-11);
               font-weight: 600; letter-spacing: var(--track-label); text-transform: uppercase;
               color: var(--z-mute); font-variant-numeric: tabular-nums; }
  .bl-read { display: inline-block; margin-top: var(--sp-4); font-family: var(--font-data);
             font-size: var(--fs-11); font-weight: 700; letter-spacing: var(--track-label);
             text-transform: uppercase; color: var(--z-accent);
             border-bottom: 1px solid var(--z-accent); padding-bottom: 1px; }

  .blog-archive { margin: var(--sp-8) 0 0; padding-top: var(--sp-4); border-top: 1px solid var(--z-line);
                  font-family: var(--font-data); font-size: var(--fs-13); color: var(--z-mute); }
  .blog-archive a { color: var(--z-mute); border-bottom: 1px solid var(--z-line); padding-bottom: 1px; }
  .blog-archive a:hover, .blog-archive a:focus-visible { color: var(--z-accent); border-color: var(--z-accent); }

  @media (max-width: 720px) {
    .bl-card { grid-template-columns: minmax(0, 1fr); gap: var(--sp-4); }
    .bl-title { font-size: var(--fs-20); }
  }
