/* ============================================================
   Ujeebu v3 — content surface (blog + docs)
   Shared styles for /blog and /docs reading experiences. Loaded
   from each content view via <link href="/css/v3/content.css">.
   Mirrors the editorial / engineering blog feel: tight type,
   accent orange used sparingly, generous whitespace.
   ============================================================ */

/* ------------------------------------------------------------
   Shared layout chrome
   ------------------------------------------------------------ */
.ujc-wrap {
  max-width: 1180px;
  margin: 0 auto;
  padding: 0 28px;
}
.ujc-wrap--narrow { max-width: 760px; }
.ujc-wrap--mid    { max-width: 980px; }

.ujc-hero {
  padding: 96px 0 56px;
  border-bottom: 1px solid var(--uj-line);
}
.ujc-hero__lede {
  margin-top: 18px;
  max-width: 640px;
  font-family: var(--uj-sans);
  font-size: 18px;
  line-height: 1.55;
  color: var(--uj-muted);
}
.ujc-hero__eyebrow { margin-bottom: 14px; }

.ujc-back {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--uj-mono);
  font-size: 12px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--uj-muted);
  text-decoration: none;
}
.ujc-back:hover { color: var(--uj-accent); }

/* ------------------------------------------------------------
   Blog index — card grid
   ------------------------------------------------------------ */
.ujc-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  /* gap is `row column` — bumped row gap so cards don't feel crammed
     vertically. Column gap stays tight since cards are already 1fr-wide. */
  gap: 56px 32px;
  padding: 56px 0 32px;
}
@media (max-width: 760px) {
  .ujc-grid { grid-template-columns: 1fr; gap: 40px; }
  .ujc-hero { padding: 64px 0 40px; }
}

.ujc-card {
  display: flex;
  flex-direction: column;
  text-decoration: none;
  color: inherit;
  group: card;
}
.ujc-card__media {
  position: relative;
  aspect-ratio: 16 / 9;
  border-radius: 14px;
  overflow: hidden;
  background: var(--uj-line2);
  border: 1px solid var(--uj-line);
  margin-bottom: 22px;
  transition: transform .25s ease, border-color .15s ease;
}
.ujc-card:hover .ujc-card__media {
  border-color: #FED7AA;
  transform: translateY(-2px);
}
.ujc-card__media img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}
/* Gradient + monogram fallback when no cover image */
.ujc-card__media--fallback {
  background: linear-gradient(135deg, #FFF7ED 0%, #FFE9D8 45%, #FED7AA 100%);
}
.ujc-card__media--fallback::after {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    radial-gradient(circle at 22% 28%, rgba(249,115,22,.18) 0, transparent 35%),
    radial-gradient(circle at 78% 72%, rgba(234,88,12,.16) 0, transparent 40%);
}
.ujc-card__monogram {
  position: absolute;
  bottom: 18px;
  left: 22px;
  font-family: var(--uj-mono);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--uj-accent-ink);
  z-index: 1;
}
.ujc-card__tags {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 10px;
}
.ujc-tag {
  font-family: var(--uj-mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--uj-accent-ink);
  background: var(--uj-accent-soft);
  padding: 3px 9px;
  border-radius: 999px;
}
.ujc-card__title {
  font-family: var(--uj-sans);
  font-size: 22px;
  font-weight: 600;
  line-height: 1.25;
  letter-spacing: -0.015em;
  color: var(--uj-ink);
  margin: 0 0 10px;
}
.ujc-card:hover .ujc-card__title { color: var(--uj-accent); }
.ujc-card__excerpt {
  font-family: var(--uj-sans);
  font-size: 15px;
  line-height: 1.6;
  color: var(--uj-muted);
  margin: 0 0 14px;
}
.ujc-card__meta {
  font-family: var(--uj-mono);
  font-size: 11.5px;
  color: var(--uj-muted2);
  letter-spacing: .04em;
  text-transform: uppercase;
}
.ujc-card__meta span + span::before {
  content: "·";
  margin: 0 8px;
  color: var(--uj-line);
}

.ujc-empty {
  padding: 80px 0;
  text-align: center;
  color: var(--uj-muted);
  font-family: var(--uj-sans);
}

/* ------------------------------------------------------------
   Pagination
   ------------------------------------------------------------ */
.ujc-pager {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 12px;
  padding: 56px 0 96px;
  font-family: var(--uj-mono);
  font-size: 13px;
}
.ujc-pager a,
.ujc-pager span {
  display: inline-flex;
  align-items: center;
  height: 36px;
  padding: 0 14px;
  border-radius: 8px;
  text-decoration: none;
}
.ujc-pager a {
  color: var(--uj-ink);
  border: 1px solid var(--uj-line);
  background: #fff;
  transition: border-color .15s, color .15s, background .15s;
}
.ujc-pager a:hover { border-color: var(--uj-accent); color: var(--uj-accent); }
.ujc-pager__cur { color: var(--uj-muted); }

/* ------------------------------------------------------------
   Blog post header
   ------------------------------------------------------------ */
.ujc-post {
  padding: 56px 0 96px;
}
.ujc-post__head {
  margin-bottom: 36px;
}
.ujc-post__title {
  font-family: var(--uj-sans);
  font-size: clamp(34px, 4vw, 48px);
  line-height: 1.1;
  letter-spacing: -0.025em;
  font-weight: 700;
  color: var(--uj-ink);
  margin: 22px 0 18px;
  text-wrap: balance;
}
.ujc-post__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 14px;
  font-family: var(--uj-mono);
  font-size: 12px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--uj-muted);
}
.ujc-post__meta .ujc-dot { color: var(--uj-line); }
.ujc-post__cover {
  width: 100%;
  border-radius: 16px;
  border: 1px solid var(--uj-line);
  margin: 8px 0 40px;
  display: block;
  aspect-ratio: 16 / 9;
  object-fit: cover;
}
.ujc-post__foot {
  margin-top: 64px;
  padding-top: 32px;
  border-top: 1px solid var(--uj-line);
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 14px;
}

/* ------------------------------------------------------------
   Prose typography — shared by blog posts + doc pages
   ------------------------------------------------------------ */
.ujc-prose {
  font-family: var(--uj-sans);
  font-size: 17px;
  line-height: 1.75;
  color: var(--uj-ink2);
}
.ujc-prose > *:first-child { margin-top: 0; }
.ujc-prose > *:last-child  { margin-bottom: 0; }

.ujc-prose h1,
.ujc-prose h2,
.ujc-prose h3,
.ujc-prose h4 {
  font-family: var(--uj-sans);
  color: var(--uj-ink);
  letter-spacing: -0.02em;
  line-height: 1.25;
  margin: 2em 0 .55em;
  text-wrap: balance;
}
.ujc-prose h2 {
  font-size: 28px;
  font-weight: 700;
  padding-bottom: 8px;
  border-bottom: 1px solid var(--uj-line);
}
.ujc-prose h3 { font-size: 22px; font-weight: 600; }
.ujc-prose h4 { font-size: 18px; font-weight: 600; }

.ujc-prose p,
.ujc-prose ul,
.ujc-prose ol { margin: 1.1em 0; }
.ujc-prose ul, .ujc-prose ol { padding-left: 1.4em; }
.ujc-prose li { margin: .35em 0; }
.ujc-prose li::marker { color: var(--uj-muted2); }

.ujc-prose a {
  color: var(--uj-accent);
  text-decoration: underline;
  text-decoration-color: rgba(249,115,22,.35);
  text-underline-offset: 3px;
  text-decoration-thickness: 1.5px;
}
.ujc-prose a:hover { text-decoration-color: var(--uj-accent); }

.ujc-prose strong { color: var(--uj-ink); font-weight: 600; }
.ujc-prose em     { color: var(--uj-ink2); }
.ujc-prose hr {
  border: 0;
  border-top: 1px solid var(--uj-line);
  margin: 2.5em 0;
}

/* Inline code */
.ujc-prose code:not(pre code) {
  font-family: var(--uj-mono);
  font-size: 0.86em;
  background: var(--uj-line2);
  color: var(--uj-accent-ink);
  padding: 2px 6px;
  border-radius: 5px;
  border: 1px solid var(--uj-line);
}

/* Code blocks */
.ujc-prose pre,
.ujc-prose pre[class*="language-"] {
  position: relative;
  background: #0B0F19;
  color: #E5E7EB;
  padding: 22px 22px;
  border-radius: 12px;
  overflow-x: auto;
  font-family: var(--uj-mono);
  font-size: 13.5px;
  line-height: 1.65;
  margin: 1.6em 0;
  border: 1px solid #1F2937;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.02);
}
.ujc-prose pre code,
.ujc-prose pre[class*="language-"] code {
  background: transparent;
  color: inherit;
  padding: 0;
  border: 0;
  font-size: inherit;
}

/* Copy button */
.ujc-copy {
  position: absolute;
  top: 10px;
  right: 10px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 28px;
  padding: 0 10px;
  background: rgba(255,255,255,.06);
  border: 1px solid rgba(255,255,255,.12);
  color: #E5E7EB;
  font-family: var(--uj-mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: .04em;
  text-transform: uppercase;
  border-radius: 6px;
  cursor: pointer;
  opacity: 0;
  transition: opacity .15s, background .15s, color .15s, border-color .15s;
}
.ujc-prose pre:hover .ujc-copy,
.ujc-prose pre:focus-within .ujc-copy { opacity: 1; }
.ujc-copy:hover { background: rgba(249,115,22,.15); border-color: rgba(249,115,22,.4); color: #FED7AA; }
.ujc-copy.is-copied { background: rgba(16,185,129,.15); border-color: rgba(16,185,129,.4); color: #6EE7B7; opacity: 1; }

/* Blockquote — orange left bar */
.ujc-prose blockquote {
  border-left: 3px solid var(--uj-accent);
  background: var(--uj-accent-soft);
  padding: 14px 20px;
  margin: 1.6em 0;
  border-radius: 0 10px 10px 0;
  color: var(--uj-ink2);
}
.ujc-prose blockquote p:first-child { margin-top: 0; }
.ujc-prose blockquote p:last-child  { margin-bottom: 0; }

/* Tables */
.ujc-prose table {
  width: 100%;
  margin: 1.8em 0;
  border-collapse: collapse;
  font-size: 14.5px;
  border: 1px solid var(--uj-line);
  border-radius: 10px;
  overflow: hidden;
}
.ujc-prose th,
.ujc-prose td {
  padding: 11px 16px;
  text-align: left;
  border-bottom: 1px solid var(--uj-line);
}
.ujc-prose th {
  background: var(--uj-paper);
  font-weight: 600;
  font-size: 12.5px;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--uj-muted);
}
.ujc-prose tr:last-child td { border-bottom: 0; }
.ujc-prose tr:hover td { background: var(--uj-paper); }

/* Images */
.ujc-prose img {
  max-width: 100%;
  height: auto;
  border-radius: 12px;
  border: 1px solid var(--uj-line);
  margin: 1.6em 0;
  display: block;
}
.ujc-prose figure { margin: 1.6em 0; }
.ujc-prose figcaption {
  margin-top: 10px;
  font-family: var(--uj-mono);
  font-size: 12px;
  color: var(--uj-muted);
  text-align: center;
}

/* Keyboard / kbd */
.ujc-prose kbd {
  font-family: var(--uj-mono);
  font-size: 12px;
  padding: 2px 6px;
  background: #fff;
  border: 1px solid var(--uj-line);
  border-bottom-width: 2px;
  border-radius: 5px;
  color: var(--uj-ink);
}

/* ------------------------------------------------------------
   Docs landing — category cards
   ------------------------------------------------------------ */
.ujc-search {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: 32px;
  padding: 14px 18px;
  max-width: 540px;
  background: #fff;
  border: 1px solid var(--uj-line);
  border-radius: 12px;
  box-shadow: var(--uj-shadow-card);
}
.ujc-search__icon {
  width: 18px; height: 18px;
  flex-shrink: 0;
  color: var(--uj-muted2);
}
.ujc-search input {
  flex: 1;
  border: 0;
  outline: 0;
  background: transparent;
  font-family: var(--uj-sans);
  font-size: 15px;
  color: var(--uj-ink);
}
.ujc-search input::placeholder { color: var(--uj-muted2); }
.ujc-search__hint {
  font-family: var(--uj-mono);
  font-size: 11px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--uj-muted2);
  background: var(--uj-line2);
  padding: 3px 8px;
  border-radius: 5px;
}

.ujc-cat-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 22px;
  padding: 56px 0 96px;
}
@media (max-width: 760px) { .ujc-cat-grid { grid-template-columns: 1fr; } }

.ujc-cat-card {
  display: flex;
  flex-direction: column;
  background: #fff;
  border: 1px solid var(--uj-line);
  border-radius: 16px;
  padding: 28px;
  transition: border-color .15s, transform .15s, box-shadow .15s;
}
.ujc-cat-card:hover {
  border-color: #FED7AA;
  transform: translateY(-2px);
  box-shadow: 0 12px 30px rgba(15,23,42,.05);
}
.ujc-cat-card__head {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 18px;
}
.ujc-cat-card__title {
  font-family: var(--uj-sans);
  font-size: 19px;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--uj-ink);
  text-transform: capitalize;
  margin: 0;
}
.ujc-cat-card__count {
  font-family: var(--uj-mono);
  font-size: 11px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--uj-muted);
  margin-left: auto;
}
.ujc-cat-card__list {
  list-style: none;
  padding: 0;
  margin: 0 0 18px;
}
.ujc-cat-card__list li { margin: 6px 0; }
.ujc-cat-card__list a {
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: var(--uj-sans);
  font-size: 14px;
  color: var(--uj-ink2);
  text-decoration: none;
  padding: 6px 0;
}
.ujc-cat-card__list a:hover { color: var(--uj-accent); }
.ujc-cat-card__list a::before {
  content: "›";
  color: var(--uj-muted2);
  font-family: var(--uj-mono);
  font-size: 14px;
}
.ujc-cat-card__list a:hover::before { color: var(--uj-accent); }
.ujc-cat-card__more {
  display: inline-flex;
  align-items: center;
  margin-top: auto;
  align-self: flex-start;
  font-family: var(--uj-mono);
  font-size: 12px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--uj-accent);
  text-decoration: none;
  border-top: 1px solid var(--uj-line);
  padding-top: 14px;
  width: 100%;
}
.ujc-cat-card__more:hover { color: var(--uj-accent2); }

/* ------------------------------------------------------------
   Docs category — linear list
   ------------------------------------------------------------ */
.ujc-doc-list {
  list-style: none;
  margin: 40px 0 96px;
  padding: 0;
  border-top: 1px solid var(--uj-line);
}
.ujc-doc-list li { border-bottom: 1px solid var(--uj-line); }
.ujc-doc-list a {
  display: block;
  padding: 24px 4px;
  text-decoration: none;
  color: inherit;
  transition: padding .15s;
}
.ujc-doc-list a:hover { padding-left: 12px; }
.ujc-doc-list__index {
  font-family: var(--uj-mono);
  font-size: 11px;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--uj-muted2);
  margin-right: 14px;
}
.ujc-doc-list__title {
  font-family: var(--uj-sans);
  font-size: 19px;
  font-weight: 600;
  color: var(--uj-ink);
  letter-spacing: -0.01em;
}
.ujc-doc-list a:hover .ujc-doc-list__title { color: var(--uj-accent); }
.ujc-doc-list__excerpt {
  margin-top: 8px;
  font-family: var(--uj-sans);
  font-size: 15px;
  line-height: 1.55;
  color: var(--uj-muted);
}

/* ------------------------------------------------------------
   Doc page — two-column layout
   ------------------------------------------------------------ */
.ujc-doc-shell {
  display: grid;
  grid-template-columns: 240px minmax(0, 1fr);
  gap: 56px;
  padding: 48px 0 96px;
}
@media (max-width: 960px) {
  .ujc-doc-shell { grid-template-columns: 1fr; gap: 0; }
}

.ujc-side {
  position: sticky;
  top: 96px;
  align-self: start;
  font-family: var(--uj-sans);
}
@media (max-width: 960px) {
  .ujc-side {
    position: static;
    margin-bottom: 32px;
    padding: 18px;
    background: var(--uj-paper);
    border: 1px solid var(--uj-line);
    border-radius: 12px;
  }
  .ujc-side > details { margin: 0; }
  .ujc-side > details > summary {
    cursor: pointer;
    list-style: none;
    font-family: var(--uj-mono);
    font-size: 12px;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--uj-ink);
    font-weight: 600;
    padding: 4px 0;
  }
  .ujc-side > details[open] > summary { margin-bottom: 14px; }
}

.ujc-side__back {
  display: inline-flex;
  margin-bottom: 18px;
  font-family: var(--uj-mono);
  font-size: 11.5px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--uj-muted);
  text-decoration: none;
}
.ujc-side__back:hover { color: var(--uj-accent); }
.ujc-side__cat {
  font-family: var(--uj-mono);
  font-size: 11px;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--uj-accent);
  font-weight: 600;
  margin-bottom: 14px;
}
.ujc-side__nav {
  list-style: none;
  padding: 0;
  margin: 0;
  border-left: 1px solid var(--uj-line);
}
.ujc-side__nav a {
  display: block;
  padding: 8px 14px;
  font-size: 14px;
  color: var(--uj-ink2);
  text-decoration: none;
  border-left: 2px solid transparent;
  margin-left: -1px;
  line-height: 1.4;
  transition: color .12s, border-color .12s, background .12s;
}
.ujc-side__nav a:hover { color: var(--uj-accent); }
.ujc-side__nav a.is-current {
  color: var(--uj-accent);
  border-left-color: var(--uj-accent);
  font-weight: 600;
  background: linear-gradient(90deg, var(--uj-accent-soft), transparent 80%);
}

.ujc-doc-main { min-width: 0; }
.ujc-crumbs {
  font-family: var(--uj-mono);
  font-size: 11.5px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--uj-muted);
  margin-bottom: 14px;
}
.ujc-crumbs a { color: var(--uj-muted); text-decoration: none; }
.ujc-crumbs a:hover { color: var(--uj-accent); }
.ujc-crumbs span { color: var(--uj-line); margin: 0 8px; }
.ujc-doc-main__title {
  font-family: var(--uj-sans);
  font-size: clamp(30px, 3vw, 40px);
  line-height: 1.15;
  letter-spacing: -0.025em;
  font-weight: 700;
  color: var(--uj-ink);
  margin: 0 0 32px;
  text-wrap: balance;
}

.ujc-doc-foot {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  margin-top: 72px;
  padding-top: 32px;
  border-top: 1px solid var(--uj-line);
}
@media (max-width: 560px) { .ujc-doc-foot { grid-template-columns: 1fr; } }

.ujc-doc-foot a {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 18px 20px;
  background: #fff;
  border: 1px solid var(--uj-line);
  border-radius: 12px;
  text-decoration: none;
  color: inherit;
  transition: border-color .15s, transform .15s;
}
.ujc-doc-foot a:hover { border-color: var(--uj-accent); transform: translateY(-2px); }
.ujc-doc-foot a.is-next { text-align: right; align-items: flex-end; }
.ujc-doc-foot__label {
  font-family: var(--uj-mono);
  font-size: 11px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--uj-muted);
}
.ujc-doc-foot__title {
  font-family: var(--uj-sans);
  font-size: 15.5px;
  font-weight: 600;
  color: var(--uj-ink);
  letter-spacing: -0.01em;
}
.ujc-doc-foot a:hover .ujc-doc-foot__title { color: var(--uj-accent); }

/* ------------------------------------------------------------
   Docs conversion CTA
   Subtle warm card, sits above the prev/next foot nav on every
   real doc page (not on /docs or section landings).
   ------------------------------------------------------------ */
.ujc-docs-cta {
  margin: 56px 0 0;
  padding: 28px 32px;
  background:
    radial-gradient(120% 140% at 0% 0%, rgba(249,115,22,0.07) 0%, rgba(249,115,22,0) 55%),
    var(--uj-paper, #FFFBF5);
  border: 1px solid var(--uj-line);
  border-left: 3px solid var(--uj-accent);
  border-radius: 14px;
}
.ujc-docs-cta__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 28px;
  flex-wrap: wrap;
}
.ujc-docs-cta__copy { flex: 1 1 320px; min-width: 0; }
.ujc-docs-cta__eyebrow {
  font-family: var(--uj-mono);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--uj-accent);
  margin-bottom: 6px;
}
.ujc-docs-cta__title {
  font-family: var(--uj-sans);
  font-size: 20px;
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--uj-ink);
  margin: 0 0 4px;
  line-height: 1.25;
}
.ujc-docs-cta__lede {
  margin: 0;
  font-size: 14px;
  line-height: 1.55;
  color: var(--uj-muted);
}
.ujc-docs-cta__lede strong { color: var(--uj-ink); font-weight: 600; }
.ujc-docs-cta__actions {
  display: flex;
  align-items: center;
  gap: 16px;
  flex-shrink: 0;
}
.ujc-docs-cta__secondary {
  font-family: var(--uj-sans);
  font-size: 13.5px;
  font-weight: 600;
  color: var(--uj-muted);
  text-decoration: none;
  transition: color .15s;
}
.ujc-docs-cta__secondary:hover { color: var(--uj-accent); }
@media (max-width: 640px) {
  .ujc-docs-cta { padding: 22px 20px; }
  .ujc-docs-cta__title { font-size: 18px; }
  .ujc-docs-cta__actions { flex-direction: column; align-items: flex-start; gap: 10px; width: 100%; }
}

/* Mini variant — pinned to the bottom of the sticky sidebar. Compact
   vertical card so it doesn't dominate the TOC area. Hidden when the
   sidebar collapses (mobile) because the full bottom card kicks in there. */
.ujc-docs-cta-mini {
  flex-shrink: 0;
  padding: 14px 16px;
  background:
    radial-gradient(120% 140% at 0% 0%, rgba(249,115,22,0.10) 0%, rgba(249,115,22,0) 60%),
    var(--uj-paper, #FFFBF5);
  border: 1px solid var(--uj-line);
  border-left: 3px solid var(--uj-accent);
  border-radius: 12px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.ujc-docs-cta-mini__eyebrow {
  font-family: var(--uj-mono);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--uj-accent);
}
.ujc-docs-cta-mini__title {
  font-family: var(--uj-sans);
  font-size: 14.5px;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--uj-ink);
  line-height: 1.3;
}
.ujc-docs-cta-mini__body {
  font-family: var(--uj-sans);
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--uj-muted);
  margin-bottom: 4px;
}
.ujc-docs-cta-mini__btn { margin-top: 4px; width: 100%; }
.ujc-docs-cta-mini__secondary {
  font-family: var(--uj-sans);
  font-size: 12px;
  font-weight: 600;
  color: var(--uj-muted);
  text-decoration: none;
  text-align: center;
  padding-top: 2px;
  transition: color .15s;
}
.ujc-docs-cta-mini__secondary:hover { color: var(--uj-accent); }
@media (max-width: 1100px) {
  /* Sidebar collapses below this width — let the full bottom card carry it. */
  .ujc-docs-cta-mini { display: none; }
}

/* ------------------------------------------------------------
   404
   ------------------------------------------------------------ */
.ujc-404 {
  max-width: 600px;
  margin: 0 auto;
  padding: 140px 28px 160px;
  text-align: center;
}
.ujc-404__code {
  font-family: var(--uj-mono);
  font-size: 88px;
  font-weight: 600;
  line-height: 1;
  letter-spacing: -0.04em;
  color: var(--uj-accent);
  margin-bottom: 36px;
}
.ujc-404__title {
  font-family: var(--uj-sans);
  font-size: clamp(28px, 3vw, 38px);
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--uj-ink);
  margin: 0 0 24px;
}
.ujc-404__body {
  font-family: var(--uj-sans);
  font-size: 16px;
  line-height: 1.65;
  color: var(--uj-muted);
  margin-bottom: 44px;
}
.ujc-404__body code {
  font-family: var(--uj-mono);
  font-size: 14px;
  background: var(--uj-line2);
  color: var(--uj-ink);
  padding: 2px 8px;
  border-radius: 5px;
  border: 1px solid var(--uj-line);
}
.ujc-404__actions {
  display: inline-flex;
  gap: 12px;
  flex-wrap: wrap;
  justify-content: center;
}

/* ------------------------------------------------------------
   Prism tomorrow override on our dark background.
   The prism.bundle.js loaded in front-v3.lyt.php doesn't ship
   theme CSS — we provide the token colors here so highlighted
   <code class="language-*"> blocks render correctly on the
   #0B0F19 surface used by .ujc-prose pre.
   ------------------------------------------------------------ */
.ujc-prose pre[class*="language-"] .token.comment,
.ujc-prose pre[class*="language-"] .token.prolog,
.ujc-prose pre[class*="language-"] .token.doctype,
.ujc-prose pre[class*="language-"] .token.cdata { color: #6B7280; font-style: italic; }
.ujc-prose pre[class*="language-"] .token.punctuation { color: #9CA3AF; }
.ujc-prose pre[class*="language-"] .token.namespace { opacity: .7; }
.ujc-prose pre[class*="language-"] .token.tag,
.ujc-prose pre[class*="language-"] .token.attr-name,
.ujc-prose pre[class*="language-"] .token.boolean,
.ujc-prose pre[class*="language-"] .token.number,
.ujc-prose pre[class*="language-"] .token.constant,
.ujc-prose pre[class*="language-"] .token.symbol,
.ujc-prose pre[class*="language-"] .token.deleted { color: #FB923C; }
.ujc-prose pre[class*="language-"] .token.selector,
.ujc-prose pre[class*="language-"] .token.attr-value,
.ujc-prose pre[class*="language-"] .token.string,
.ujc-prose pre[class*="language-"] .token.char,
.ujc-prose pre[class*="language-"] .token.builtin,
.ujc-prose pre[class*="language-"] .token.inserted { color: #86EFAC; }
.ujc-prose pre[class*="language-"] .token.operator,
.ujc-prose pre[class*="language-"] .token.entity,
.ujc-prose pre[class*="language-"] .token.url,
.ujc-prose pre[class*="language-"] .language-css .token.string,
.ujc-prose pre[class*="language-"] .style .token.string,
.ujc-prose pre[class*="language-"] .token.variable { color: #93C5FD; }
.ujc-prose pre[class*="language-"] .token.atrule,
.ujc-prose pre[class*="language-"] .token.attr-value,
.ujc-prose pre[class*="language-"] .token.function,
.ujc-prose pre[class*="language-"] .token.class-name { color: #FCD34D; }
.ujc-prose pre[class*="language-"] .token.keyword { color: #F472B6; }
.ujc-prose pre[class*="language-"] .token.regex,
.ujc-prose pre[class*="language-"] .token.important { color: #FDE68A; }
.ujc-prose pre[class*="language-"] .token.important,
.ujc-prose pre[class*="language-"] .token.bold { font-weight: 700; }
.ujc-prose pre[class*="language-"] .token.italic { font-style: italic; }

/* ============================================================
 *  Docs hierarchy v2: section landing cards, 3-section nav,
 *  in-page TOC sidebar, page-list cards.
 * ============================================================ */

/* /docs main grid — three section cards */
.ujc-docs-main { padding: 16px 24px 96px; }
.ujc-section-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 20px; margin-top: 8px;
}
.ujc-section-card {
  display: flex; flex-direction: column; gap: 12px;
  padding: 24px; border: 1px solid var(--uj-line, #E5E7EB);
  border-radius: 14px; background: #fff;
  text-decoration: none; color: inherit;
  transition: border-color .15s, transform .15s, box-shadow .15s;
}
.ujc-section-card:hover {
  border-color: var(--uj-accent, #F97316);
  transform: translateY(-2px);
  box-shadow: 0 6px 18px rgba(15,23,42,.06);
}
.ujc-section-card__head {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
}
.ujc-section-card__title {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 19px; font-weight: 700; letter-spacing: -0.01em;
  color: var(--uj-ink, #111827);
}
.ujc-section-card__count {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 11px; color: var(--uj-muted, #6B7280);
  text-transform: uppercase; letter-spacing: .06em;
}
.ujc-section-card__desc {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 14px; line-height: 1.55; color: var(--uj-muted, #6B7280);
  margin: 0;
}
.ujc-section-card__more {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 12px; color: var(--uj-accent, #F97316);
  text-transform: uppercase; letter-spacing: .06em; font-weight: 600;
  margin-top: 4px;
}

/* Sidebar: small cross-section hop nav at the top */
.ujc-doc-side__sections {
  display: flex; flex-wrap: wrap; gap: 4px;
  padding-bottom: 16px; margin-bottom: 16px;
  border-bottom: 1px solid var(--uj-line, #E5E7EB);
}
.ujc-doc-side__section {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 11px; text-transform: uppercase; letter-spacing: .06em;
  padding: 6px 10px; border-radius: 6px;
  color: var(--uj-muted, #6B7280); text-decoration: none;
  transition: background .15s, color .15s;
}
.ujc-doc-side__section:hover { background: var(--uj-paper, #F9FAFB); color: var(--uj-ink, #111827); }
.ujc-doc-side__section.is-current {
  background: var(--uj-accent-soft, #FFF7ED);
  color: var(--uj-accent-ink, #9A3412);
}

/* In-page TOC */
.ujc-doc-toc {
  display: flex; flex-direction: column; gap: 2px;
  margin-bottom: 28px;
}
.ujc-doc-toc__link {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 13.5px; line-height: 1.5;
  padding: 6px 12px; border-left: 2px solid transparent;
  margin-left: -2px;
  color: var(--uj-ink2, #1F2937); text-decoration: none;
  transition: color .15s, border-color .15s, background .15s;
}
.ujc-doc-toc__link--h3 { padding-left: 26px; font-size: 13px; color: var(--uj-muted, #6B7280); }
.ujc-doc-toc__link:hover {
  color: var(--uj-accent, #F97316);
  border-left-color: var(--uj-accent, #F97316);
}

/* Page list cards on section landing */
.ujc-page-list { list-style: none; padding: 0; margin: 24px 0 0; display: grid; gap: 12px; }
.ujc-page-list__item {
  display: block; padding: 18px 20px;
  border: 1px solid var(--uj-line, #E5E7EB); border-radius: 12px;
  background: #fff; text-decoration: none; color: inherit;
  transition: border-color .15s, transform .15s;
}
.ujc-page-list__item:hover {
  border-color: var(--uj-accent, #F97316);
  transform: translateX(2px);
}
.ujc-page-list__title {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 16px; font-weight: 600; color: var(--uj-ink, #111827);
}
.ujc-page-list__snippet {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 13.5px; color: var(--uj-muted, #6B7280);
  line-height: 1.55; margin-top: 6px;
}

/* "Overview" link distinguishes the parent link in the subpage sidebar */
.ujc-doc-side__link--overview {
  font-style: italic; opacity: 0.75;
}

/* ============================================================
 *  Docs shell v2.1 — tab strip + sticky sidebar + constrained width
 *  Layout fix: wrap each docs view in .ujc-docs-shellwrap so it
 *  inherits the .ujc-wrap max-width (1180px) rather than spanning
 *  the full viewport. Tab strip lives between breadcrumbs and the
 *  grid; sidebar is now position:sticky.
 * ============================================================ */

.ujc-docs-shellwrap {
  /* Match the nav/header container width (.uj-hdr-inner = 1280px) rather than
     the narrower .ujc-wrap (1180px) the docs view also carries — same class
     on the element, declared later, so this wins. */
  max-width: 1280px;
  padding-top: 48px;
  padding-bottom: 96px;
}
.ujc-docs-shellwrap .ujc-crumbs { margin-bottom: 18px; }

/* Top tab strip — APIs / SDKs / Tutorials, current section underlined */
.ujc-docs-tabs {
  display: flex; gap: 4px; flex-wrap: wrap;
  border-bottom: 1px solid var(--uj-line, #E5E7EB);
  margin-bottom: 36px;
}
.ujc-docs-tab {
  display: inline-block;
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 14px; font-weight: 600;
  padding: 10px 16px; border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  color: var(--uj-muted, #6B7280); text-decoration: none;
  transition: color .15s, border-color .15s;
}
.ujc-docs-tab:hover { color: var(--uj-ink, #111827); }
.ujc-docs-tab.is-active {
  color: var(--uj-ink, #111827);
  border-bottom-color: var(--uj-accent, #F97316);
}

/* Override the older .ujc-doc-shell styles so it sits inside the wrap */
.ujc-docs-shellwrap .ujc-doc-shell {
  display: grid;
  grid-template-columns: 240px minmax(0, 1fr);
  gap: 56px;
  padding: 0;
  margin: 0;
}
@media (max-width: 880px) {
  .ujc-docs-shellwrap .ujc-doc-shell { grid-template-columns: 1fr; gap: 0; }
  .ujc-docs-shellwrap .ujc-doc-side { position: static; max-height: none; }
}

/* Sticky sidebar — anchored under the global header. Flex column so
   the TOC scrolls in the upper region and the docs-CTA stays pinned at
   the bottom (always in view, no need to scroll the article to find it). */
.ujc-docs-shellwrap .ujc-doc-side {
  position: sticky;
  top: 96px;
  align-self: start;
  max-height: calc(100vh - 120px);
  padding-right: 8px;          /* room for scrollbar */
  padding-bottom: 8px;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.ujc-docs-shellwrap .ujc-doc-side__scroll {
  flex: 1 1 auto;
  min-height: 0;               /* lets the child actually scroll inside flex */
  overflow-y: auto;
}
.ujc-docs-shellwrap .ujc-doc-side__scroll::-webkit-scrollbar { width: 6px; }
.ujc-docs-shellwrap .ujc-doc-side__scroll::-webkit-scrollbar-thumb {
  background: var(--uj-line, #E5E7EB); border-radius: 3px;
}
.ujc-docs-shellwrap .ujc-doc-side::-webkit-scrollbar { width: 6px; }
.ujc-docs-shellwrap .ujc-doc-side::-webkit-scrollbar-thumb {
  background: var(--uj-line, #E5E7EB); border-radius: 3px;
}

/* Constrain the article column so reading isn't 800px+ wide */
.ujc-docs-shellwrap .ujc-doc-main { max-width: 720px; }
@media (min-width: 1280px) {
  .ujc-docs-shellwrap .ujc-doc-main { max-width: 760px; }
}

/* Tighter sidebar styling */
.ujc-docs-shellwrap .ujc-doc-side__eyebrow:not(:first-child) { margin-top: 24px; }

/* ============================================================
 *  Docs polish v3 — typography, TOC-only sidebar, tabbed code,
 *  code-block treatment, eyebrows. Bumps the cache version on
 *  views to ?v=3.
 * ============================================================ */

/* Main column: eyebrow above the title, bigger title, tighter prose */
.ujc-doc-main__eyebrow {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 11px; font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase;
  color: var(--uj-accent, #F97316);
  margin-bottom: 12px;
}
.ujc-doc-main__eyebrow a {
  color: inherit; text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: border-color .15s;
}
.ujc-doc-main__eyebrow a:hover { border-bottom-color: currentColor; }

.ujc-docs-shellwrap .ujc-doc-title {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 40px; font-weight: 700; letter-spacing: -0.025em;
  line-height: 1.1; color: var(--uj-ink, #111827);
  margin: 0 0 32px;
}
@media (max-width: 720px) {
  .ujc-docs-shellwrap .ujc-doc-title { font-size: 32px; }
}

/* Sidebar — TOC-only, refined */
.ujc-docs-shellwrap .ujc-doc-side__eyebrow {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 10.5px; font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--uj-muted, #6B7280);
  margin-bottom: 14px; margin-top: 4px;
}
.ujc-docs-shellwrap .ujc-doc-side__empty {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 12.5px; color: var(--uj-muted2, #9CA3AF);
  font-style: italic;
}
.ujc-docs-shellwrap .ujc-doc-toc {
  border-left: 1px solid var(--uj-line, #E5E7EB);
  padding-left: 0;
}
.ujc-docs-shellwrap .ujc-doc-toc__link {
  display: block; padding: 5px 14px;
  font-size: 13px; line-height: 1.45;
  color: var(--uj-ink2, #1F2937);
  border-left: 2px solid transparent;
  margin-left: -1px;
  transition: color .12s, border-color .12s;
}
.ujc-docs-shellwrap .ujc-doc-toc__link:hover {
  color: var(--uj-accent, #F97316);
}
.ujc-docs-shellwrap .ujc-doc-toc__link.is-current {
  color: var(--uj-accent, #F97316);
  border-left-color: var(--uj-accent, #F97316);
  font-weight: 600;
}
.ujc-docs-shellwrap .ujc-doc-toc__link--h3 {
  padding-left: 30px;
  font-size: 12.5px;
  color: var(--uj-muted, #6B7280);
}

/* Prose body polish — better headings + spacing */
.ujc-docs-shellwrap .ujc-prose h2 {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 24px; font-weight: 700; letter-spacing: -0.015em;
  color: var(--uj-ink, #111827);
  margin: 56px 0 16px;
  padding-top: 12px;
  border-top: 1px solid var(--uj-line2, #F3F4F6);
  scroll-margin-top: 88px;   /* for anchor jumps under sticky header */
}
.ujc-docs-shellwrap .ujc-prose h2:first-child {
  margin-top: 0; padding-top: 0; border-top: none;
}
.ujc-docs-shellwrap .ujc-prose h3 {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 18px; font-weight: 600; letter-spacing: -0.01em;
  color: var(--uj-ink, #111827);
  margin: 32px 0 10px;
  scroll-margin-top: 88px;
}
.ujc-docs-shellwrap .ujc-prose h4 {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 14px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .06em;
  color: var(--uj-muted, #6B7280);
  margin: 24px 0 8px;
}
.ujc-docs-shellwrap .ujc-prose p,
.ujc-docs-shellwrap .ujc-prose ul,
.ujc-docs-shellwrap .ujc-prose ol {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 15.5px; line-height: 1.7;
  color: var(--uj-ink2, #1F2937);
  margin: 14px 0;
}
.ujc-docs-shellwrap .ujc-prose a {
  color: var(--uj-accent, #F97316);
  text-decoration: underline; text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}
.ujc-docs-shellwrap .ujc-prose a:hover { color: var(--uj-accent2, #FB923C); }

/* Inline code */
.ujc-docs-shellwrap .ujc-prose code {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 0.88em;
  background: var(--uj-paper, #F9FAFB);
  color: var(--uj-ink, #111827);
  padding: 2px 6px; border-radius: 4px;
  border: 1px solid var(--uj-line2, #F3F4F6);
}
.ujc-docs-shellwrap .ujc-prose pre code {
  background: transparent; color: inherit;
  padding: 0; border: none; font-size: 13.5px;
}

/* Fenced code block — dark theme, language label */
.ujc-docs-shellwrap .ujc-prose pre {
  position: relative;
  background: #0B0F19; color: #E5E7EB;
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 13.5px; line-height: 1.6;
  padding: 16px 18px; border-radius: 10px;
  overflow-x: auto; margin: 18px 0;
  border: 1px solid #1F2937;
}
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"]::before {
  content: attr(data-lang);
  position: absolute; top: 10px; right: 12px;
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 10px; font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase;
  color: var(--uj-muted2, #9CA3AF);
}

/* Blockquote / callout — markdown `> **INFO** — …` lands here. Italics
   on long callout bodies hurt scan-ability, so we drop them and let the
   leading <strong>INFO</strong> carry the label treatment instead. */
.ujc-docs-shellwrap .ujc-prose blockquote {
  border-left: 3px solid var(--uj-accent, #F97316);
  padding: 14px 20px;
  color: var(--uj-ink2, #334155);
  font-style: normal;
  margin: 22px 0;
  background: var(--uj-accent-soft, #FFF7ED);
  border-radius: 0 10px 10px 0;
  font-size: 14.5px;
  line-height: 1.6;
}
.ujc-docs-shellwrap .ujc-prose blockquote p { margin: 0 0 .6em; }
.ujc-docs-shellwrap .ujc-prose blockquote p:last-child { margin-bottom: 0; }
/* Lift the leading "INFO"/"NOTE"/"WARNING" tag to a proper eyebrow. */
.ujc-docs-shellwrap .ujc-prose blockquote p:first-child > strong:first-child {
  display: inline-block;
  font-family: var(--uj-mono);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--uj-accent);
  margin-right: 6px;
}

/* GFM tables */
.ujc-docs-shellwrap .ujc-prose table {
  border-collapse: collapse; width: 100%;
  margin: 22px 0; font-size: 13.5px;
  border: 1px solid var(--uj-line, #E5E7EB);
  border-radius: 8px; overflow: hidden;
}
.ujc-docs-shellwrap .ujc-prose th,
.ujc-docs-shellwrap .ujc-prose td {
  padding: 10px 14px; text-align: left;
  border-top: 1px solid var(--uj-line2, #F3F4F6);
}
.ujc-docs-shellwrap .ujc-prose th {
  background: var(--uj-paper, #F9FAFB);
  font-weight: 600; font-size: 12px;
  text-transform: uppercase; letter-spacing: .04em;
  color: var(--uj-muted, #6B7280);
  border-top: none;
}
.ujc-docs-shellwrap .ujc-prose td code {
  font-size: 0.92em;
}

/* ============================================================
 *  Tabbed code groups (emitted by the docusaurus importer)
 * ============================================================ */
.ujc-tabs {
  border: 1px solid #1F2937;
  border-radius: 10px; overflow: hidden;
  margin: 20px 0;
  background: #0B0F19;
}
.ujc-tabs__strip {
  display: flex; gap: 2px; flex-wrap: wrap;
  background: #111827;
  padding: 6px 8px;
  border-bottom: 1px solid #1F2937;
}
.ujc-tabs__tab {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 12.5px; font-weight: 500;
  color: #9CA3AF; background: transparent;
  border: none; cursor: pointer;
  padding: 6px 12px; border-radius: 6px;
  transition: background .12s, color .12s;
}
.ujc-tabs__tab:hover { color: #E5E7EB; background: rgba(255,255,255,0.04); }
.ujc-tabs__tab.is-active {
  background: rgba(249,115,22,0.12);
  color: var(--uj-accent2, #FB923C);
  font-weight: 600;
}
.ujc-tabs__panels { padding: 0; }
.ujc-tabs__panel { display: none; }
.ujc-tabs__panel.is-active { display: block; }
.ujc-tabs__panel pre {
  margin: 0; border: none; border-radius: 0;
  background: transparent;
}
.ujc-tabs__placeholder {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 13px; color: #9CA3AF;
  padding: 24px 18px; text-align: center;
  font-style: italic;
}

/* ============================================================
 *  Blog v2 polish — hero compression, clickable tags, post
 *  page widening, numeric pager, card spacing tuning.
 * ============================================================ */

/* Tighter hero specifically on blog (shorter than the default ujc-hero) */
.ujc-hero--blog {
  padding: 56px 0 36px;
}
@media (max-width: 720px) {
  .ujc-hero--blog { padding: 40px 0 28px; }
}
.ujc-hero--blog .ujc-hero__lede { max-width: 680px; }

/* Active-tag indicator + clear button on hero */
.ujc-hero__filter {
  margin-top: 18px;
  display: flex; align-items: center; gap: 10px;
  font-family: var(--uj-mono); font-size: 12px;
  color: var(--uj-muted);
  text-transform: uppercase; letter-spacing: .06em;
}
.ujc-hero__clear {
  font-family: var(--uj-mono); font-size: 11.5px;
  color: var(--uj-muted); text-decoration: none;
  border: 1px solid var(--uj-line);
  padding: 4px 10px; border-radius: 999px;
  transition: color .12s, border-color .12s, background .12s;
}
.ujc-hero__clear:hover {
  color: var(--uj-ink); border-color: var(--uj-ink);
  background: var(--uj-paper);
}

/* The grid wrapper picks up a bit of top breathing room post-hero */
.ujc-blog-grid-wrap { padding-top: 40px; padding-bottom: 80px; }

/* Tags become anchors (clickable). Visual baseline matches the old span chip,
 * with a hover treatment that signals interactivity. .is-active is shown on
 * the hero filter pill and on whichever index-card tag matches the filter. */
.ujc-tag {
  display: inline-block;
  font-family: var(--uj-mono); font-size: 11px; font-weight: 500;
  letter-spacing: .04em; text-transform: uppercase;
  color: var(--uj-accent-ink);
  background: var(--uj-accent-soft);
  padding: 4px 10px; border-radius: 999px;
  text-decoration: none;
  border: 1px solid transparent;
  transition: background .12s, color .12s, border-color .12s;
}
.ujc-tag:hover {
  background: var(--uj-accent, #F97316);
  color: #fff;
}
.ujc-tag.is-active {
  background: var(--uj-accent, #F97316);
  color: #fff;
  border-color: var(--uj-accent, #F97316);
}

/* Index card spacing — bring the title closer to the tags, give the excerpt
 * a touch of breathing room above the meta line. */
.ujc-card { gap: 0; }
.ujc-card__media-link { display: block; text-decoration: none; color: inherit; }
.ujc-card__media-link + .ujc-card__tags { margin-top: 16px; }
.ujc-card__tags + .ujc-card__title { margin-top: 4px; }
.ujc-card__title {
  margin: 0 0 8px;
}
.ujc-card__title a {
  color: inherit; text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: color .12s, border-color .12s;
}
.ujc-card__title a:hover {
  color: var(--uj-accent);
}
.ujc-card__excerpt {
  margin: 8px 0 14px;
}
.ujc-card__meta {
  margin-top: 4px;
}

/* Numeric pager */
.ujc-pager {
  display: flex; align-items: center; gap: 16px;
  justify-content: center; margin-top: 64px;
  font-family: var(--uj-mono); font-size: 13px;
}
.ujc-pager__step,
.ujc-pager__num {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 32px; height: 32px; padding: 0 10px;
  color: var(--uj-ink); text-decoration: none;
  border: 1px solid var(--uj-line); border-radius: 8px;
  background: #fff;
  transition: border-color .12s, color .12s, background .12s;
}
.ujc-pager__step { border-color: transparent; padding: 0 6px; }
.ujc-pager__step:hover,
.ujc-pager__num:hover {
  color: var(--uj-accent); border-color: var(--uj-accent);
}
.ujc-pager__num.is-current {
  background: var(--uj-ink); color: #fff; border-color: var(--uj-ink);
  font-weight: 600; cursor: default;
}
.ujc-pager__step.is-disabled {
  color: var(--uj-muted2); border-color: transparent; cursor: default;
  background: transparent;
}
.ujc-pager__step.is-disabled:hover { color: var(--uj-muted2); border-color: transparent; }
.ujc-pager__nums { display: inline-flex; gap: 6px; align-items: center; }
.ujc-pager__ellipsis { color: var(--uj-muted2); padding: 0 2px; }

/* ============================================================
 *  Blog post page — wider content + tighter title/meta gap.
 * ============================================================ */
.ujc-wrap--post {
  max-width: 880px;     /* widened from --narrow (760px) */
  padding-top: 32px;
  padding-bottom: 96px;
}

/* Header order: back-link → tags → title → meta. Tags row sits right above
 * the title to mirror the index card; meta row tucks just below the title. */
.ujc-post__head { margin-bottom: 36px; }
.ujc-post__tags {
  display: flex; flex-wrap: wrap; gap: 8px;
  margin: 18px 0 14px;
}
.ujc-post__title {
  font-family: var(--uj-sans);
  font-size: clamp(34px, 4vw, 46px);
  line-height: 1.1; letter-spacing: -0.025em;
  font-weight: 700; color: var(--uj-ink);
  margin: 0 0 12px;             /* tighter gap to the meta row */
  text-wrap: balance;
}
.ujc-post__meta {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: 8px 14px;
  font-family: var(--uj-mono);
  font-size: 12px;
  letter-spacing: .04em; text-transform: uppercase;
  color: var(--uj-muted);
  margin: 0;
}

/* Slight prose-width expansion so code blocks have room. */
.ujc-post .ujc-prose { max-width: 100%; }

/* ============================================================
 *  Blog v3 tuning — tag hover contrast, card spacing rhythm,
 *  post page title↔meta breathing room, drop card-pic hover.
 * ============================================================ */

/* Tag hover. The global .uj-v3 a:hover rule sets color to the orange accent —
 * we need higher specificity to keep tag text white on the orange hover bg.
 * Same fix for the active state. */
.uj-v3 a.ujc-tag:hover,
.uj-v3 a.ujc-tag.is-active,
.uj-v3 a.ujc-tag.is-active:hover {
  background: var(--uj-accent, #F97316);
  color: #fff;
}

/* Drop the card-pic transform/border on hover — user found it noisy.
 * Title stays clickable + still gets a subtle accent color on parent hover. */
.ujc-card:hover .ujc-card__media {
  border-color: var(--uj-line);
  transform: none;
}

/* Card rhythm — uniform 14px between blocks (was a mix of 4/8/14/16). The
 * resulting cascade is: media → 14 → tags → 14 → title → 14 → snippet → 14 → meta. */
.ujc-card { gap: 14px; }
.ujc-card__media-link + .ujc-card__tags { margin-top: 0; }
.ujc-card__tags + .ujc-card__title,
.ujc-card__title { margin: 0; }
.ujc-card__excerpt { margin: 0; }
.ujc-card__meta { margin-top: 0; }

/* Title→meta breathing room on post page. */
.ujc-wrap--post .ujc-post__title { margin: 0 0 20px; }
.ujc-wrap--bare { padding-top: 0 !important; padding-bottom: 0 !important; }

.ujc-wrap--post .ujc-post__meta  { margin: 0; }
.ujc-wrap--post .ujc-post__tags  { margin: 18px 0 16px; }

/* ============================================================
 *  Docs v3 — sub-nav strip, deep-dive chips, scroll-spy current
 *  state, refined section list cards.
 * ============================================================ */

/* Second-level nav (pages within the current section). Sits between the
 * top tab strip and the doc shell; visually it's a quieter scroll-friendly
 * row of compact chips. Sticky-friendly on long pages. */
.ujc-docs-subnav {
  display: flex; flex-wrap: wrap; gap: 4px;
  margin: -28px 0 32px;             /* pull up under tab strip's bottom border */
  padding: 8px 0;
  border-bottom: 1px solid var(--uj-line2, #F3F4F6);
  overflow-x: auto;
  scrollbar-width: thin;
}
.ujc-docs-subnav::-webkit-scrollbar { height: 4px; }
.ujc-docs-subnav::-webkit-scrollbar-thumb { background: var(--uj-line); border-radius: 2px; }
.ujc-docs-subnav__item {
  flex: none;
  display: inline-block;
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 13px; font-weight: 500;
  color: var(--uj-muted, #6B7280);
  padding: 6px 12px; border-radius: 8px;
  text-decoration: none; white-space: nowrap;
  transition: color .12s, background .12s;
}
.ujc-docs-subnav__item:hover {
  color: var(--uj-ink, #111827);
  background: var(--uj-paper, #F9FAFB);
}
.ujc-docs-subnav__item.is-active {
  color: var(--uj-accent-ink, #9A3412);
  background: var(--uj-accent-soft, #FFF7ED);
  font-weight: 600;
}

/* Deep-dive chip grid — sub-pages surfaced near the top of the page view.
 * Replaces the buried bottom "Continue reading" footer for main pages with
 * sub-pages. */
.ujc-deepdive {
  margin: 8px 0 36px;
  padding: 18px 20px;
  border: 1px solid var(--uj-line, #E5E7EB);
  border-radius: 12px;
  background: var(--uj-paper, #F9FAFB);
}
.ujc-deepdive__label {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 10.5px; font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--uj-muted, #6B7280);
  margin-bottom: 12px;
}
.ujc-deepdive__grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 8px;
}
.ujc-deepdive__chip {
  display: flex; align-items: center; justify-content: space-between;
  padding: 10px 14px;
  background: #fff;
  border: 1px solid var(--uj-line, #E5E7EB);
  border-radius: 8px;
  text-decoration: none; color: var(--uj-ink, #111827);
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 13.5px; font-weight: 500;
  transition: border-color .12s, color .12s;
}
.ujc-deepdive__chip:hover {
  border-color: var(--uj-accent, #F97316);
  color: var(--uj-accent, #F97316);
}
.ujc-deepdive__arrow {
  font-family: var(--uj-mono);
  color: var(--uj-muted2, #9CA3AF);
  transition: transform .12s, color .12s;
}
.ujc-deepdive__chip:hover .ujc-deepdive__arrow {
  color: var(--uj-accent, #F97316);
  transform: translateX(2px);
}

/* Scroll-spy current state on TOC links. Must outrank generic hover state. */
.ujc-doc-toc__link.is-current {
  color: var(--uj-accent, #F97316);
  border-left-color: var(--uj-accent, #F97316);
  font-weight: 600;
}

/* Section list cards (e.g. /docs/tutorials) — refined.
 * Less hover noise: keep the orange-strip indicator on hover but drop the
 * lift transform. Add a left accent strip that animates in on hover. */
.ujc-page-list { gap: 10px; }
.ujc-page-list__item {
  position: relative;
  padding: 18px 22px 18px 24px;
  border: 1px solid var(--uj-line, #E5E7EB);
  border-radius: 12px;
  background: #fff;
  transition: border-color .15s, background .15s;
  overflow: hidden;
}
.ujc-page-list__item:hover {
  border-color: var(--uj-accent, #F97316);
  background: var(--uj-paper, #F9FAFB);
  transform: none;
}
.ujc-page-list__item::before {
  content: "";
  position: absolute; left: 0; top: 0; bottom: 0;
  width: 3px; background: var(--uj-accent, #F97316);
  opacity: 0; transition: opacity .15s;
}
.ujc-page-list__item:hover::before { opacity: 1; }
.ujc-page-list__title {
  font-size: 16.5px; font-weight: 600;
  color: var(--uj-ink, #111827);
  letter-spacing: -0.005em;
}
.ujc-page-list__item:hover .ujc-page-list__title {
  color: var(--uj-accent, #F97316);
}
.ujc-page-list__snippet {
  margin-top: 4px;
  font-size: 13.5px;
  color: var(--uj-muted, #6B7280);
  line-height: 1.55;
}

/* Tighter section landing main column — list scales up nicer */
.ujc-docs-shellwrap .ujc-doc-main .ujc-page-list { max-width: none; }

/* ============================================================
 *  Docs polish v3.1 — breadcrumb removed; tighten top padding
 * ============================================================ */
.ujc-docs-shellwrap {
  padding-top: 28px;   /* was 48px — breadcrumb row no longer takes vertical space */
}

/* ============================================================
 *  Docs polish v3.2 — section-landing cards in a multi-column grid
 *  Replaces the vertical stack (which wasted horizontal real estate)
 *  with an auto-fill grid that adapts: 3-col on wide, 2-col on tablet,
 *  1-col on phone. The left orange accent strip + accent color on
 *  hover are preserved.
 * ============================================================ */
.ujc-docs-shellwrap .ujc-page-list,
.ujc-page-list {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 14px;
  margin: 24px 0 0;
  list-style: none;
  padding: 0;
}
/* Equal-height cards across rows so the grid stays tidy when snippets vary */
.ujc-docs-shellwrap .ujc-page-list > li,
.ujc-page-list > li {
  display: flex;       /* let the anchor stretch to row height */
}
.ujc-docs-shellwrap .ujc-page-list__item,
.ujc-page-list__item {
  display: flex;
  flex-direction: column;
  gap: 6px;
  flex: 1 1 auto;
}
.ujc-docs-shellwrap .ujc-page-list__snippet,
.ujc-page-list__snippet {
  /* Cap the snippet to keep cards a consistent height in the grid */
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* ============================================================
 *  Docs polish v3.3 — solo (no-sidebar) shell variant
 *  Used on section landings where the _index has no H2/H3 TOC
 *  and the body is a card grid — no point in reserving the 240px
 *  sidebar column.
 * ============================================================ */
.ujc-docs-shellwrap .ujc-doc-shell--solo {
  grid-template-columns: minmax(0, 1fr);
  gap: 0;
}
.ujc-docs-shellwrap .ujc-doc-shell--solo .ujc-doc-main {
  max-width: none;
}

/* ============================================================
 *  Docs polish v3.4 — LIGHT code-block theme (replaces Prism Tomorrow
 *  for docs pages only — blog post pages keep the dark treatment).
 *
 *  Why light: a few token classes (function, operator, attr-name, etc.)
 *  were dim on the dark background. Switching to a GitHub-light-style
 *  palette gives ~6:1 contrast for every token role.
 *
 *  Scope: any code block inside `.ujc-docs-shellwrap`. Includes both
 *  the prose `<pre>` blocks AND the tabbed-code panels.
 * ============================================================ */

/* Container surface */
.ujc-docs-shellwrap .ujc-prose pre,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"],
.ujc-docs-shellwrap .ujc-tabs__panel pre {
  background: #F6F8FA;
  color: #24292F;
  border: 1px solid #E5E7EB;
  box-shadow: none;
}
.ujc-docs-shellwrap .ujc-prose pre code,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] code,
.ujc-docs-shellwrap .ujc-tabs__panel pre code {
  color: inherit;
}

/* Inline code adjusts in concert (lighter, more padded) */
.ujc-docs-shellwrap .ujc-prose code:not(pre code) {
  background: #F6F8FA;
  color: #1F2937;
  border-color: #E5E7EB;
}

/* Tabs container: also light to harmonize with code blocks */
.ujc-docs-shellwrap .ujc-tabs {
  background: #F6F8FA;
  border: 1px solid #E5E7EB;
}
.ujc-docs-shellwrap .ujc-tabs__strip {
  background: #FFFFFF;
  border-bottom-color: #E5E7EB;
}
.ujc-docs-shellwrap .ujc-tabs__tab {
  color: #6B7280;
}
.ujc-docs-shellwrap .ujc-tabs__tab:hover {
  background: #F3F4F6;
  color: #111827;
}
.ujc-docs-shellwrap .ujc-tabs__tab.is-active {
  background: var(--uj-accent-soft, #FFF7ED);
  color: var(--uj-accent-ink, #9A3412);
}
.ujc-docs-shellwrap .ujc-tabs__placeholder {
  color: #6B7280;
}

/* Prism token recoloring — GitHub Light-ish palette tuned for contrast.
 * Every selector is scoped to .ujc-docs-shellwrap so the dark blog theme is
 * untouched. */
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.comment,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.prolog,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.doctype,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.cdata,
.ujc-docs-shellwrap .ujc-tabs__panel pre[class*="language-"] .token.comment {
  color: #6E7781; font-style: italic;
}
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.punctuation,
.ujc-docs-shellwrap .ujc-tabs__panel pre[class*="language-"] .token.punctuation {
  color: #24292F;
}
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.tag,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.boolean,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.number,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.constant,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.symbol,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.deleted,
.ujc-docs-shellwrap .ujc-tabs__panel pre[class*="language-"] .token.number,
.ujc-docs-shellwrap .ujc-tabs__panel pre[class*="language-"] .token.boolean {
  color: #0550AE;
}
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.selector,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.attr-name,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.string,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.char,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.builtin,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.inserted,
.ujc-docs-shellwrap .ujc-tabs__panel pre[class*="language-"] .token.string,
.ujc-docs-shellwrap .ujc-tabs__panel pre[class*="language-"] .token.attr-name {
  color: #0A3069;
}
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.operator,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.entity,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.url,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.variable,
.ujc-docs-shellwrap .ujc-tabs__panel pre[class*="language-"] .token.operator,
.ujc-docs-shellwrap .ujc-tabs__panel pre[class*="language-"] .token.variable {
  color: #953800;
}
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.atrule,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.attr-value,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.keyword,
.ujc-docs-shellwrap .ujc-tabs__panel pre[class*="language-"] .token.keyword {
  color: #CF222E;
}
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.function,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.class-name,
.ujc-docs-shellwrap .ujc-tabs__panel pre[class*="language-"] .token.function,
.ujc-docs-shellwrap .ujc-tabs__panel pre[class*="language-"] .token.class-name {
  color: #8250DF;
}
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.regex,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.important {
  color: #B45309;
}
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.important,
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.bold { font-weight: 700; }
.ujc-docs-shellwrap .ujc-prose pre[class*="language-"] .token.italic { font-style: italic; }

/* Copy button on light bg — replace the dark variant */
.ujc-docs-shellwrap .ujc-copy {
  background: #FFFFFF;
  border-color: #E5E7EB;
  color: #6B7280;
}
.ujc-docs-shellwrap .ujc-copy:hover {
  background: var(--uj-accent-soft, #FFF7ED);
  border-color: var(--uj-accent, #F97316);
  color: var(--uj-accent-ink, #9A3412);
}
.ujc-docs-shellwrap .ujc-copy.is-copied {
  background: #ECFDF3;
  border-color: #86EFAC;
  color: #047857;
  opacity: 1;
}

/* ============================================================
 *  Inline "Available types" TOC chip grid (used on /docs/apis/serp/
 *  search-types but reusable for any "here's a quick map of options"
 *  in-content callout).
 * ============================================================ */
.ujc-docs-shellwrap .ujc-typelist {
  margin: 12px 0 28px;
  padding: 14px 16px;
  background: var(--uj-accent-soft, #FFF7ED);
  border: 1px solid #FED7AA;
  border-radius: 10px;
}
.ujc-docs-shellwrap .ujc-typelist__label {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 11px; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase;
  color: var(--uj-accent-ink, #9A3412);
  margin-bottom: 10px;
}
.ujc-docs-shellwrap .ujc-typelist__grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
  gap: 6px;
}
.ujc-docs-shellwrap .ujc-typelist__chip {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 12px;
  background: #fff;
  border: 1px solid #FED7AA;
  border-radius: 8px;
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 13px;
  color: var(--uj-ink, #111827);
  text-decoration: none;
  transition: border-color .12s, background .12s;
}
.ujc-docs-shellwrap .ujc-typelist__chip:hover {
  border-color: var(--uj-accent, #F97316);
  background: #fff;
}
.ujc-docs-shellwrap .ujc-typelist__chip code {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 12px;
  background: var(--uj-accent, #F97316);
  color: #fff;
  padding: 1px 6px;
  border-radius: 4px;
  border: none;
}

/* ============================================================
 *  Blog + docs prose images — centered with caption support
 * ============================================================ */
.ujc-prose img {
  display: block;
  max-width: 100%;
  height: auto;
  margin: 28px auto;
  border-radius: 8px;
}
/* Italic immediately following an image acts as caption (markdown idiom) */
.ujc-prose img + em,
.ujc-prose img + br + em {
  display: block;
  text-align: center;
  font-size: 13.5px;
  color: var(--uj-muted, #6B7280);
  margin: -16px 0 28px;
  font-style: italic;
}

/* ============================================================
 *  Blog post hero + author byline + lightbox
 * ============================================================ */

/* Cover image as full-width hero above the title. Pulls up against the global
 * header so the splash dominates the fold; the content shell tucks under it. */
.ujc-post-hero {
  background: var(--uj-paper, #F9FAFB);
  border-bottom: 1px solid var(--uj-line, #E5E7EB);
  margin-bottom: -32px;  /* let the article shell overlap the hero edge */
  padding-bottom: 0;
}
.ujc-post-hero__inner {
  max-width: 1280px;
  margin: 0 auto;
  padding: 24px 24px 0;
}
.ujc-post-hero__img {
  display: block;
  width: 100%;
  max-height: 480px;
  object-fit: cover;
  border-radius: 16px 16px 0 0;
  box-shadow: 0 24px 60px rgba(15,23,42,0.08);
}
@media (max-width: 720px) {
  .ujc-post-hero__inner { padding: 12px 12px 0; }
  .ujc-post-hero__img { max-height: 280px; border-radius: 10px 10px 0 0; }
}

/* When a hero is present, push the article shell up so it overlaps the hero
 * (creates a tucked-in card effect) and white-out the top so the title sits
 * cleanly above. */
.ujc-post--has-hero {
  background: #fff;
  margin-top: -32px;
  padding-top: 28px;
  position: relative;
  z-index: 1;
}

/* Author byline */
.ujc-post__author {
  display: inline-flex; align-items: center; gap: 6px;
  text-transform: none;
  letter-spacing: 0;
  color: var(--uj-ink2, #1F2937);
  font-family: var(--uj-sans);
  font-size: 13px; font-weight: 500;
}
.ujc-post__author-link {
  color: var(--uj-accent, #F97316);
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: border-color .12s;
}
.ujc-post__author-link:hover { border-bottom-color: currentColor; }

.ujc-card__author {
  color: var(--uj-ink2, #1F2937);
  text-decoration: none;
  font-weight: 500;
}
.ujc-card__author:hover { color: var(--uj-accent, #F97316); }

/* Active-author pill in hero */
.ujc-hero__filter-author {
  font-family: var(--uj-mono);
  font-size: 11px;
  letter-spacing: .04em;
  text-transform: uppercase;
  padding: 4px 10px;
  border-radius: 999px;
  background: var(--uj-accent, #F97316);
  color: #fff;
}

/* ============================================================
 *  Lightbox — full-screen modal for prose images
 * ============================================================ */
.ujc-lightbox {
  position: fixed; inset: 0;
  display: flex; align-items: center; justify-content: center;
  background: rgba(15,23,42,0.92);
  padding: 32px;
  z-index: 9999;
  cursor: zoom-out;
}
.ujc-lightbox[hidden] { display: none; }
.ujc-lightbox__img {
  max-width: 100%;
  max-height: 92vh;
  display: block;
  border-radius: 8px;
  box-shadow: 0 24px 80px rgba(0,0,0,0.5);
  cursor: default;
  user-select: none;
}
.ujc-lightbox__close {
  position: absolute;
  top: 18px; right: 22px;
  width: 36px; height: 36px;
  display: inline-flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.18);
  color: #fff;
  font-size: 24px; line-height: 1;
  border-radius: 50%;
  cursor: pointer;
  transition: background .12s, border-color .12s;
}
.ujc-lightbox__close:hover {
  background: rgba(255,255,255,0.16);
  border-color: rgba(255,255,255,0.32);
}
body.ujc-lightbox-open { overflow: hidden; }

/* Prose images get a subtle zoom-in cursor (set inline by lightbox JS too) */
.ujc-prose img { cursor: zoom-in; }

/* ============================================================
 *  Blog post hero v2 — Ghost-style: title overlaid on a darkened
 *  full-bleed cover. Aspect ratio is normalized so different
 *  cover image sizes still match each other.
 * ============================================================ */

/* Override the v1 hero block (now unused by post.tpl.php) so existing rules
 * don't conflict. */
.ujc-post-hero {
  position: relative;
  width: 100%;
  /* Balanced — taller than the previous shrink but still leaves room above
   * the fold for the lede. Aspect ratio splits the difference. */
  min-height: 320px;
  max-height: 460px;
  aspect-ratio: 22 / 9;
  overflow: hidden;
  margin: 0 0 36px;
  padding: 0;
  background: var(--uj-ink, #111827);  /* dark fallback while img loads */
  isolation: isolate;
}
.ujc-post-hero__bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;        /* normalize all cover image sizes */
  object-position: center;
  z-index: 0;
  border-radius: 0;
  max-height: none;
  margin: 0;
}
/* Dark gradient scrim — text on top stays readable on any cover */
.ujc-post-hero__scrim {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(180deg,
      rgba(15,23,42,0.45) 0%,
      rgba(15,23,42,0.20) 35%,
      rgba(15,23,42,0.55) 75%,
      rgba(15,23,42,0.85) 100%);
  z-index: 1;
}
.ujc-post-hero__content {
  position: relative;
  z-index: 2;
  height: 100%;
  display: flex;
  align-items: flex-end;    /* anchor title near the bottom */
  padding: 32px 0 36px;
  color: #fff;
}
.ujc-post-hero__content .ujc-back--on-hero {
  display: inline-block;
  color: rgba(255,255,255,0.85);
  text-decoration: none;
  font-family: var(--uj-mono);
  font-size: 12px;
  letter-spacing: .04em;
  margin-bottom: 14px;
}
.ujc-post-hero__content .ujc-back--on-hero:hover { color: #fff; }
.ujc-post__head--on-hero { margin-bottom: 0; }
.ujc-post__head--on-hero .ujc-post__title {
  color: #fff;
  text-shadow: 0 1px 24px rgba(0,0,0,0.4);
  font-size: clamp(30px, 3.8vw, 44px);
  line-height: 1.18;
  margin: 10px 0 12px;
}
.ujc-post__head--on-hero .ujc-post__meta {
  color: rgba(255,255,255,0.82);
}
.ujc-post__head--on-hero .ujc-post__meta .ujc-dot,
.ujc-post__head--on-hero .ujc-post__meta a { color: rgba(255,255,255,0.92); }
.ujc-post__head--on-hero .ujc-post__author-link {
  color: #FED7AA;
  border-bottom-color: rgba(254,215,170,0.4);
}
.ujc-post__head--on-hero .ujc-tag {
  background: rgba(255,255,255,0.15);
  color: #fff;
  border-color: rgba(255,255,255,0.22);
}
.ujc-post__head--on-hero .ujc-tag:hover {
  background: rgba(249,115,22,0.95);
}

/* When the hero rendered, the article shell is content-only — drop the upper
 * padding since the hero block already provides the visual top. */
.ujc-post--has-hero { padding-top: 0; margin-top: 0; background: transparent; }

/* Cleanup: kill the older inner-image hero variant rules so they don't fight
 * the new layout. */
.ujc-post-hero__inner,
.ujc-post-hero__img { all: unset; }

@media (max-width: 720px) {
  .ujc-post-hero {
    min-height: 240px;
    max-height: 340px;
    aspect-ratio: 4 / 3;
    margin-bottom: 24px;
  }
  .ujc-post-hero__content { padding: 16px 0 22px; }
}

/* ============================================================
 *  Blog post prose polish — lede paragraph + code-block max-height
 *  Scoped to .ujc-post so docs / admin prose isn't affected.
 * ============================================================ */

/* First paragraph of the post body gets the editorial "lede" treatment —
 * larger size, slightly softer color, tighter line-height. :first-of-type
 * is used (not :first-child) so a leading <h2> or image doesn't disqualify
 * the first <p> that follows. */
.ujc-post .ujc-prose > p:first-of-type {
  font-size: 21px;
  line-height: 1.5;
  color: var(--uj-ink, #111827);
  font-weight: 600;
  letter-spacing: -0.01em;
  margin-bottom: 28px;
}
@media (max-width: 720px) {
  .ujc-post .ujc-prose > p:first-of-type { font-size: 19px; }
}

/* Long code blocks shouldn't push the article into infinite-scroll territory —
 * cap height and let users scroll inside the block instead. */
.ujc-post .ujc-prose pre {
  max-height: 520px;
  overflow: auto;
}

/* ============================================================
 *  Related posts — small cards at the bottom of every post.
 *  Three per row max (matches findRelated()'s default $limit=3),
 *  stacks on mobile. Intentionally compact: 1 tag + title + date.
 * ============================================================ */
.ujc-related {
  margin: 56px 0 32px;
  padding-top: 32px;
  border-top: 1px solid var(--uj-line, #E5E7EB);
}
.ujc-related__label {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 11px; font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--uj-muted, #6B7280);
  margin-bottom: 16px;
}
.ujc-related__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
}
@media (max-width: 720px) {
  .ujc-related__grid { grid-template-columns: 1fr; }
}
.ujc-related__card {
  display: flex; flex-direction: column; gap: 8px;
  padding: 16px 18px;
  border: 1px solid var(--uj-line, #E5E7EB);
  border-radius: 10px;
  background: #fff;
  text-decoration: none;
  color: var(--uj-ink, #111827);
  transition: border-color .15s, transform .15s;
}
.ujc-related__card:hover {
  border-color: var(--uj-accent, #F97316);
}
.ujc-related__card:hover .ujc-related__title {
  color: var(--uj-accent, #F97316);
}
.ujc-related__tag {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 10.5px; font-weight: 600;
  letter-spacing: .04em; text-transform: uppercase;
  color: var(--uj-accent-ink, #9A3412);
  background: var(--uj-accent-soft, #FFF7ED);
  padding: 2px 8px;
  border-radius: 999px;
  align-self: flex-start;
}
.ujc-related__title {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 14.5px; font-weight: 600;
  line-height: 1.35; letter-spacing: -0.005em;
  color: var(--uj-ink, #111827);
  transition: color .12s;
  /* clamp to keep cards similar height */
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.ujc-related__date {
  margin-top: auto;
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 11px;
  color: var(--uj-muted2, #9CA3AF);
}

/* ============================================================
 *  Sticky post title bar — slides in once the H1 leaves viewport,
 *  so users can always escape back to /blog without scrolling up.
 * ============================================================ */
.ujc-post-stickytitle {
  position: fixed;
  top: 0;
  left: 0; right: 0;
  z-index: 49;                       /* one below .uj-hdr (z-index: 50) */
  background: #ffffff;                /* solid — no see-through against prose */
  border-bottom: 1px solid var(--uj-line, #E5E7EB);
  box-shadow: 0 6px 24px rgba(15,23,42,0.08);   /* visual separation from text below */
  transform: translateY(-110%);
  transition: transform .22s ease;
  pointer-events: none;
  padding-top: 60px;                  /* clear the global sticky header */
}
.ujc-post-stickytitle.is-visible {
  transform: translateY(0);
  pointer-events: auto;
}
.ujc-post-stickytitle__inner {
  display: flex;
  align-items: center;
  gap: 14px;
  padding-top: 14px;
  padding-bottom: 14px;
  min-height: 56px;
}
.ujc-post-stickytitle__back {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 12px;
  letter-spacing: .04em;
  color: var(--uj-accent, #F97316);
  text-decoration: none;
  white-space: nowrap;
  flex-shrink: 0;
}
.ujc-post-stickytitle__back:hover { text-decoration: underline; }
.ujc-post-stickytitle__sep {
  color: var(--uj-muted2, #9CA3AF);
  flex-shrink: 0;
}
.ujc-post-stickytitle__title {
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 15.5px;
  font-weight: 600;
  color: var(--uj-ink, #111827);
  letter-spacing: -0.01em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  flex: 1 1 auto;
  min-width: 0;
}

/* ============================================================
 *  Share buttons — Copy link / X / LinkedIn / Facebook / Reddit / HN
 *  Icon-only circular pills, brand-tint on hover, micro-lift animation.
 *  Designed to read as a unified "Share this" affordance rather than a row
 *  of mismatched logos.
 * ============================================================ */
.ujc-share {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  margin: 36px 0 8px;
  padding-top: 28px;
  border-top: 1px solid var(--uj-line, #E5E7EB);
}
.ujc-share__label {
  font-family: var(--uj-mono, ui-monospace, Menlo, monospace);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--uj-muted, #6B7280);
  margin-right: 6px;
}
.ujc-share__btn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 36px; height: 36px;
  border: 1px solid var(--uj-line, #E5E7EB);
  border-radius: 50%;
  background: #FFFFFF;
  color: var(--uj-ink2, #1F2937);
  text-decoration: none;
  transition: transform .12s ease, border-color .12s, color .12s, background .12s, box-shadow .12s;
  position: relative;
}
.ujc-share__btn svg { display: block; width: 16px; height: 16px; }
.ujc-share__btn span { /* hide network names — icons are universal enough */
  position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden;
}
.ujc-share__btn:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 10px rgba(15, 23, 42, 0.08), 0 1px 2px rgba(15, 23, 42, 0.04);
}
/* Per-network brand-tint on hover: matches each platform's brand color so the
 * visual cue is immediate without needing labels. */
.ujc-share__btn--x:hover  { color: #FFFFFF; background: #0F0F0F; border-color: #0F0F0F; }
.ujc-share__btn--li:hover { color: #FFFFFF; background: #0A66C2; border-color: #0A66C2; }
.ujc-share__btn--fb:hover { color: #FFFFFF; background: #1877F2; border-color: #1877F2; }
.ujc-share__btn--rd:hover { color: #FFFFFF; background: #FF4500; border-color: #FF4500; }
/* HN icon is a self-coloring brandmark (orange square + white Y baked into
 * the SVG with explicit fills, not currentColor). So we don't repaint on
 * hover — just tint the surrounding pill border + soft-shadow lift. */
.ujc-share__btn--hn:hover { background: #FFFFFF; border-color: #FF6600; }
.ujc-share__btn--copy:hover {
  color: #FFFFFF; background: var(--uj-accent, #F97316); border-color: var(--uj-accent, #F97316);
}
/* Copy-link confirmation state — flips to a green check + "Copied" tooltip. */
.ujc-share__btn--copy.is-copied {
  color: #FFFFFF; background: #16A34A; border-color: #16A34A;
}
.ujc-share__btn--copy.is-copied::after {
  content: 'Copied';
  position: absolute; left: 50%; bottom: calc(100% + 8px);
  transform: translateX(-50%);
  background: #0F172A; color: #FFFFFF;
  padding: 4px 8px;
  border-radius: 6px;
  font-family: var(--uj-sans, Inter, system-ui, sans-serif);
  font-size: 11.5px; font-weight: 500;
  white-space: nowrap;
  pointer-events: none;
  animation: ujcShareCopiedFade .15s ease;
}
@keyframes ujcShareCopiedFade {
  from { opacity: 0; transform: translate(-50%, 2px); }
  to   { opacity: 1; transform: translateX(-50%); }
}

@media (max-width: 480px) {
  .ujc-share { gap: 8px; }
  .ujc-share__btn { width: 34px; height: 34px; }
  .ujc-share__btn svg { width: 15px; height: 15px; }
}

/* ============================================================
 *  Docs prose code-block max-height (mirror of the blog rule)
 *  — keeps long examples from pushing the page to infinite scroll.
 *  Scoped to .ujc-docs-shellwrap so admin/blog prose are unaffected.
 * ============================================================ */
.ujc-docs-shellwrap .ujc-prose pre,
.ujc-docs-shellwrap .ujc-tabs__panel pre {
  max-height: 520px;
  overflow: auto;
}
