/* /blog pages only (DESIGN.md "Blog"; site.css is at its budget). Cards with generative dot covers (Blog::cover: inline
   SVG, currentColor), the article page on the reading layout (.read-grid / .prose from site.css). No photos, no colour. */

/* ---------------------------------------------------------------- index */
.blog-head{padding-bottom:20px}
.blog-follow{max-width:72ch;margin-top:10px;font-size:13px;color:var(--fg-3);text-wrap:pretty}
.blog-follow a{color:var(--fg-2)}
.blog-tagname{font-family:var(--mono);font-weight:500;letter-spacing:-.04em}
.blog-tags{margin-bottom:24px}
.blog-tags ul{display:flex;flex-wrap:wrap;gap:8px}
.chip-sm{height:24px;padding:0 9px;font-size:12px}

.bcards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
.bcard{position:relative;display:flex;flex-direction:column;min-width:0;border:1px solid var(--line);border-radius:var(--r);background:var(--bg);overflow:hidden;transition:border-color .15s ease}
.bcard-cv{aspect-ratio:12/5;border-bottom:1px solid var(--line);background:var(--bg-2);color:var(--fg);overflow:hidden}
/* the dot field (Blog::cover): whole dots with a one-cell margin, scaled to fit; the dark theme tones it down a step */
.cv{display:block;width:100%;height:100%;opacity:var(--cvo,1)}
.cv-feat{display:none}
@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .bcard-cv{--cvo:.82}}
:root[data-theme=dark] .bcard-cv{--cvo:.82}
.bcard-body{display:flex;flex:1;flex-direction:column;gap:10px;padding:20px}
.bcard-tags{display:flex;flex-wrap:wrap;gap:6px}
.bcard-tags a{position:relative;z-index:1}
.bcard-title{font-size:19px;font-weight:600;line-height:1.3;letter-spacing:-.018em;text-wrap:balance;overflow-wrap:anywhere}
.bcard-title a::after{content:"";position:absolute;inset:0;border-radius:inherit}
.bcard-title a:focus-visible{outline:0}
.bcard:has(.bcard-title a:focus-visible){outline:2px solid var(--fg);outline-offset:2px}
.bcard-ex{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden;font-size:14px;line-height:1.55;color:var(--fg-2)}
.bcard-meta{margin-top:auto;padding-top:4px;font-size:13px;color:var(--fg-3);font-variant-numeric:tabular-nums}
@media (hover:hover){.bcard:hover{border-color:var(--line-2)}}
/* on hover the whole field drifts a few px (the margin keeps every dot whole); fine pointers, motion allowed */
@media (hover:hover) and (pointer:fine) and (prefers-reduced-motion:no-preference){
  .bcard-cv .cv{transition:transform .4s var(--ease-out)}
  .bcard:hover .bcard-cv .cv{transform:translate(4px,-2px)}
}
@media (min-width:900px){
  .bcard-feat{grid-column:1/-1;flex-direction:row}
  .bcard-feat .bcard-cv{flex:0 0 50%;aspect-ratio:auto;min-height:300px;border-bottom:0;border-right:1px solid var(--line)}
  .bcard-feat .cv-card{display:none}
  .bcard-feat .cv-feat{display:block}
  .bcard-feat .bcard-body{justify-content:center;gap:12px;padding:32px 36px}
  .bcard-feat .bcard-title{font-size:clamp(23px,1rem + .9vw,28px);line-height:1.2;letter-spacing:-.028em}
  .bcard-feat .bcard-ex{-webkit-line-clamp:4;font-size:15px}
  .bcard-feat .bcard-meta{margin-top:6px}
}
.bcards-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.bcards-3 .bcard-title{font-size:17px}
@media (max-width:959px){.bcards-3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:699px){.bcards,.bcards-3{grid-template-columns:minmax(0,1fr)}.bcard-body{padding:18px}}

/* ---------------------------------------------------------------- article */
.post-page{position:relative;isolation:isolate;padding-bottom:64px}
/* the post's dot field as a low band under the header, fading out like the home hero texture; the mask reaches zero
   before the sides and the bottom, where the field is cropped, so no cut dot ever shows */
.post-band{position:absolute;inset:0 0 auto;height:120px;z-index:-1;pointer-events:none;color:var(--fg);opacity:.7;
  --m:radial-gradient(60% 120% at 50% 0,#000 30%,#0000 80%);-webkit-mask:var(--m);mask:var(--m)}
@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .post-band{opacity:.55}}
:root[data-theme=dark] .post-band{opacity:.55}
@media (forced-colors:active),(prefers-contrast:more),print{.post-band{display:none}}
.post-page>.wrap>.crumbs{padding-top:104px}
@media (max-width:559px){.post-band{height:100px}.post-page>.wrap>.crumbs{padding-top:84px}}

.post-head{max-width:860px;padding:20px 0 36px}
.post-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:16px}
.post-lede{max-width:64ch;margin-top:14px;font-size:17px;line-height:1.55;color:var(--fg-2);text-wrap:pretty}
.post-meta{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;margin-top:18px;font-size:13px;color:var(--fg-3);font-variant-numeric:tabular-nums}
.post-meta .sep{color:var(--line-2)}
.post-en{display:inline-flex;align-items:center;gap:8px;margin-top:16px;padding:6px 12px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg-2);font-size:13px;color:var(--fg-2)}
.post-en .i{width:15px;height:15px;color:var(--fg-3)}

.post-grid.no-toc{grid-template-columns:minmax(0,1fr)}
.post-body{max-width:72ch;font-size:16px;line-height:1.7}
.post-text>*+*{margin-top:18px}
.post-text h2,.post-text h3,.post-sources h2{scroll-margin-top:calc(var(--head) + 20px)}
.post-text h2{margin:52px 0 0;font-size:23px;line-height:1.25;letter-spacing:-.022em;text-wrap:balance}
.post-text h3{margin:34px 0 0;font-size:17px;line-height:1.35;letter-spacing:-.012em}
.post-text h2+*,.post-text h3+*{margin-top:10px}
.post-text>:first-child{margin-top:0}
.post-text a{color:var(--fg);text-decoration:underline;text-decoration-color:var(--line-2);text-decoration-thickness:1px;text-underline-offset:3px;transition:text-decoration-color .15s ease}
.post-text a:hover{text-decoration-color:currentColor}
.post-text :not(pre)>code{font-size:.86em;padding:1px 5px;border:1px solid var(--line);border-radius:4px;background:var(--bg-2);color:var(--fg);overflow-wrap:anywhere}
.post-text strong{font-weight:600}
.post-text ul,.post-text ol{gap:8px}
.post-text li>ul,.post-text li>ol{margin-top:8px}
.post-text li>p+p{margin-top:8px}
.post-text blockquote{padding:2px 0 2px 18px;border-left:2px solid var(--line-2);color:var(--fg-2)}
.post-text blockquote>*+*{margin-top:10px}
.post-text hr{margin-block:40px;border:0;border-top:1px solid var(--line)}
.post-text img{max-width:100%;height:auto;border:1px solid var(--line);border-radius:var(--r)}
.post-text .code{margin-top:20px}
.post-text .code pre{font-size:13px;white-space:pre;overflow-wrap:normal} /* code scrolls sideways instead of wrapping mid-line */
.post-text .table-wrap{margin-top:20px}
/* short tables stay tables on phones (site.css stacks .prose tables into cards below 560 px) */
@media (max-width:559px){
  .post-text .tw-compact table{font-size:13px}
  .post-text .tw-compact thead{display:table-header-group}
  .post-text .tw-compact tr{display:table-row;padding:0}
  .post-text .tw-compact th,.post-text .tw-compact td{display:table-cell;padding:8px 10px}
  .post-text .tw-compact tbody td{border-top:1px solid var(--line)!important}
  .post-text .tw-compact td::before{content:none}
  .post-text .tw-compact td:first-child{padding-bottom:8px;font-weight:500}
}
.post-text th.ar,.post-text td.ar{text-align:right}
.post-text th.ac,.post-text td.ac{text-align:center}
.post-text .tldr{padding:16px 20px;border:1px solid var(--line);border-radius:var(--r);background:var(--bg-2);color:var(--fg)}
.post-text .tldr strong{font-weight:600}
.post-text .tldr>*+*{margin-top:10px}
/* heading anchors: a "#" for mouse users (keyboard and screen readers use "On this page") */
.hd-a{margin-left:10px;font-weight:400;color:var(--fg-3);text-decoration:none!important;opacity:0;transition:opacity .15s ease}
.post-text h2:hover .hd-a,.post-text h3:hover .hd-a{opacity:1}
@media (hover:none){.hd-a{display:none}}

/* FAQ: open questions with hairlines (the answers are part of the article, not hidden) */
.post-faq .faq-i{padding-block:18px;border-top:1px solid var(--line)}
.post-faq h2+.faq-i,.post-faq h2+*{margin-top:16px}
.post-faq .faq-i h3{margin:0;font-size:16px}
.post-faq .faq-i>*+*{margin-top:8px}
.post-faq .faq-i p{font-size:15px;color:var(--fg-2)}

/* glossary: a definition list with hairlines */
.post-dl{border-top:1px solid var(--line);margin-top:14px!important}
.post-dl div{display:grid;grid-template-columns:minmax(120px,30%) minmax(0,1fr);gap:16px;padding:10px 0;border-bottom:1px solid var(--line);font-size:15px}
.post-dl dt{font-weight:500;color:var(--fg)}
.post-dl dd{margin:0}
@media (max-width:559px){.post-dl div{grid-template-columns:minmax(0,1fr);gap:2px}}

.post-sources{margin-top:56px;padding-top:24px;border-top:1px solid var(--line)}
.post-sources h2{margin:0;font-size:16px;font-weight:600;color:var(--fg)}
.post-sources p{margin-top:4px;font-size:13px;color:var(--fg-3)}
.post-sources ol{display:grid;gap:4px;margin-top:12px;padding-left:24px;list-style:decimal;font:400 12.5px/1.6 var(--mono);color:var(--fg-3)}
.post-sources a{color:var(--fg-2);overflow-wrap:anywhere;transition:color .15s ease}
.post-sources a:hover{color:var(--fg)}

/* after the article: the directory, the servers it mentions, more posts */
.post-cta{display:flex;align-items:center;justify-content:space-between;gap:24px;margin-top:56px;padding:28px 32px;border:1px solid var(--line);border-radius:var(--r);background:var(--bg-2)}
.post-cta p{max-width:58ch;margin-top:6px;font-size:14px;color:var(--fg-2);text-wrap:pretty}
.post-cta-act{display:flex;flex:none;flex-wrap:wrap;gap:8px}
.post-cta .btn .i{width:16px;height:16px}
@media (max-width:759px){.post-cta{flex-direction:column;align-items:flex-start;padding:24px 20px}}
@media (max-width:399px){.post-cta-act{width:100%}.post-cta-act .btn{flex:1 1 100%}}
.post-more{margin-top:56px}
@media print{.post-cta,.post-more,.read-toc,.hd-a{display:none}}
