/* ===================================================================
   Bedrock Python — magazine-style theme (inspired by claude.com/blog,
   openai.com/news). Sits on top of Zensical / Material defaults.
   =================================================================== */

/* -------- 1. Design tokens -------- */

:root,
[data-md-color-scheme="default"] {
  /* Brand: warm stone + terracotta accent */
  --bdr-bg:           #F8F6F1;       /* page bg, claude-like cream */
  --bdr-surface:      #FFFFFF;       /* card bg */
  --bdr-surface-2:    #F1ECE2;       /* secondary surface, chips */
  --bdr-border:       #E5DFD2;       /* hairline borders */
  --bdr-border-2:     #D9D2C2;       /* stronger borders */
  --bdr-ink:          #1A1815;       /* primary text */
  --bdr-ink-2:        #4A4640;       /* secondary text */
  --bdr-ink-3:        #7A746A;       /* tertiary text / meta */
  --bdr-accent:       #C9572C;       /* terracotta — links, CTAs */
  --bdr-accent-hover: #A6431F;
  --bdr-accent-soft:  #F2D9CC;       /* accent tinted bg */

  /* Material overrides */
  --md-default-bg-color:        var(--bdr-bg);
  --md-default-fg-color:        var(--bdr-ink);
  --md-default-fg-color--light:  var(--bdr-ink-2);
  --md-default-fg-color--lighter:var(--bdr-ink-3);
  --md-primary-fg-color:        var(--bdr-ink);
  --md-primary-fg-color--light: var(--bdr-ink-2);
  --md-primary-fg-color--dark:  var(--bdr-ink);
  --md-primary-bg-color:        var(--bdr-bg);
  --md-primary-bg-color--light: var(--bdr-bg);
  --md-accent-fg-color:         var(--bdr-accent);
  --md-accent-fg-color--transparent: rgba(201,87,44,.1);
  --md-typeset-a-color:         var(--bdr-accent);
  --md-code-bg-color:           #F1ECE2;
  --md-code-fg-color:           #2B2722;
}

[data-md-color-scheme="slate"] {
  /* Neutral near-black, faint warm tint. Tuned for AA contrast and
     clearly visible card/border separation. */
  --bdr-bg:           #0E0E10;   /* page bg */
  --bdr-surface:      #18181B;   /* card bg, +5% luminance over page */
  --bdr-surface-2:    #232327;   /* chips / inline code bg */
  --bdr-border:       #2A2A2F;   /* hairline — clearly visible */
  --bdr-border-2:     #3A3A41;   /* stronger borders, hover state */
  --bdr-ink:          #ECEAE3;   /* primary text — WCAG AAA on bg */
  --bdr-ink-2:        #C7C2B8;   /* secondary text — AA on bg */
  --bdr-ink-3:        #8B867C;   /* tertiary / meta — AA on bg */
  --bdr-accent:       #E8825A;   /* slightly brighter terracotta for dark */
  --bdr-accent-hover: #F39875;
  --bdr-accent-soft:  rgba(232,130,90,.18);

  --md-default-bg-color:        var(--bdr-bg);
  --md-default-fg-color:        var(--bdr-ink);
  --md-default-fg-color--light:  var(--bdr-ink-2);
  --md-default-fg-color--lighter:var(--bdr-ink-3);
  --md-primary-fg-color:        var(--bdr-ink);
  --md-primary-fg-color--light: var(--bdr-ink-2);
  --md-primary-fg-color--dark:  var(--bdr-ink);
  --md-primary-bg-color:        var(--bdr-bg);
  --md-primary-bg-color--light: var(--bdr-bg);
  --md-accent-fg-color:         var(--bdr-accent);
  --md-accent-fg-color--transparent: rgba(232,130,90,.18);
  --md-typeset-a-color:         var(--bdr-accent);
  --md-code-bg-color:           #1F1F23;
  --md-code-fg-color:           #ECEAE3;
}

/* -------- 2. Typography -------- */

:root {
  --md-text-font: "Inter", "Söhne", -apple-system, BlinkMacSystemFont,
                  "Segoe UI", Roboto, sans-serif;
  --md-code-font: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo,
                  Monaco, Consolas, monospace;
}

body, .md-typeset {
  font-family: var(--md-text-font);
  font-feature-settings: "ss01", "cv11";
  font-size: 16px;          /* base for rem math */
  letter-spacing: -0.003em;
}

.md-typeset {
  font-size: .875rem;       /* 14px — Material default behavior */
}

.md-typeset h1,
.md-typeset h2,
.md-typeset h3,
.md-typeset h4 {
  font-family: var(--md-text-font);
  letter-spacing: -0.022em;
  color: var(--bdr-ink);
  font-weight: 700;
  line-height: 1.2;
}

/* Article-page headline scale: tuned to claude.com / openai.com articles. */
.md-typeset h1 {
  font-size: clamp(1.875rem, 2.6vw, 2.375rem);  /* 30 → 38px */
  margin: .25em 0 .6em;
  line-height: 1.15;
  letter-spacing: -0.025em;
}
.md-typeset h2 {
  font-size: clamp(1.25rem, 1.6vw, 1.5rem);     /* 20 → 24px */
  margin-top: 2.25em;
  margin-bottom: .65em;
}
.md-typeset h3 {
  font-size: 1.125rem;                          /* 18px */
  margin-top: 1.75em;
  margin-bottom: .5em;
}
.md-typeset h4 {
  font-size: 1rem;
  margin-top: 1.5em;
}

.md-typeset p,
.md-typeset li {
  color: var(--bdr-ink-2);
  /* Material's root font is 20px from 1220px viewports and 22px from
     1600px, so this is 16-18px of body text, not the 13px it looks like. */
  font-size: .8125rem;
  line-height: 1.65;
}

/* Reading-width constraint for article-body elements, code blocks and
   admonitions included so they line up with the prose. Custom .bdr-*
   blocks (hero / featured / grid / rows / chips) are inside <section>
   wrappers and are NOT direct children, so they remain full-width. */
.md-typeset > p,
.md-typeset > ul,
.md-typeset > ol,
.md-typeset > blockquote,
.md-typeset > pre,
.md-typeset > table,
.md-typeset > h1,
.md-typeset > h2,
.md-typeset > h3,
.md-typeset > h4,
.md-typeset > h5,
.md-typeset > h6,
.md-typeset > hr,
.md-typeset > .highlight,
.md-typeset > .admonition,
.md-typeset > details,
.md-typeset > .tabbed-set {
  /* Material scales the root font with the viewport (20px from 1220px,
     22px from 1600px), so 42rem is 840-924px, centred in the column
     between the two sidebars. */
  max-width: 42rem;
  margin-left: auto;
  margin-right: auto;
}

/* A page outside the nav (a blog post) gets a "lifted" sidebar with no
   active section to show, so the left column renders blank. It stays: it
   mirrors the TOC column and keeps the article centred on the page. The
   grid widens instead, so the text grows and the TOC moves outward. */
@media screen and (min-width: 76.25em) {
  .md-main__inner:not(:has(.md-nav__item--active)) { max-width: 1440px; }
}

/* -------- 3. Header / nav -------- */

/* Logo: one mark per colour scheme (see overrides/partials/logo.html). */
/* Selectors mirror Material's own (header button, drawer title) so they
   win on specificity rather than on load order. */
.md-header__button.md-logo img.bdr-logo--dark,
.md-nav__title .md-nav__button.md-logo img.bdr-logo--dark { display: none; }
[data-md-color-scheme="slate"] .md-header__button.md-logo img.bdr-logo--light,
[data-md-color-scheme="slate"] .md-nav__title .md-nav__button.md-logo img.bdr-logo--light { display: none; }
[data-md-color-scheme="slate"] .md-header__button.md-logo img.bdr-logo--dark,
[data-md-color-scheme="slate"] .md-nav__title .md-nav__button.md-logo img.bdr-logo--dark { display: block; }
.md-header__button.md-logo img { height: 1.45rem; }

.md-header {
  background: rgba(248, 246, 241, 0.78);
  color: var(--bdr-ink);
  box-shadow: none;
  border-bottom: 1px solid var(--bdr-border);
  backdrop-filter: saturate(180%) blur(14px);
  -webkit-backdrop-filter: saturate(180%) blur(14px);
}
[data-md-color-scheme="slate"] .md-header {
  background: rgba(21, 19, 15, 0.78);
  border-bottom: 1px solid var(--bdr-border);
}

.md-header__title { font-weight: 700; letter-spacing: -0.02em; }
.md-header__topic { color: var(--bdr-ink); }

.md-tabs {
  background: transparent;
  color: var(--bdr-ink);
  border-bottom: 1px solid var(--bdr-border);
}
.md-tabs__link {
  color: var(--bdr-ink-2);
  opacity: 1;
  font-size: .85rem;
  font-weight: 500;
  letter-spacing: -0.005em;
  transition: color .15s ease;
}
.md-tabs__link:hover,
.md-tabs__link--active { color: var(--bdr-ink); }
.md-tabs__link--active { font-weight: 600; }

.md-search__form {
  background: var(--bdr-surface);
  border: 1px solid var(--bdr-border);
  border-radius: 999px;
}
.md-search__input { color: var(--bdr-ink); }
.md-search__input::placeholder { color: var(--bdr-ink-3); }

/* -------- 4. Layout base -------- */

.md-main__inner { margin-top: 1.5rem; }
.md-grid { max-width: 1280px; }

.md-content { background: transparent; }
.md-content__inner { padding-top: 1rem; }
.md-content__inner:before { display: none; } /* kill top spacer */

/* Sidebars cleaner */
.md-nav__title { font-weight: 600; letter-spacing: -.01em; }
.md-nav__link { color: var(--bdr-ink-2); }
.md-nav__link--active,
.md-nav__link[for]:hover { color: var(--bdr-accent); }

/* -------- 5. Hero block (used on landing & blog index) -------- */

.bdr-hero {
  padding: 3rem 0 2.25rem;
  border-bottom: 1px solid var(--bdr-border);
  margin-bottom: 2.5rem;
}
.bdr-hero__eyebrow {
  font-size: .72rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .14em;
  color: var(--bdr-accent);
  margin-bottom: .85rem;
}
.bdr-hero__title {
  font-size: clamp(1.875rem, 4vw, 3rem);   /* 30 → 48px */
  font-weight: 700;
  line-height: 1.05;
  letter-spacing: -0.028em;
  color: var(--bdr-ink);
  margin: 0 0 1rem;
}
.bdr-hero__lede {
  font-size: clamp(1rem, 1.2vw, 1.125rem); /* 16 → 18px */
  line-height: 1.55;
  color: var(--bdr-ink-2);
  max-width: 56ch;
  margin: 0 0 1.5rem;
}
.bdr-hero__actions { display: flex; gap: .65rem; flex-wrap: wrap; }
/* Catalog pages: the hero is a header, not a landing. */
.bdr-hero--compact {
  padding: 2rem 0 1.5rem;
  margin-bottom: 1.5rem;
}
.bdr-hero--compact .bdr-hero__lede { margin-bottom: 0; }

.bdr-btn {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  padding: .65rem 1.1rem;
  border-radius: 999px;
  font-weight: 600;
  font-size: .85rem;
  text-decoration: none;
  border: 1px solid transparent;
  transition: all .18s ease;
  letter-spacing: -.005em;
}
.bdr-btn--primary {
  background: var(--bdr-ink);
  color: var(--bdr-bg);
}
.bdr-btn--primary:hover {
  background: var(--bdr-accent);
  color: #fff;
  transform: translateY(-1px);
}
.bdr-btn--ghost {
  background: transparent;
  color: var(--bdr-ink);
  border-color: var(--bdr-border-2);
}
.bdr-btn--ghost:hover {
  background: var(--bdr-surface);
  border-color: var(--bdr-ink);
}

/* -------- 6. Featured post block -------- */

.bdr-featured {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: 2.5rem;
  align-items: center;
  padding: 0 0 3rem;
  margin-bottom: 3rem;
  border-bottom: 1px solid var(--bdr-border);
}
@media (max-width: 768px) {
  .bdr-featured { grid-template-columns: 1fr; gap: 1.5rem; }
}
.bdr-featured__visual {
  aspect-ratio: 16 / 10;
  border-radius: 14px;
  background:
    radial-gradient(circle at 30% 30%, #E5C9B8 0%, transparent 55%),
    radial-gradient(circle at 75% 70%, #C9572C 0%, transparent 50%),
    linear-gradient(135deg, #2B2722 0%, #1A1815 100%);
  position: relative;
  overflow: hidden;
}
.bdr-featured__visual::after {
  content: "";
  position: absolute; inset: 0;
  background: radial-gradient(circle at 50% 100%, rgba(255,255,255,.08), transparent 60%);
}
.bdr-featured__eyebrow {
  font-size: .7rem;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--bdr-accent);
}
.bdr-featured__title {
  font-size: clamp(1.4rem, 2.2vw, 1.875rem);   /* 22 → 30px */
  font-weight: 700;
  letter-spacing: -0.022em;
  line-height: 1.2;
  margin: .65rem 0 .85rem;
  color: var(--bdr-ink);
}
.bdr-featured__title a {
  color: inherit;
  text-decoration: none;
  background-image: linear-gradient(var(--bdr-accent), var(--bdr-accent));
  background-size: 0 2px;
  background-position: 0 100%;
  background-repeat: no-repeat;
  transition: background-size .25s ease;
}
.bdr-featured__title a:hover { background-size: 100% 2px; }
.bdr-featured__lede {
  font-size: .95rem;
  line-height: 1.6;
  color: var(--bdr-ink-2);
  margin: 0 0 1rem;
}
.bdr-featured__meta {
  display: flex; gap: .6rem; align-items: center;
  font-size: .8rem; color: var(--bdr-ink-3);
}

/* -------- 7. Category chips (filter bar) -------- */

.bdr-chips {
  display: flex;
  flex-wrap: wrap;
  gap: .5rem;
  margin: 0 0 2.5rem;
  padding-bottom: 1.5rem;
  border-bottom: 1px solid var(--bdr-border);
}
.bdr-chip {
  display: inline-flex;
  align-items: center;
  padding: .35rem .75rem;
  border-radius: 999px;
  border: 1px solid var(--bdr-border-2);
  background: var(--bdr-surface);
  color: var(--bdr-ink-2);
  font-size: .75rem;
  font-weight: 500;
  text-decoration: none;
  transition: all .15s ease;
  cursor: pointer;
}
/* Material's `.md-typeset a` would paint chips in the accent colour. */
.md-typeset .bdr-chip { color: var(--bdr-ink-2); }
.bdr-chip:hover,
.md-typeset .bdr-chip:hover {
  border-color: var(--bdr-ink);
  color: var(--bdr-ink);
}
.bdr-chip.is-active,
.md-typeset .bdr-chip.is-active {
  background: var(--bdr-ink);
  border-color: var(--bdr-ink);
  color: var(--bdr-bg);
}
.bdr-chips--anchors { margin-bottom: 2rem; }
.bdr-chip__count {
  margin-left: .45rem;
  font-family: var(--md-code-font);
  font-size: .68rem;
  color: var(--bdr-ink-3);
}
.bdr-chip:hover .bdr-chip__count { color: inherit; }

/* -------- 8. Card grid -------- */

.bdr-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 2rem 1.75rem;
  margin: 0 0 4rem;
}
@media (max-width: 1024px) {
  .bdr-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 640px) {
  .bdr-grid { grid-template-columns: 1fr; gap: 2.5rem; }
}

.bdr-card {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  text-decoration: none;
  color: inherit;
  transition: transform .25s ease;
}
.bdr-card:hover { transform: translateY(-3px); }
.bdr-card__visual {
  aspect-ratio: 16 / 10;
  border-radius: 12px;
  overflow: hidden;
  position: relative;
  background: var(--bdr-surface-2);
  border: 1px solid var(--bdr-border);
  transition: border-color .25s ease;
}
.bdr-card:hover .bdr-card__visual { border-color: var(--bdr-ink-2); }

/* Auto-generated thumbnails by category */
.bdr-card__visual--libraries {
  background:
    radial-gradient(circle at 25% 25%, #D6C5B0 0%, transparent 55%),
    linear-gradient(135deg, #6B5842 0%, #2B2722 100%);
}
.bdr-card__visual--tools {
  background:
    radial-gradient(circle at 70% 30%, #E27A4D 0%, transparent 55%),
    linear-gradient(135deg, #3F2A20 0%, #1A1815 100%);
}
.bdr-card__visual--design {
  background:
    radial-gradient(circle at 50% 50%, #B8A78F 0%, transparent 50%),
    linear-gradient(135deg, #4A3F32 0%, #1A1815 100%);
}
.bdr-card__visual--tutorials {
  background:
    radial-gradient(circle at 30% 70%, #C9572C 0%, transparent 50%),
    linear-gradient(135deg, #5A4030 0%, #2B2722 100%);
}
.bdr-card__visual--releases {
  background:
    radial-gradient(circle at 80% 80%, #E5C9B8 0%, transparent 50%),
    linear-gradient(135deg, #2B2722 0%, #15130F 100%);
}
.bdr-card__visual--meta {
  background:
    radial-gradient(circle at 50% 100%, #C9572C 0%, transparent 60%),
    linear-gradient(135deg, #1A1815 0%, #15130F 100%);
}

.bdr-card__eyebrow {
  font-size: .68rem;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--bdr-accent);
}
.bdr-card__title {
  font-size: 1.0625rem;     /* 17px — magazine-card feel */
  font-weight: 700;
  letter-spacing: -0.018em;
  line-height: 1.3;
  color: var(--bdr-ink);
  margin: 0;
}
.bdr-card__lede {
  font-size: .875rem;       /* 14px */
  line-height: 1.55;
  color: var(--bdr-ink-2);
  margin: 0;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.bdr-card__meta {
  font-size: .75rem;
  color: var(--bdr-ink-3);
  margin-top: .15rem;
}

/* -------- 9. Section heading -------- */

.bdr-section-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  margin: 0 0 1.5rem;
  padding-bottom: .65rem;
  border-bottom: 1px solid var(--bdr-border);
}
.bdr-section-head__title {
  font-size: 1.125rem;      /* 18px — section labels, not heroes */
  font-weight: 700;
  letter-spacing: -.015em;
  color: var(--bdr-ink);
  margin: 0;
}
.bdr-section-head__link {
  font-size: .8rem;
  font-weight: 500;
  color: var(--bdr-accent);
  text-decoration: none;
}
.bdr-section-head__link:hover { text-decoration: underline; }
.bdr-section-head__note {
  font-size: .78rem;
  color: var(--bdr-ink-3);
  text-align: right;
}
@media (max-width: 600px) { .bdr-section-head__note { display: none; } }

/* -------- 10. Catalog rows (libraries / tools / home teasers) --------
   One row per package: name + one sentence on the left, version / floor /
   links on the right. The whole row is the docs link (stretched ::after on
   the name); the meta links sit above it so they stay clickable. */

.bdr-catalog { max-width: 64rem; margin: 0 auto; }
.bdr-group[id] { scroll-margin-top: 6.5rem; }

.bdr-rows {
  margin: 0 0 2.5rem;
  border: 1px solid var(--bdr-border);
  border-radius: 12px;
  background: var(--bdr-surface);
  overflow: hidden;
}
.bdr-row {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: .25rem 1.5rem;
  align-items: baseline;
  padding: .8rem 1.1rem;
  transition: background .15s ease;
}
.bdr-row + .bdr-row { border-top: 1px solid var(--bdr-border); }
.bdr-row:hover { background: var(--bdr-surface-2); }
.bdr-row__main { min-width: 0; }
.md-typeset .bdr-row__name,
.md-typeset .bdr-row__name:hover,
.md-typeset .bdr-row__name:focus {
  font-family: var(--md-code-font);
  font-size: .875rem;
  font-weight: 600;
  letter-spacing: -.005em;
  color: var(--bdr-ink);
  text-decoration: none;
}
.bdr-row:hover .bdr-row__name { color: var(--bdr-accent); }
.bdr-row__name::after { content: ""; position: absolute; inset: 0; }
.md-typeset .bdr-row__desc {
  margin: .2rem 0 0;
  font-size: .8125rem;
  line-height: 1.5;
  color: var(--bdr-ink-2);
}
.bdr-row__meta {
  position: relative;       /* above the stretched link */
  z-index: 1;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-end;
  gap: .3rem .7rem;
  font-size: .72rem;
  color: var(--bdr-ink-3);
  white-space: nowrap;
}
.md-typeset .bdr-row__meta a { color: var(--bdr-ink-3); text-decoration: none; }
.md-typeset .bdr-row__meta a:hover { color: var(--bdr-accent); text-decoration: none; }
.md-typeset .bdr-row__version,
.md-typeset .bdr-row__version:hover {
  font-family: var(--md-code-font);
  font-size: .7rem;
  font-weight: 600;
  padding: .12rem .5rem;
  border-radius: 999px;
  background: var(--bdr-surface-2);
  color: var(--bdr-ink-2);
}
.bdr-row:hover .bdr-row__version { background: var(--bdr-accent-soft); }
@media (max-width: 720px) {
  .bdr-row { grid-template-columns: 1fr; }
  .bdr-row__meta { justify-content: flex-start; }
}

/* Block-level links never underline on hover; they change colour instead. */
.md-typeset :is(.bdr-card, .bdr-chip, .bdr-btn):is(:hover, :focus) { text-decoration: none; }

/* -------- 11. Footer --------
   Footer is a consistent dark slab in both themes so the brand colour
   block reads the same. */

.md-footer {
  --footer-bg: #1A1815;
  --footer-fg: #F2EEE5;
  background: var(--footer-bg);
  color: var(--footer-fg);
  margin-top: 4rem;
}
[data-md-color-scheme="slate"] .md-footer {
  --footer-bg: #07070A;
  --footer-fg: #ECEAE3;
}
.md-footer-meta { background: var(--footer-bg); }
.md-footer__inner { padding: 0; }

.bdr-footer {
  display: grid;
  grid-template-columns: 1.4fr repeat(3, 1fr);
  gap: 2.5rem;
  max-width: 1280px;
  margin: 0 auto;
  padding: 3rem 1.25rem 2rem;
  color: var(--footer-fg);
}
@media (max-width: 800px) {
  .bdr-footer { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 480px) {
  .bdr-footer { grid-template-columns: 1fr; }
}
.bdr-footer__mark {
  display: block;
  height: 2rem;
  width: auto;
  margin-bottom: .9rem;
}
.bdr-footer__brand h3 {
  font-size: 1.125rem;
  font-weight: 700;
  letter-spacing: -.02em;
  margin: 0 0 .5rem;
  color: #fff;
}
.bdr-footer__brand p {
  font-size: .8125rem;
  line-height: 1.55;
  color: rgba(255,255,255,.65);
  margin: 0;
  max-width: 38ch;
}
.bdr-footer__col h4 {
  font-size: .68rem;
  text-transform: uppercase;
  letter-spacing: .14em;
  font-weight: 700;
  color: rgba(255,255,255,.5);
  margin: 0 0 .85rem;
}
.bdr-footer__col ul { list-style: none; padding: 0; margin: 0; }
.bdr-footer__col li { margin: .4rem 0; }
.bdr-footer__col a {
  color: rgba(255,255,255,.82);
  text-decoration: none;
  font-size: .8125rem;
  transition: color .15s ease;
}
.bdr-footer__col a:hover { color: var(--bdr-accent); }

.bdr-footer__bottom {
  max-width: 1280px;
  margin: 0 auto;
  padding: 1.25rem 1.25rem;
  border-top: 1px solid rgba(255,255,255,.08);
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
  color: rgba(255,255,255,.5);
  font-size: .75rem;
}

/* -------- 12. Post page (article view) -------- */

.md-typeset a { text-decoration: none; }
.md-typeset a:hover { color: var(--bdr-accent-hover); text-decoration: underline; }

.md-typeset blockquote {
  border-left: 3px solid var(--bdr-accent);
  background: var(--bdr-surface);
  color: var(--bdr-ink-2);
  padding: 1rem 1.25rem;
  border-radius: 0 8px 8px 0;
}

.md-typeset code {
  background: var(--md-code-bg-color);
  color: var(--md-code-fg-color);
  padding: .12em .35em;
  border-radius: 4px;
  font-size: .875em;
}
[data-md-color-scheme="slate"] .md-typeset code {
  /* Tint inline code so it doesn't blend into surface */
  background: #232327;
  border: 1px solid #2A2A2F;
}

.md-typeset pre {
  border-radius: 10px;
  background: var(--md-code-bg-color);
}
.md-typeset pre > code {
  border-radius: 10px;
  border: 1px solid var(--bdr-border);
  font-size: .75rem;         /* 15-16.5px: mono reads bigger than sans */
  line-height: 1.6;
}

.md-typeset table:not([class]) {
  font-size: .875rem;
  border: 1px solid var(--bdr-border);
  border-radius: 12px;
  overflow: hidden;
}
.md-typeset table:not([class]) th {
  background: var(--bdr-surface-2);
  color: var(--bdr-ink);
  font-weight: 600;
}

/* -------- 13. Misc niceties -------- */

.md-typeset hr {
  border: none;
  border-top: 1px solid var(--bdr-border);
  max-width: 42rem;
  margin: 2.5rem auto;
}

::selection {
  background: var(--bdr-accent-soft);
  color: var(--bdr-ink);
}

/* Header search/icon contrast in dark mode */
[data-md-color-scheme="slate"] .md-search__form {
  background: var(--bdr-surface);
  border-color: var(--bdr-border-2);
}
[data-md-color-scheme="slate"] .md-header__button { color: var(--bdr-ink); }

/* Sidebar nav contrast in dark mode */
[data-md-color-scheme="slate"] .md-nav__link { color: var(--bdr-ink-2); }
[data-md-color-scheme="slate"] .md-nav__title { color: var(--bdr-ink); }

/* -------- 15. Per-post card illustrations --------
   Generated by articles-images-prompts/publish_images.py -- do not hand-edit.
   One rule per post, matched on the slug in the card's href, so no listing markup
   carries an image reference. The slate block swaps in the dark-scheme render,
   derived from the same drawing by dark_variant.py. */

.bdr-card__visual,
.bdr-featured__visual,
.bdr-post__hero {
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

/* The article hero. Lines up with the prose column rather than the full grid:
   the body text is capped at 42rem, and an image wider than the paragraphs it
   introduces reads as a banner instead of as part of the article. */
.bdr-post__hero {
  max-width: 42rem;
  margin: 0 auto 2.25rem;
  aspect-ratio: 16 / 10;
  border-radius: 12px;
  border: 1px solid var(--bdr-border);
  background-color: var(--bdr-surface-2);
}

.bdr-card[href*="2026-05-15-transactional-outbox-with-omni-box"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-05-15-transactional-outbox-with-omni-box"] {
  background-image: url("../assets/blog/2026-05-15-transactional-outbox-with-omni-box.webp");
}
.bdr-card[href*="2026-05-28-introducing-mr-review"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-05-28-introducing-mr-review"] {
  background-image: url("../assets/blog/2026-05-28-introducing-mr-review.webp");
}
.bdr-card[href*="2026-05-30-welcome"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-05-30-welcome"] {
  background-image: url("../assets/blog/2026-05-30-welcome.webp");
}
.bdr-card[href*="2026-09-06-pg-partsmith"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-06-pg-partsmith"] {
  background-image: url("../assets/blog/2026-09-06-pg-partsmith.webp");
}
.bdr-card[href*="2026-09-06-timeouts-are-not-deadlines"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-06-timeouts-are-not-deadlines"] {
  background-image: url("../assets/blog/2026-09-06-timeouts-are-not-deadlines.webp");
}
.bdr-card[href*="2026-09-07-ai-code-review-should-not-be-fully-autonomous"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-ai-code-review-should-not-be-fully-autonomous"] {
  background-image: url("../assets/blog/2026-09-07-ai-code-review-should-not-be-fully-autonomous.webp");
}
.bdr-card[href*="2026-09-07-circuit-breakers-should-be-per-origin"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-circuit-breakers-should-be-per-origin"] {
  background-image: url("../assets/blog/2026-09-07-circuit-breakers-should-be-per-origin.webp");
}
.bdr-card[href*="2026-09-07-documentation-for-ai-coding-agents"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-documentation-for-ai-coding-agents"] {
  background-image: url("../assets/blog/2026-09-07-documentation-for-ai-coding-agents.webp");
}
.bdr-card[href*="2026-09-07-exactly-once-effects"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-exactly-once-effects"] {
  background-image: url("../assets/blog/2026-09-07-exactly-once-effects.webp");
}
.bdr-card[href*="2026-09-07-five-alembic-migration-tests"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-five-alembic-migration-tests"] {
  background-image: url("../assets/blog/2026-09-07-five-alembic-migration-tests.webp");
}
.bdr-card[href*="2026-09-07-graceful-kafka-consumer-shutdown"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-graceful-kafka-consumer-shutdown"] {
  background-image: url("../assets/blog/2026-09-07-graceful-kafka-consumer-shutdown.webp");
}
.bdr-card[href*="2026-09-07-graceful-shutdown-is-a-protocol"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-graceful-shutdown-is-a-protocol"] {
  background-image: url("../assets/blog/2026-09-07-graceful-shutdown-is-a-protocol.webp");
}
.bdr-card[href*="2026-09-07-grpc-channels-pooled-by-identity"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-grpc-channels-pooled-by-identity"] {
  background-image: url("../assets/blog/2026-09-07-grpc-channels-pooled-by-identity.webp");
}
.bdr-card[href*="2026-09-07-how-i-start-a-production-grade-python-library"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-how-i-start-a-production-grade-python-library"] {
  background-image: url("../assets/blog/2026-09-07-how-i-start-a-production-grade-python-library.webp");
}
.bdr-card[href*="2026-09-07-how-to-partition-an-existing-postgresql-table"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-how-to-partition-an-existing-postgresql-table"] {
  background-image: url("../assets/blog/2026-09-07-how-to-partition-an-existing-postgresql-table.webp");
}
.bdr-card[href*="2026-09-07-idempotency-across-a-chain-of-microservices"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-idempotency-across-a-chain-of-microservices"] {
  background-image: url("../assets/blog/2026-09-07-idempotency-across-a-chain-of-microservices.webp");
}
.bdr-card[href*="2026-09-07-idempotency-for-jobs-and-consumers"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-idempotency-for-jobs-and-consumers"] {
  background-image: url("../assets/blog/2026-09-07-idempotency-for-jobs-and-consumers.webp");
}
.bdr-card[href*="2026-09-07-idempotency-keys-the-part-everyone-gets-wrong"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-idempotency-keys-the-part-everyone-gets-wrong"] {
  background-image: url("../assets/blog/2026-09-07-idempotency-keys-the-part-everyone-gets-wrong.webp");
}
.bdr-card[href*="2026-09-07-mapping-python-exceptions-to-grpc-status-codes"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-mapping-python-exceptions-to-grpc-status-codes"] {
  background-image: url("../assets/blog/2026-09-07-mapping-python-exceptions-to-grpc-status-codes.webp");
}
.bdr-card[href*="2026-09-07-migrating-from-pg-partman"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-migrating-from-pg-partman"] {
  background-image: url("../assets/blog/2026-09-07-migrating-from-pg-partman.webp");
}
.bdr-card[href*="2026-09-07-one-lifecycle-for-http-grpc-workers-and-cron"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-one-lifecycle-for-http-grpc-workers-and-cron"] {
  background-image: url("../assets/blog/2026-09-07-one-lifecycle-for-http-grpc-workers-and-cron.webp");
}
.bdr-card[href*="2026-09-07-partition-retention-is-not-drop-table"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-partition-retention-is-not-drop-table"] {
  background-image: url("../assets/blog/2026-09-07-partition-retention-is-not-drop-table.webp");
}
.bdr-card[href*="2026-09-07-pgbouncer-transaction-mode-async-sqlalchemy"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-pgbouncer-transaction-mode-async-sqlalchemy"] {
  background-image: url("../assets/blog/2026-09-07-pgbouncer-transaction-mode-async-sqlalchemy.webp");
}
.bdr-card[href*="2026-09-07-publishing-to-pypi-without-api-tokens"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-publishing-to-pypi-without-api-tokens"] {
  background-image: url("../assets/blog/2026-09-07-publishing-to-pypi-without-api-tokens.webp");
}
.bdr-card[href*="2026-09-07-redis-health-checks-ping-is-not-the-whole-story"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-redis-health-checks-ping-is-not-the-whole-story"] {
  background-image: url("../assets/blog/2026-09-07-redis-health-checks-ping-is-not-the-whole-story.webp");
}
.bdr-card[href*="2026-09-07-reliability-is-not-retry-3"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-reliability-is-not-retry-3"] {
  background-image: url("../assets/blog/2026-09-07-reliability-is-not-retry-3.webp");
}
.bdr-card[href*="2026-09-07-retries-can-make-an-outage-worse"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-retries-can-make-an-outage-worse"] {
  background-image: url("../assets/blog/2026-09-07-retries-can-make-an-outage-worse.webp");
}
.bdr-card[href*="2026-09-07-retry-after-backoff-and-jitter"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-retry-after-backoff-and-jitter"] {
  background-image: url("../assets/blog/2026-09-07-retry-after-backoff-and-jitter.webp");
}
.bdr-card[href*="2026-09-07-safe-grpc-retries"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-safe-grpc-retries"] {
  background-image: url("../assets/blog/2026-09-07-safe-grpc-retries.webp");
}
.bdr-card[href*="2026-09-07-should-your-application-create-kafka-topics-on-startup"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-should-your-application-create-kafka-topics-on-startup"] {
  background-image: url("../assets/blog/2026-09-07-should-your-application-create-kafka-topics-on-startup.webp");
}
.bdr-card[href*="2026-09-07-stop-passing-asyncsession-everywhere"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-stop-passing-asyncsession-everywhere"] {
  background-image: url("../assets/blog/2026-09-07-stop-passing-asyncsession-everywhere.webp");
}
.bdr-card[href*="2026-09-07-testing-migrations-with-testcontainers"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-testing-migrations-with-testcontainers"] {
  background-image: url("../assets/blog/2026-09-07-testing-migrations-with-testcontainers.webp");
}
.bdr-card[href*="2026-09-07-the-anatomy-of-a-production-grpc-server"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-the-anatomy-of-a-production-grpc-server"] {
  background-image: url("../assets/blog/2026-09-07-the-anatomy-of-a-production-grpc-server.webp");
}
.bdr-card[href*="2026-09-07-the-production-checklist-for-aiokafka"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-the-production-checklist-for-aiokafka"] {
  background-image: url("../assets/blog/2026-09-07-the-production-checklist-for-aiokafka.webp");
}
.bdr-card[href*="2026-09-07-transactional-inbox"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-transactional-inbox"] {
  background-image: url("../assets/blog/2026-09-07-transactional-inbox.webp");
}
.bdr-card[href*="2026-09-07-transport-independent-errors"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-transport-independent-errors"] {
  background-image: url("../assets/blog/2026-09-07-transport-independent-errors.webp");
}
.bdr-card[href*="2026-09-07-twelve-libraries-one-standard"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-twelve-libraries-one-standard"] {
  background-image: url("../assets/blog/2026-09-07-twelve-libraries-one-standard.webp");
}
.bdr-card[href*="2026-09-07-unit-of-work-in-sqlalchemy-2"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-unit-of-work-in-sqlalchemy-2"] {
  background-image: url("../assets/blog/2026-09-07-unit-of-work-in-sqlalchemy-2.webp");
}
.bdr-card[href*="2026-09-07-uuidv7-as-a-postgresql-partition-key"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-uuidv7-as-a-postgresql-partition-key"] {
  background-image: url("../assets/blog/2026-09-07-uuidv7-as-a-postgresql-partition-key.webp");
}
.bdr-card[href*="2026-09-07-warmup-readiness-and-liveness-are-three-different-things"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-warmup-readiness-and-liveness-are-three-different-things"] {
  background-image: url("../assets/blog/2026-09-07-warmup-readiness-and-liveness-are-three-different-things.webp");
}
.bdr-card[href*="2026-09-07-what-every-microservice-reimplements"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-what-every-microservice-reimplements"] {
  background-image: url("../assets/blog/2026-09-07-what-every-microservice-reimplements.webp");
}
.bdr-card[href*="2026-09-07-what-happens-when-kafka-is-down-for-an-hour"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-what-happens-when-kafka-is-down-for-an-hour"] {
  background-image: url("../assets/blog/2026-09-07-what-happens-when-kafka-is-down-for-an-hour.webp");
}
.bdr-card[href*="2026-09-07-what-to-monitor-in-a-sqlalchemy-connection-pool"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-what-to-monitor-in-a-sqlalchemy-connection-pool"] {
  background-image: url("../assets/blog/2026-09-07-what-to-monitor-in-a-sqlalchemy-connection-pool.webp");
}
.bdr-card[href*="2026-09-07-when-should-redis-fail-open"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-when-should-redis-fail-open"] {
  background-image: url("../assets/blog/2026-09-07-when-should-redis-fail-open.webp");
}
.bdr-card[href*="2026-09-07-why-application-lifecycle-should-not-belong-to-fastapi"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-why-application-lifecycle-should-not-belong-to-fastapi"] {
  background-image: url("../assets/blog/2026-09-07-why-application-lifecycle-should-not-belong-to-fastapi.webp");
}
.bdr-card[href*="2026-09-07-why-grpc-interceptors-break-on-streaming-rpcs"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-why-grpc-interceptors-break-on-streaming-rpcs"] {
  background-image: url("../assets/blog/2026-09-07-why-grpc-interceptors-break-on-streaming-rpcs.webp");
}
.bdr-card[href*="2026-09-07-why-i-stopped-wrapping-http-clients"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-why-i-stopped-wrapping-http-clients"] {
  background-image: url("../assets/blog/2026-09-07-why-i-stopped-wrapping-http-clients.webp");
}
.bdr-card[href*="2026-09-07-your-models-and-your-schema-have-drifted"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-your-models-and-your-schema-have-drifted"] {
  background-image: url("../assets/blog/2026-09-07-your-models-and-your-schema-have-drifted.webp");
}
.bdr-card[href*="2026-09-07-zero-dependency-cores"] .bdr-card__visual,
.bdr-post__hero[data-bdr-post="2026-09-07-zero-dependency-cores"] {
  background-image: url("../assets/blog/2026-09-07-zero-dependency-cores.webp");
}

[data-md-color-scheme="slate"] .bdr-card[href*="2026-05-15-transactional-outbox-with-omni-box"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-05-15-transactional-outbox-with-omni-box"] {
  background-image: url("../assets/blog/2026-05-15-transactional-outbox-with-omni-box-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-05-28-introducing-mr-review"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-05-28-introducing-mr-review"] {
  background-image: url("../assets/blog/2026-05-28-introducing-mr-review-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-05-30-welcome"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-05-30-welcome"] {
  background-image: url("../assets/blog/2026-05-30-welcome-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-06-pg-partsmith"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-06-pg-partsmith"] {
  background-image: url("../assets/blog/2026-09-06-pg-partsmith-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-06-timeouts-are-not-deadlines"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-06-timeouts-are-not-deadlines"] {
  background-image: url("../assets/blog/2026-09-06-timeouts-are-not-deadlines-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-ai-code-review-should-not-be-fully-autonomous"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-ai-code-review-should-not-be-fully-autonomous"] {
  background-image: url("../assets/blog/2026-09-07-ai-code-review-should-not-be-fully-autonomous-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-circuit-breakers-should-be-per-origin"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-circuit-breakers-should-be-per-origin"] {
  background-image: url("../assets/blog/2026-09-07-circuit-breakers-should-be-per-origin-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-documentation-for-ai-coding-agents"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-documentation-for-ai-coding-agents"] {
  background-image: url("../assets/blog/2026-09-07-documentation-for-ai-coding-agents-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-exactly-once-effects"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-exactly-once-effects"] {
  background-image: url("../assets/blog/2026-09-07-exactly-once-effects-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-five-alembic-migration-tests"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-five-alembic-migration-tests"] {
  background-image: url("../assets/blog/2026-09-07-five-alembic-migration-tests-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-graceful-kafka-consumer-shutdown"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-graceful-kafka-consumer-shutdown"] {
  background-image: url("../assets/blog/2026-09-07-graceful-kafka-consumer-shutdown-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-graceful-shutdown-is-a-protocol"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-graceful-shutdown-is-a-protocol"] {
  background-image: url("../assets/blog/2026-09-07-graceful-shutdown-is-a-protocol-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-grpc-channels-pooled-by-identity"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-grpc-channels-pooled-by-identity"] {
  background-image: url("../assets/blog/2026-09-07-grpc-channels-pooled-by-identity-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-how-i-start-a-production-grade-python-library"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-how-i-start-a-production-grade-python-library"] {
  background-image: url("../assets/blog/2026-09-07-how-i-start-a-production-grade-python-library-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-how-to-partition-an-existing-postgresql-table"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-how-to-partition-an-existing-postgresql-table"] {
  background-image: url("../assets/blog/2026-09-07-how-to-partition-an-existing-postgresql-table-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-idempotency-across-a-chain-of-microservices"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-idempotency-across-a-chain-of-microservices"] {
  background-image: url("../assets/blog/2026-09-07-idempotency-across-a-chain-of-microservices-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-idempotency-for-jobs-and-consumers"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-idempotency-for-jobs-and-consumers"] {
  background-image: url("../assets/blog/2026-09-07-idempotency-for-jobs-and-consumers-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-idempotency-keys-the-part-everyone-gets-wrong"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-idempotency-keys-the-part-everyone-gets-wrong"] {
  background-image: url("../assets/blog/2026-09-07-idempotency-keys-the-part-everyone-gets-wrong-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-mapping-python-exceptions-to-grpc-status-codes"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-mapping-python-exceptions-to-grpc-status-codes"] {
  background-image: url("../assets/blog/2026-09-07-mapping-python-exceptions-to-grpc-status-codes-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-migrating-from-pg-partman"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-migrating-from-pg-partman"] {
  background-image: url("../assets/blog/2026-09-07-migrating-from-pg-partman-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-one-lifecycle-for-http-grpc-workers-and-cron"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-one-lifecycle-for-http-grpc-workers-and-cron"] {
  background-image: url("../assets/blog/2026-09-07-one-lifecycle-for-http-grpc-workers-and-cron-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-partition-retention-is-not-drop-table"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-partition-retention-is-not-drop-table"] {
  background-image: url("../assets/blog/2026-09-07-partition-retention-is-not-drop-table-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-pgbouncer-transaction-mode-async-sqlalchemy"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-pgbouncer-transaction-mode-async-sqlalchemy"] {
  background-image: url("../assets/blog/2026-09-07-pgbouncer-transaction-mode-async-sqlalchemy-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-publishing-to-pypi-without-api-tokens"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-publishing-to-pypi-without-api-tokens"] {
  background-image: url("../assets/blog/2026-09-07-publishing-to-pypi-without-api-tokens-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-redis-health-checks-ping-is-not-the-whole-story"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-redis-health-checks-ping-is-not-the-whole-story"] {
  background-image: url("../assets/blog/2026-09-07-redis-health-checks-ping-is-not-the-whole-story-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-reliability-is-not-retry-3"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-reliability-is-not-retry-3"] {
  background-image: url("../assets/blog/2026-09-07-reliability-is-not-retry-3-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-retries-can-make-an-outage-worse"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-retries-can-make-an-outage-worse"] {
  background-image: url("../assets/blog/2026-09-07-retries-can-make-an-outage-worse-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-retry-after-backoff-and-jitter"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-retry-after-backoff-and-jitter"] {
  background-image: url("../assets/blog/2026-09-07-retry-after-backoff-and-jitter-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-safe-grpc-retries"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-safe-grpc-retries"] {
  background-image: url("../assets/blog/2026-09-07-safe-grpc-retries-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-should-your-application-create-kafka-topics-on-startup"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-should-your-application-create-kafka-topics-on-startup"] {
  background-image: url("../assets/blog/2026-09-07-should-your-application-create-kafka-topics-on-startup-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-stop-passing-asyncsession-everywhere"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-stop-passing-asyncsession-everywhere"] {
  background-image: url("../assets/blog/2026-09-07-stop-passing-asyncsession-everywhere-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-testing-migrations-with-testcontainers"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-testing-migrations-with-testcontainers"] {
  background-image: url("../assets/blog/2026-09-07-testing-migrations-with-testcontainers-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-the-anatomy-of-a-production-grpc-server"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-the-anatomy-of-a-production-grpc-server"] {
  background-image: url("../assets/blog/2026-09-07-the-anatomy-of-a-production-grpc-server-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-the-production-checklist-for-aiokafka"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-the-production-checklist-for-aiokafka"] {
  background-image: url("../assets/blog/2026-09-07-the-production-checklist-for-aiokafka-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-transactional-inbox"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-transactional-inbox"] {
  background-image: url("../assets/blog/2026-09-07-transactional-inbox-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-transport-independent-errors"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-transport-independent-errors"] {
  background-image: url("../assets/blog/2026-09-07-transport-independent-errors-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-twelve-libraries-one-standard"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-twelve-libraries-one-standard"] {
  background-image: url("../assets/blog/2026-09-07-twelve-libraries-one-standard-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-unit-of-work-in-sqlalchemy-2"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-unit-of-work-in-sqlalchemy-2"] {
  background-image: url("../assets/blog/2026-09-07-unit-of-work-in-sqlalchemy-2-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-uuidv7-as-a-postgresql-partition-key"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-uuidv7-as-a-postgresql-partition-key"] {
  background-image: url("../assets/blog/2026-09-07-uuidv7-as-a-postgresql-partition-key-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-warmup-readiness-and-liveness-are-three-different-things"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-warmup-readiness-and-liveness-are-three-different-things"] {
  background-image: url("../assets/blog/2026-09-07-warmup-readiness-and-liveness-are-three-different-things-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-what-every-microservice-reimplements"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-what-every-microservice-reimplements"] {
  background-image: url("../assets/blog/2026-09-07-what-every-microservice-reimplements-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-what-happens-when-kafka-is-down-for-an-hour"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-what-happens-when-kafka-is-down-for-an-hour"] {
  background-image: url("../assets/blog/2026-09-07-what-happens-when-kafka-is-down-for-an-hour-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-what-to-monitor-in-a-sqlalchemy-connection-pool"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-what-to-monitor-in-a-sqlalchemy-connection-pool"] {
  background-image: url("../assets/blog/2026-09-07-what-to-monitor-in-a-sqlalchemy-connection-pool-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-when-should-redis-fail-open"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-when-should-redis-fail-open"] {
  background-image: url("../assets/blog/2026-09-07-when-should-redis-fail-open-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-why-application-lifecycle-should-not-belong-to-fastapi"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-why-application-lifecycle-should-not-belong-to-fastapi"] {
  background-image: url("../assets/blog/2026-09-07-why-application-lifecycle-should-not-belong-to-fastapi-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-why-grpc-interceptors-break-on-streaming-rpcs"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-why-grpc-interceptors-break-on-streaming-rpcs"] {
  background-image: url("../assets/blog/2026-09-07-why-grpc-interceptors-break-on-streaming-rpcs-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-why-i-stopped-wrapping-http-clients"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-why-i-stopped-wrapping-http-clients"] {
  background-image: url("../assets/blog/2026-09-07-why-i-stopped-wrapping-http-clients-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-your-models-and-your-schema-have-drifted"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-your-models-and-your-schema-have-drifted"] {
  background-image: url("../assets/blog/2026-09-07-your-models-and-your-schema-have-drifted-dark.webp");
}
[data-md-color-scheme="slate"] .bdr-card[href*="2026-09-07-zero-dependency-cores"] .bdr-card__visual,
[data-md-color-scheme="slate"] .bdr-post__hero[data-bdr-post="2026-09-07-zero-dependency-cores"] {
  background-image: url("../assets/blog/2026-09-07-zero-dependency-cores-dark.webp");
}
