/* ============================================================================
   NEBULA MARKET — COMPONENT & PAGE COMPOSITION LAYER
   Depends on custom.css (tokens). Everything here is a composition built from
   those tokens — no new colours, no new easings.
   ========================================================================== */

/* ================================================================ SECTIONS */

/* Section head: index + label on a coordinate rail, headline off-axis.
   Deliberately NOT centred — that is the pattern being replaced. */
.nb-sechead {
  display: grid;
  gap: var(--nb-s4);
  margin-bottom: var(--nb-s7);
  max-width: 62ch;
}

.nb-sechead--split {
  max-width: none;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
  gap: var(--nb-s5);
}

@media (max-width: 767px) {
  .nb-sechead--split {
    grid-template-columns: minmax(0, 1fr);
    align-items: start;
  }
}

.nb-sechead__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h1);
  font-weight: 780;
  line-height: 0.98;
  letter-spacing: -0.042em;
}

.nb-sechead__sub {
  color: var(--nb-mist);
  max-width: 52ch;
}

/* ================================================================ 1. HERO */
/* Asymmetric editorial hero. Type occupies the left 6-7 columns; the
   aperture (WebGL / CSS fallback) anchors the right. Nothing is centred.
   Real store telemetry sits along the bottom rail. */

.nb-hero {
  position: relative;
  min-height: min(92vh, 900px);
  display: flex;
  align-items: center;
  padding-block: clamp(3rem, 8vw, 6rem) clamp(2rem, 5vw, 4rem);
  overflow: hidden;
}

.nb-hero__inner {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: var(--nb-max);
  margin-inline: auto;
  padding-inline: var(--nb-gutter);
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
  align-items: center;
  gap: clamp(2rem, 5vw, 4rem);
}

@media (max-width: 1023px) {
  .nb-hero__inner {
    grid-template-columns: minmax(0, 1fr);
  }

  .nb-hero {
    min-height: auto;
  }
}

.nb-hero__eyebrow {
  margin-bottom: var(--nb-s5);
}

/* Headline: display type with one ember word, tightly tracked, cropped
   baseline. Line 2 is indented — the composition is stepped, not stacked. */
.nb-hero__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-display);
  font-weight: 800;
  line-height: 0.88;
  letter-spacing: -0.05em;
  margin-bottom: var(--nb-s5);
}

.nb-hero__title em {
  display: block;
  font-style: normal;
  padding-left: clamp(0px, 6vw, 5.5rem);
}

.nb-hero__lead {
  max-width: 46ch;
  margin-bottom: var(--nb-s6);
  color: var(--nb-mist);
  font-size: clamp(1rem, 1.3vw, 1.15rem);
}

.nb-hero__cta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s3);
  margin-bottom: var(--nb-s7);
}

/* Telemetry strip: real store numbers, mono, on a hairline rail. */
/* Four readouts have to sit on one line inside the copy column, otherwise the
   wrapped row falls below the fold. Gap is capped rather than vw-scaled. */
.nb-hero__telemetry {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(1rem, 2.4vw, 2.1rem);
  padding-top: var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-tel__val {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: clamp(1.15rem, 2vw, 1.65rem);
  font-weight: 600;
  letter-spacing: -0.03em;
  color: var(--nb-white);
  font-variant-numeric: tabular-nums;
}

.nb-tel__key {
  display: block;
  margin-top: 2px;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

/* ---- The aperture: hero focal object ---- */
.nb-aperture {
  position: relative;
  aspect-ratio: 1;
  width: min(100%, 560px);
  margin-inline: auto;
  border-radius: 50%;
  display: grid;
  place-items: center;
  isolation: isolate;
}

.nb-aperture__canvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border-radius: 50%;
  z-index: 1;
}

/* Static CSS fallback — shown until/unless WebGL takes over, and the
   permanent state under prefers-reduced-motion or on weak devices. */
.nb-aperture__fallback {
  position: absolute;
  inset: 0;
  border-radius: 50%;
  z-index: 0;
  background:
    radial-gradient(circle at 42% 38%, rgba(255, 106, 82, 0.75), transparent 46%),
    radial-gradient(circle at 64% 62%, rgba(90, 52, 190, 0.7), transparent 52%),
    radial-gradient(circle at 30% 74%, rgba(20, 60, 150, 0.6), transparent 50%),
    radial-gradient(circle at 50% 50%, rgba(10, 12, 26, 1), var(--nb-void) 72%);
  filter: blur(2px) saturate(1.1);
}

/* Orbital rings — the instrument reading the field. Two rings, different
   speeds and inclinations. This is the brand motif, used sparingly. */
.nb-aperture__ring {
  position: absolute;
  inset: -6%;
  border-radius: 50%;
  border: 1px solid var(--nb-line);
  z-index: 2;
  pointer-events: none;
}

.nb-aperture__ring::after {
  content: '';
  position: absolute;
  top: 50%;
  left: -4px;
  width: 7px;
  height: 7px;
  margin-top: -3.5px;
  border-radius: 50%;
  background: var(--nb-ember);
  box-shadow: 0 0 14px 2px rgba(var(--nb-ember-rgb), 0.85);
}

.nb-aperture__ring--a {
  animation: nb-orbit 26s linear infinite;
}

.nb-aperture__ring--b {
  inset: -16%;
  border-color: var(--nb-line-soft);
  border-style: dashed;
  animation: nb-orbit 48s linear infinite reverse;
}

.nb-aperture__ring--b::after {
  width: 5px;
  height: 5px;
  margin-top: -2.5px;
  background: var(--nb-mist);
  box-shadow: 0 0 10px 1px rgba(154, 161, 181, 0.7);
}

/* Corner readout labels around the aperture — coordinates. */
.nb-aperture__coord {
  position: absolute;
  z-index: 3;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  color: var(--nb-dust);
  white-space: nowrap;
}

.nb-aperture__coord--tl {
  top: 2%;
  left: -2%;
}

.nb-aperture__coord--br {
  bottom: 2%;
  right: -2%;
}

@media (max-width: 1023px) {
  .nb-aperture {
    width: min(78%, 380px);
    margin-top: var(--nb-s6);
  }

  .nb-aperture__coord {
    display: none;
  }
}

/* ==================================================== 2. TRUST / BRAND RAIL */
/* Replaces the generic infinite logo marquee with a static, dense grid that
   reads as a catalogue index. No animation = no jank, and it communicates
   breadth better than a scroller. */

.nb-brands {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
  gap: 1px;
  background: var(--nb-line-soft);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  overflow: hidden;
}

.nb-brands__item {
  display: grid;
  place-items: center;
  padding: var(--nb-s5) var(--nb-s3);
  background: var(--nb-abyss);
  transition: background var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-brands__item:hover {
  background: var(--nb-carbon);
}

.nb-brands__item img {
  height: 22px;
  width: auto;
  max-width: 100%;
  object-fit: contain;
  opacity: 0.45;
  filter: grayscale(1) brightness(1.7);
  transition:
    opacity var(--nb-t-fast) var(--nb-ease-orbit),
    filter var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-brands__item:hover img {
  opacity: 1;
  filter: grayscale(0) brightness(1);
}

/* ========================================================= 3. PRODUCT CARD */
/* Not a rounded box with a glow. The card is a *specimen plate*:
   - media sits in an aperture (circle) so it never looks like a stock photo
   - price is mono/tabular and always bottom-left
   - stock is a pip, colour-coded, never a coloured pill
   - hover raises the plate and opens a light gradient from the top
   No 3D tilt, no shine sweep on every card. */

.nb-card {
  position: relative;
  display: flex;
  flex-direction: column;
  min-height: 100%;
  padding: var(--nb-s4);
  background: linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  overflow: hidden;
  isolation: isolate;
  transition:
    transform var(--nb-t-fast) var(--nb-ease-orbit),
    border-color var(--nb-t-fast) var(--nb-ease-orbit),
    background var(--nb-t-fast) var(--nb-ease-orbit);
  -webkit-tap-highlight-color: transparent;
}

/* Light field that opens from the card's top edge on hover — the system's
   "light reveals information" metaphor, one property, GPU-cheap. */
.nb-card::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -1;
  background: radial-gradient(120% 60% at 50% -10%, rgba(var(--nb-ember-rgb), 0.16), transparent 62%);
  opacity: 0;
  transition: opacity var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-card:hover,
.nb-card:focus-visible {
  transform: translateY(-4px);
  border-color: var(--nb-line-hard);
}

.nb-card:hover::before,
.nb-card:focus-visible::before {
  opacity: 1;
}

.nb-card__media {
  position: relative;
  aspect-ratio: 1;
  width: 100%;
  display: grid;
  place-items: center;
  margin-bottom: var(--nb-s4);
  border-radius: var(--nb-r-md);
  background:
    radial-gradient(circle at 50% 42%, rgba(255, 255, 255, 0.05), transparent 62%),
    var(--nb-abyss);
  overflow: hidden;
}

/* The aperture that frames every product image. */
.nb-card__media::after {
  content: '';
  position: absolute;
  inset: 12%;
  border-radius: 50%;
  border: 1px solid var(--nb-line-soft);
  pointer-events: none;
  transition:
    inset var(--nb-t-base) var(--nb-ease-orbit),
    border-color var(--nb-t-base) var(--nb-ease-orbit);
}

.nb-card:hover .nb-card__media::after {
  inset: 7%;
  border-color: rgba(var(--nb-ember-rgb), 0.4);
}

.nb-card__media img {
  width: 58%;
  height: 58%;
  object-fit: contain;
  transition: transform var(--nb-t-base) var(--nb-ease-orbit);
}

.nb-card:hover .nb-card__media img {
  transform: scale(1.07);
}

.nb-card__placeholder {
  width: 42%;
  color: var(--nb-ash);
}

.nb-card__badges {
  position: absolute;
  top: var(--nb-s2);
  left: var(--nb-s2);
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  z-index: 2;
}

.nb-card__badges span {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  padding: 3px 7px;
  font-family: var(--nb-font-mono);
  font-size: 9.5px;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: #fff;
  background: color-mix(in srgb, var(--badge-color, var(--nb-ember)) 82%, black);
  border-radius: var(--nb-r-xs);
}

/* Sold-out: the aperture goes dark and a mono stamp crosses it. */
.nb-card__soldout {
  position: absolute;
  inset: 0;
  z-index: 3;
  display: grid;
  place-items: center;
  background: rgba(4, 5, 10, 0.74);
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
}

.nb-card__soldout span {
  padding: 0.3rem 0.8rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--nb-frost);
  border: 1px solid var(--nb-line-hard);
  border-radius: var(--nb-r-xs);
}

.nb-card__body {
  display: flex;
  flex-direction: column;
  flex: 1;
  gap: var(--nb-s2);
}

.nb-card__cat {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-card__title {
  font-family: var(--nb-font-ui);
  font-size: 0.95rem;
  font-weight: 620;
  line-height: 1.3;
  letter-spacing: -0.015em;
  color: var(--nb-white);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.nb-card__foot {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--nb-s3);
  margin-top: auto;
  padding-top: var(--nb-s4);
}

.nb-card__price {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: 1.02rem;
  font-weight: 600;
  letter-spacing: -0.03em;
  color: var(--nb-white);
  font-variant-numeric: tabular-nums;
}

.nb-card__from {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: 9.5px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
  margin-bottom: 1px;
}

/* Action is an aperture button that fills on card hover. */
.nb-card__go {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  flex: none;
  color: var(--nb-mist);
  border: 1px solid var(--nb-line);
  border-radius: 50%;
  transition:
    color var(--nb-t-fast) var(--nb-ease-orbit),
    background var(--nb-t-fast) var(--nb-ease-orbit),
    border-color var(--nb-t-fast) var(--nb-ease-orbit),
    transform var(--nb-t-fast) var(--nb-ease-mass);
}

.nb-card__go svg {
  width: 15px;
  height: 15px;
}

.nb-card:hover .nb-card__go {
  color: #fff;
  background: var(--nb-ember);
  border-color: var(--nb-ember);
  transform: rotate(-45deg);
}

.nb-card.is-out {
  opacity: 0.62;
}

.nb-card.is-out:hover {
  transform: none;
}

/* ---- Card grid ---- */
.nb-cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(212px, 1fr));
  gap: var(--nb-s4);
}

@media (max-width: 519px) {
  .nb-cards {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--nb-s3);
  }

  .nb-card {
    padding: var(--nb-s3);
  }

  .nb-card__title {
    font-size: 0.85rem;
  }
}

/* ================================================= 4. CATALOG CONTROL DECK */
/* Search + filters + sort presented as one instrument panel that sticks
   under the navbar. Not three separate boxes stacked. */

.nb-deck {
  position: sticky;
  top: var(--nb-nav-h);
  z-index: 30;
  margin-bottom: var(--nb-s6);
  padding: var(--nb-s4);
  background: rgba(7, 9, 18, 0.86);
  backdrop-filter: blur(16px) saturate(1.2);
  -webkit-backdrop-filter: blur(16px) saturate(1.2);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
}

.nb-deck__row {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
}

.nb-deck__row + .nb-deck__row {
  margin-top: var(--nb-s3);
}

.nb-search {
  position: relative;
  flex: 1;
  min-width: 0;
}

.nb-search input {
  padding-left: 2.6rem;
}

.nb-search__icon {
  position: absolute;
  left: 0.9rem;
  top: 50%;
  transform: translateY(-50%);
  width: 16px;
  height: 16px;
  color: var(--nb-dust);
  pointer-events: none;
}

.nb-search__clear {
  position: absolute;
  right: 0.55rem;
  top: 50%;
  transform: translateY(-50%);
  display: grid;
  place-items: center;
  width: 26px;
  height: 26px;
  color: var(--nb-dust);
  border-radius: 50%;
}

.nb-search__clear:hover {
  color: var(--nb-white);
  background: var(--nb-surface-2);
}

.nb-deck__count {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
  white-space: nowrap;
}

@media (max-width: 767px) {
  .nb-deck {
    padding: var(--nb-s3);
  }

  .nb-deck__row--meta {
    justify-content: space-between;
  }
}

/* ================================================================ 5. STATES */

/* ---- Skeleton: an aperture that breathes, matching the card geometry ---- */
.nb-skel {
  position: relative;
  overflow: hidden;
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  padding: var(--nb-s4);
}

.nb-skel__bar,
.nb-skel__disc {
  background: linear-gradient(90deg, var(--nb-surface-2) 0%, var(--nb-surface-3) 50%, var(--nb-surface-2) 100%);
  background-size: 220% 100%;
  animation: nb-shimmer 1.5s var(--nb-ease-orbit) infinite;
}

.nb-skel__disc {
  aspect-ratio: 1;
  border-radius: var(--nb-r-md);
  margin-bottom: var(--nb-s4);
}

.nb-skel__bar {
  height: 9px;
  border-radius: 99px;
}

.nb-skel__bar + .nb-skel__bar {
  margin-top: var(--nb-s2);
}

.nb-skel__bar--short {
  width: 52%;
}

@keyframes nb-shimmer {
  0% {
    background-position: 130% 0;
  }
  100% {
    background-position: -130% 0;
  }
}

/* ---- Empty state: an aperture with nothing in it. On-concept. ---- */
.nb-empty {
  display: grid;
  justify-items: center;
  gap: var(--nb-s4);
  padding: clamp(3rem, 8vw, 6rem) var(--nb-s5);
  text-align: center;
}

.nb-empty__eye {
  position: relative;
  width: clamp(84px, 14vw, 128px);
  aspect-ratio: 1;
  border-radius: 50%;
  border: 1px solid var(--nb-line);
  display: grid;
  place-items: center;
}

.nb-empty__eye::before {
  content: '';
  position: absolute;
  inset: 22%;
  border-radius: 50%;
  border: 1px dashed var(--nb-line-hard);
  animation: nb-orbit 22s linear infinite;
}

.nb-empty__eye::after {
  content: '';
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--nb-ash);
}

.nb-empty h2,
.nb-empty h3 {
  font-size: var(--nb-fs-h3);
}

.nb-empty p {
  color: var(--nb-mist);
  max-width: 42ch;
}

/* ---- Toast / feedback signal ---- */
.nb-toast {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
  padding: 0.85rem 1.1rem;
  font-size: var(--nb-fs-sm);
  font-weight: 550;
  color: var(--nb-white);
  background: rgba(11, 14, 26, 0.96);
  border: 1px solid var(--nb-line-hard);
  border-left: 2px solid var(--nb-ember);
  border-radius: var(--nb-r-md);
  box-shadow: var(--nb-e3);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
}

.nb-toast--ok {
  border-left-color: #3ddc84;
}

.nb-toast--err {
  border-left-color: var(--nb-ember);
}

/* ================================================================ 6. MODAL */

.nb-modal__backdrop {
  position: fixed;
  inset: 0;
  z-index: 90;
  background: rgba(4, 5, 10, 0.78);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
}

.nb-modal__panel {
  position: relative;
  z-index: 91;
  width: 100%;
  max-width: 520px;
  max-height: min(88vh, 760px);
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: clamp(1.4rem, 3vw, 2.2rem);
  background: linear-gradient(180deg, var(--nb-carbon), var(--nb-abyss));
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-lg);
  box-shadow: var(--nb-e3);
}

.nb-modal__close {
  position: absolute;
  top: var(--nb-s4);
  right: var(--nb-s4);
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  color: var(--nb-mist);
  border: 1px solid var(--nb-line);
  border-radius: 50%;
  transition:
    color var(--nb-t-micro) var(--nb-ease-orbit),
    background var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-modal__close:hover {
  color: var(--nb-white);
  background: var(--nb-surface-2);
}

.nb-modal__title {
  font-size: var(--nb-fs-h3);
  margin-bottom: var(--nb-s2);
}

/* ========================================================== 7. PRODUCT PAGE */

.nb-pdp {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.85fr);
  gap: clamp(1.5rem, 4vw, 3.5rem);
  align-items: start;
}

@media (max-width: 1023px) {
  .nb-pdp {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* Media column sticks while the info column scrolls — "contenido sticky". */
.nb-pdp__media {
  position: sticky;
  top: calc(var(--nb-nav-h) + var(--nb-s5));
}

@media (max-width: 1023px) {
  .nb-pdp__media {
    position: static;
  }
}

.nb-pdp__stage {
  position: relative;
  aspect-ratio: 1;
  display: grid;
  place-items: center;
  border-radius: var(--nb-r-lg);
  background:
    radial-gradient(circle at 50% 38%, rgba(255, 255, 255, 0.06), transparent 60%),
    linear-gradient(180deg, var(--nb-carbon), var(--nb-abyss));
  border: 1px solid var(--nb-line-soft);
  overflow: hidden;
}

.nb-pdp__stage::after {
  content: '';
  position: absolute;
  inset: 14%;
  border-radius: 50%;
  border: 1px solid var(--nb-line-soft);
  pointer-events: none;
}

.nb-pdp__stage img {
  width: 56%;
  height: 56%;
  object-fit: contain;
  z-index: 1;
}

.nb-pdp__title {
  font-size: var(--nb-fs-h1);
  font-weight: 780;
  letter-spacing: -0.04em;
  margin-bottom: var(--nb-s4);
}

.nb-pdp__price {
  font-family: var(--nb-font-mono);
  font-size: clamp(1.8rem, 3.4vw, 2.6rem);
  font-weight: 600;
  letter-spacing: -0.04em;
  color: var(--nb-white);
  font-variant-numeric: tabular-nums;
}

/* Spec table — instrument readout, not bullet points. */
.nb-specs {
  display: grid;
  border-top: 1px solid var(--nb-line-soft);
}

.nb-specs__row {
  display: grid;
  grid-template-columns: minmax(90px, 0.4fr) minmax(0, 1fr);
  gap: var(--nb-s4);
  padding: 0.8rem 0;
  border-bottom: 1px solid var(--nb-line-soft);
  font-size: var(--nb-fs-sm);
}

.nb-specs__k {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
  padding-top: 2px;
}

.nb-specs__v {
  color: var(--nb-frost);
}

/* ============================================================== 8. REVIEWS */

.nb-review {
  display: flex;
  flex-direction: column;
  gap: var(--nb-s3);
  padding: var(--nb-s5);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  break-inside: avoid;
  transition:
    border-color var(--nb-t-fast) var(--nb-ease-orbit),
    background var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-review:hover {
  border-color: var(--nb-line-hard);
  background: var(--nb-surface-2);
}

.nb-review__head {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
}

.nb-review__avatar {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  flex: none;
  font-family: var(--nb-font-mono);
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--nb-frost);
  background: linear-gradient(140deg, var(--nb-mineral), var(--nb-slate));
  border: 1px solid var(--nb-line);
  border-radius: 50%;
}

.nb-stars {
  display: inline-flex;
  gap: 2px;
  color: var(--nb-ember);
}

.nb-stars svg {
  width: 13px;
  height: 13px;
}

.nb-stars .is-off {
  color: var(--nb-ash);
}

/* Masonry-ish column layout so reviews don't form a rigid 3-col grid. */
.nb-reviews-cols {
  columns: 3 300px;
  column-gap: var(--nb-s4);
}

.nb-reviews-cols > * {
  margin-bottom: var(--nb-s4);
}

/* ================================================================== 9. FAQ */

.nb-faq__item {
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-faq__q {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--nb-s4);
  width: 100%;
  padding: var(--nb-s5) 0;
  text-align: left;
  font-family: var(--nb-font-display);
  font-size: clamp(1.02rem, 1.6vw, 1.22rem);
  font-weight: 700;
  letter-spacing: -0.025em;
  color: var(--nb-frost);
  transition: color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-faq__q:hover {
  color: var(--nb-white);
}

.nb-faq__icon {
  position: relative;
  width: 28px;
  height: 28px;
  flex: none;
  border: 1px solid var(--nb-line);
  border-radius: 50%;
  transition:
    transform var(--nb-t-fast) var(--nb-ease-mass),
    border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-faq__icon::before,
.nb-faq__icon::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  background: currentColor;
  transform: translate(-50%, -50%);
  transition: opacity var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-faq__icon::before {
  width: 11px;
  height: 1.5px;
}

.nb-faq__icon::after {
  width: 1.5px;
  height: 11px;
}

.nb-faq__item.is-open .nb-faq__icon {
  transform: rotate(90deg);
  border-color: rgba(var(--nb-ember-rgb), 0.6);
  color: var(--nb-ember);
}

.nb-faq__item.is-open .nb-faq__icon::after {
  opacity: 0;
}

.nb-faq__a {
  overflow: hidden;
  color: var(--nb-mist);
  font-size: var(--nb-fs-sm);
  line-height: 1.7;
}

.nb-faq__a > div {
  padding-bottom: var(--nb-s5);
  max-width: 68ch;
}

/* ============================================================ 10. TUTORIALS */

.nb-tut {
  display: grid;
  gap: var(--nb-s4);
  padding: var(--nb-s5);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  transition:
    transform var(--nb-t-fast) var(--nb-ease-orbit),
    border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-tut:hover {
  transform: translateY(-3px);
  border-color: var(--nb-line-hard);
}

.nb-tut__num {
  font-family: var(--nb-font-mono);
  font-size: clamp(1.6rem, 3vw, 2.4rem);
  font-weight: 600;
  letter-spacing: -0.05em;
  color: transparent;
  -webkit-text-stroke: 1px var(--nb-ash);
  line-height: 1;
}

.nb-tut__frame {
  position: relative;
  aspect-ratio: 16 / 9;
  border-radius: var(--nb-r-md);
  overflow: hidden;
  background: var(--nb-abyss);
  border: 1px solid var(--nb-line-soft);
}

.nb-tut__frame iframe,
.nb-tut__frame lite-youtube {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}

/* ============================================================== 11. LEGAL */
/* Long-form legal/terms: editorial measure, sticky index, real hierarchy. */

.nb-legal {
  display: grid;
  grid-template-columns: minmax(0, 220px) minmax(0, 1fr);
  gap: clamp(1.5rem, 5vw, 4rem);
  align-items: start;
}

@media (max-width: 899px) {
  .nb-legal {
    grid-template-columns: minmax(0, 1fr);
  }

  .nb-legal__index {
    position: static;
  }
}

.nb-legal__index {
  position: sticky;
  top: calc(var(--nb-nav-h) + var(--nb-s5));
  display: grid;
  gap: 2px;
}

.nb-legal__index a {
  padding: 0.42rem 0.7rem;
  font-size: var(--nb-fs-xs);
  color: var(--nb-dust);
  border-left: 1px solid var(--nb-line-soft);
  transition:
    color var(--nb-t-micro) var(--nb-ease-orbit),
    border-color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-legal__index a:hover,
.nb-legal__index a.is-active {
  color: var(--nb-white);
  border-left-color: var(--nb-ember);
}

.nb-prose {
  max-width: 72ch;
  color: var(--nb-mist);
  line-height: 1.75;
}

.nb-prose h2 {
  margin: var(--nb-s7) 0 var(--nb-s4);
  font-size: var(--nb-fs-h3);
  scroll-margin-top: calc(var(--nb-nav-h) + 2rem);
}

.nb-prose h2:first-child {
  margin-top: 0;
}

.nb-prose h3 {
  margin: var(--nb-s5) 0 var(--nb-s3);
  font-size: 1.05rem;
}

.nb-prose p,
.nb-prose ul,
.nb-prose ol {
  margin-bottom: var(--nb-s4);
}

.nb-prose ul,
.nb-prose ol {
  padding-left: 1.2rem;
  list-style: disc;
}

.nb-prose ol {
  list-style: decimal;
}

.nb-prose li {
  margin-bottom: 0.4rem;
}

.nb-prose a {
  color: var(--nb-ember-hot);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.nb-prose strong {
  color: var(--nb-frost);
}

/* ============================================================== 12. BENTO */
/* Advantages / "why us" — deliberately uneven tiles so it is not 3 equal
   boxes in a row. Scale contrast is the point. */

.nb-bento {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: var(--nb-s4);
}

.nb-bento__tile {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: var(--nb-s3);
  min-height: 200px;
  padding: var(--nb-s5);
  background: linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  overflow: hidden;
  grid-column: span 2;
  transition: border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-bento__tile:hover {
  border-color: var(--nb-line-hard);
}

.nb-bento__tile--wide {
  grid-column: span 4;
}

.nb-bento__tile--tall {
  grid-column: span 3;
  min-height: 280px;
}

.nb-bento__tile--full {
  grid-column: span 6;
}

@media (max-width: 899px) {
  .nb-bento {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .nb-bento__tile,
  .nb-bento__tile--wide,
  .nb-bento__tile--tall,
  .nb-bento__tile--full {
    grid-column: span 2;
    min-height: 168px;
  }
}

.nb-bento__k {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-bento__h {
  font-size: var(--nb-fs-h3);
  letter-spacing: -0.03em;
}

.nb-bento__p {
  font-size: var(--nb-fs-sm);
  color: var(--nb-mist);
  max-width: 46ch;
}

/* A soft light source in the tile's corner — depth without a glow border. */
.nb-bento__tile::before {
  content: '';
  position: absolute;
  width: 60%;
  aspect-ratio: 1;
  top: -20%;
  right: -12%;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(var(--nb-ember-rgb), 0.12), transparent 66%);
  pointer-events: none;
}

.nb-bento__tile:nth-child(even)::before {
  background: radial-gradient(circle, rgba(90, 60, 170, 0.16), transparent 66%);
}

/* =========================================================== 12b. SEARCH UI */

.nb-search-trigger {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
  width: 100%;
  padding: 0.72rem 0.8rem 0.72rem 1rem;
  color: var(--nb-dust);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-pill);
  text-align: left;
  transition:
    border-color var(--nb-t-micro) var(--nb-ease-orbit),
    background var(--nb-t-micro) var(--nb-ease-orbit),
    color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-search-trigger:hover {
  color: var(--nb-frost);
  background: var(--nb-surface-2);
  border-color: var(--nb-line-hard);
}

.nb-search-trigger svg {
  width: 16px;
  height: 16px;
  flex: none;
}

.nb-search-trigger__label {
  flex: 1;
  font-size: var(--nb-fs-sm);
}

.nb-kbd {
  padding: 2px 7px;
  font-family: var(--nb-font-mono);
  font-size: 10px;
  color: var(--nb-mist);
  background: var(--nb-surface-2);
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-xs);
  flex: none;
}

.nb-search-overlay {
  position: fixed;
  inset: 0;
  z-index: 90;
  display: flex;
  justify-content: center;
  align-items: flex-start;
  padding: clamp(0.75rem, 6vh, 5rem) var(--nb-gutter) var(--nb-s5);
  overflow-y: auto;
}

.nb-search-panel {
  position: relative;
  z-index: 91;
  width: 100%;
  max-width: 760px;
  display: flex;
  flex-direction: column;
  gap: var(--nb-s4);
  max-height: 82vh;
  padding: var(--nb-s5);
  background: linear-gradient(180deg, var(--nb-carbon), var(--nb-abyss));
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-lg);
  box-shadow: var(--nb-e3);
}

.nb-search-panel__head {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
}

.nb-search-panel__results {
  display: flex;
  flex-direction: column;
  gap: var(--nb-s2);
  overflow-y: auto;
  overscroll-behavior: contain;
  min-height: 0;
}

.nb-search-panel__empty {
  padding-block: var(--nb-s6);
}

/* ============================================================ 13. CTA CLOSE */
/* Final section: the aperture opens to full-bleed. Memorable close. */

.nb-close {
  position: relative;
  padding-block: clamp(4rem, 12vw, 9rem);
  text-align: center;
  overflow: hidden;
}

.nb-close::before {
  content: '';
  position: absolute;
  inset: -50% -10% auto;
  aspect-ratio: 2 / 1;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(var(--nb-ember-rgb), 0.18), rgba(46, 31, 94, 0.12) 42%, transparent 68%);
  pointer-events: none;
}

.nb-close__title {
  position: relative;
  font-size: var(--nb-fs-display);
  font-weight: 800;
  line-height: 0.9;
  letter-spacing: -0.05em;
  margin-bottom: var(--nb-s5);
}

/* ===== MERGED COMPONENT PARTIALS ===== */

/* ---------------------------------------------------------------------------
   CATALOG
   --------------------------------------------------------------------------- */
/* ============================================================================
   NEBULA MARKET — CATALOGUE LAYER
   ----------------------------------------------------------------------------
   Compositions owned by:
     components/products.njk         — the catalogue grid + control deck
     components/products-slider.njk  — the full-bleed rail
     snippets/pagination.njk         — the page stepper
   Depends on custom.css (tokens) and nebula-ui.css (.nb-card/.nb-cards/.nb-deck
   /.nb-skel*/.nb-empty/.nb-modal__*). Everything below is built from existing
   tokens only — no new colour, easing, radius or font.

   NOTE: this file is linked from the components that need it so it works even
   before it is hoisted into layouts/master.njk's <head>. Duplicate <link>s to
   the same href are de-duplicated by the browser.
   ========================================================================== */

/* ============================================== A. CATALOGUE SECTION SHELL */

.nb-cat,
.nb-slidersec {
  position: relative;
  scroll-margin-top: calc(var(--nb-nav-h) + var(--nb-s4));
}

.nb-cat > .nb-shell,
.nb-slidersec > .nb-shell {
  position: relative;
  z-index: 1;
}

/* Decorative layer clips itself rather than the section: the section must NOT
   clip, or the sticky control deck loses the viewport as its scrollport and
   the group modals (position: fixed) risk being trapped. */
.nb-cat__deco {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: clip;
  pointer-events: none;
}

/* One oversized aperture arc bleeding off the left margin. A single shape —
   not a glow border, not particles. */
.nb-cat__arc {
  position: absolute;
  top: clamp(-10rem, -7vw, -2rem);
  left: clamp(-32rem, -20vw, -11rem);
  width: clamp(26rem, 44vw, 52rem);
  aspect-ratio: 1;
  border-radius: 50%;
  border: 1px solid var(--nb-line-soft);
  background: radial-gradient(circle at 64% 36%, rgba(var(--nb-ember-rgb), 0.06), transparent 56%);
  pointer-events: none;
  z-index: 0;
}

/* ==================================================== B. CATALOGUE HEADER */
/* 12-column editorial grid. The headline takes the left seven columns, the
   manifest the last four, baseline-aligned. The empty column between them is
   the composition, not wasted space. */

.nb-cat__head {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  align-items: end;
  gap: var(--nb-s5) var(--nb-s4);
  margin-bottom: var(--nb-s6);
}

.nb-cat__intro {
  grid-column: 1 / span 7;
}

.nb-cat__title {
  margin-top: var(--nb-s4);
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-display);
  font-weight: 800;
  line-height: 0.9;
  letter-spacing: -0.05em;
  /* Display sizes + a long product word must never push the page sideways. */
  overflow-wrap: break-word;
}

.nb-cat__lead {
  margin-top: var(--nb-s4);
  max-width: 44ch;
  color: var(--nb-mist);
  font-size: clamp(0.98rem, 1.1vw, 1.1rem);
}

.nb-cat__manifest {
  grid-column: 9 / span 4;
  display: grid;
  gap: var(--nb-s4);
  padding-left: var(--nb-s5);
  border-left: 1px solid var(--nb-line-soft);
}

@media (max-width: 1023px) {
  .nb-cat__intro {
    grid-column: 1 / span 12;
  }

  .nb-cat__manifest {
    grid-column: 1 / span 12;
    grid-auto-flow: column;
    grid-auto-columns: minmax(0, 1fr);
    padding-left: 0;
    padding-top: var(--nb-s4);
    border-left: 0;
    border-top: 1px solid var(--nb-line-soft);
  }
}

@media (max-width: 519px) {
  .nb-cat__manifest {
    grid-auto-flow: row;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--nb-s4) var(--nb-s3);
  }
}

/* ======================================================= C. CONTROL DECK */
/* The deck extends .nb-deck (sticky instrument panel) into a single row:
   readout on the left, stock legend on the right. */

.nb-cat__deck {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--nb-s3) var(--nb-s5);
}

.nb-cat__readout {
  display: inline-flex;
  align-items: center;
  gap: 0.55em;
  flex: none;
}

.nb-cat__readout b {
  color: var(--nb-white);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.06em;
}

.nb-cat__readout .nb-cat__slash {
  color: var(--nb-ash);
}

/* Legend explains the pip colours used on every card. Scrolls rather than
   wraps on narrow screens (it also carries .nb-rail-scroll in the markup). */
.nb-cat__legend {
  display: flex;
  align-items: center;
  gap: var(--nb-s4);
  margin-left: auto;
  min-width: 0;
}

.nb-cat__legend .nb-pip {
  flex: none;
}

@media (max-width: 767px) {
  .nb-cat__legend {
    margin-left: 0;
    width: 100%;
    padding-top: var(--nb-s3);
    border-top: 1px solid var(--nb-line-soft);
    gap: var(--nb-s3);
  }
}

/* ==================================================== D. GRID FOOT / CTA */

.nb-cat__grid {
  position: relative;
}

.nb-cat__foot {
  display: flex;
  align-items: center;
  gap: var(--nb-s4);
  margin-top: var(--nb-s7);
}

/* The rule does the aligning — the CTA is pushed to the right margin. */
.nb-cat__foot::before {
  content: '';
  flex: 1;
  height: 1px;
  min-width: var(--nb-s6);
  background: linear-gradient(90deg, transparent, var(--nb-line-hard));
}

.nb-cat__foot .nb-btn {
  flex: none;
}

/* Empty state sits inside a hairline plate so it never reads as a broken page. */
.nb-cat__void {
  border: 1px dashed var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
}

/* ===================================================== E. SLIDER SECTION */
/* Deliberately the mirror of the grid section: the readout mark anchors the
   left margin, the copy is flushed right, and the rail below is full-bleed. */

.nb-slidersec__head {
  display: grid;
  grid-template-columns: minmax(0, auto) minmax(0, 1fr);
  align-items: end;
  gap: var(--nb-s5);
  margin-bottom: var(--nb-s6);
}

.nb-slidersec__mark {
  display: grid;
  gap: var(--nb-s1);
  align-content: end;
}

.nb-slidersec__mark-v {
  font-family: var(--nb-font-mono);
  font-size: clamp(2.6rem, 8vw, 5.5rem);
  font-weight: 600;
  line-height: 0.8;
  letter-spacing: -0.06em;
  color: transparent;
  -webkit-text-stroke: 1px var(--nb-ash);
  font-variant-numeric: tabular-nums;
}

.nb-slidersec__copy {
  justify-self: end;
  text-align: right;
  max-width: 52ch;
}

.nb-slidersec__rail {
  justify-content: flex-start;
  flex-direction: row-reverse;
}

.nb-slidersec__title {
  margin-top: var(--nb-s4);
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h1);
  font-weight: 780;
  line-height: 0.96;
  letter-spacing: -0.042em;
  overflow-wrap: break-word;
}

.nb-slidersec__lead {
  margin-top: var(--nb-s3);
  margin-left: auto;
  max-width: 46ch;
  color: var(--nb-mist);
}

/* Hairline instrument strip that introduces the rail. */
.nb-slidersec__strip {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--nb-s4);
  padding-top: var(--nb-s4);
  margin-bottom: var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-slidersec__hint {
  display: inline-flex;
  align-items: center;
  gap: 0.6em;
  white-space: nowrap;
}

.nb-slidersec__hint svg {
  width: 14px;
  height: 14px;
  flex: none;
}

@media (max-width: 767px) {
  .nb-slidersec__head {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--nb-s4);
  }

  .nb-slidersec__copy {
    justify-self: start;
    text-align: left;
  }

  .nb-slidersec__rail {
    flex-direction: row;
  }

  .nb-slidersec__lead {
    margin-left: 0;
  }
}

.nb-slidersec__foot {
  display: flex;
  align-items: center;
  gap: var(--nb-s4);
  margin-top: var(--nb-s6);
}

.nb-slidersec__foot::after {
  content: '';
  flex: 1;
  height: 1px;
  min-width: var(--nb-s6);
  background: linear-gradient(270deg, transparent, var(--nb-line-hard));
}

.nb-slidersec__foot .nb-btn {
  flex: none;
}

/* ================================================ F. SLIDER LOADING STATE */
/* Splide is mounted by assets/script.js. Until it reports `is-initialized`
   the slides have no computed width, so a skeleton rail stands in. The
   fallback animation retires the skeleton even if :has() is unsupported or
   Splide never loads, so content can never stay covered. */

.products-slider-container {
  position: relative;
}

.products-slider-container:not(:has(.splide.is-initialized)) {
  min-height: clamp(300px, 40vw, 400px);
}

.nb-slider-skel {
  position: absolute;
  inset: 0;
  z-index: 3;
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: minmax(0, 1fr);
  gap: var(--nb-s5);
  padding-inline: var(--nb-gutter);
  background: var(--nb-void);
  pointer-events: none;
  animation: nb-skel-retire 2600ms var(--nb-ease-orbit) forwards;
}

.products-slider-container:has(.splide.is-initialized) .nb-slider-skel {
  animation: none;
  opacity: 0;
  visibility: hidden;
}

.nb-slider-skel .nb-skel {
  display: flex;
  flex-direction: column;
}

.nb-slider-skel .nb-skel__disc {
  border-radius: var(--nb-r-md);
}

@media (max-width: 899px) {
  .nb-slider-skel > :nth-child(n + 3) {
    display: none;
  }
}

@media (max-width: 519px) {
  .nb-slider-skel > :nth-child(n + 2) {
    display: none;
  }
}

@keyframes nb-skel-retire {
  0%,
  62% {
    opacity: 1;
    visibility: visible;
  }
  100% {
    opacity: 0;
    visibility: hidden;
  }
}

/* Splide only sizes slides itself when autoWidth is off. At >=1280px the
   theme switches to autoWidth, so the rail needs an intrinsic slide width. */
@media (min-width: 1280px) {
  .products-slider-container .splide__slide {
    width: clamp(208px, 17vw, 262px);
  }
}

/* ========================================================= G. PAGINATION */
/* A page stepper read as instrument hardware: mono tabular figures, aperture
   buttons, one hairline rule. One responsive layout, not a mobile clone. */

.nb-pager {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--nb-s4);
  margin-top: var(--nb-s6);
  padding-top: var(--nb-s4);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-pager__readout {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.45em;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-pager__readout b {
  color: var(--nb-frost);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.06em;
}

.nb-pager__controls {
  display: flex;
  align-items: center;
  gap: var(--nb-s2);
  min-width: 0;
  margin-left: auto;
}

.nb-pager__pages {
  display: flex;
  align-items: center;
  gap: var(--nb-s1);
  min-width: 0;
}

.nb-pager__page,
.nb-pager__step {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5em;
  flex: none;
  min-width: 44px;
  min-height: 44px;
  padding-inline: 0.7rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-xs);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.04em;
  color: var(--nb-mist);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-pill);
  transition:
    color var(--nb-t-micro) var(--nb-ease-orbit),
    background var(--nb-t-micro) var(--nb-ease-orbit),
    border-color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-pager__page {
  padding-inline: 0.45rem;
}

a.nb-pager__page:hover,
a.nb-pager__step:hover {
  color: var(--nb-white);
  background: var(--nb-surface-2);
  border-color: var(--nb-line-hard);
}

/* Current page is the one ember pointer in the component. */
.nb-pager__page.is-active {
  color: var(--nb-white);
  background: rgba(var(--nb-ember-rgb), 0.14);
  border-color: rgba(var(--nb-ember-rgb), 0.5);
}

.nb-pager__page[aria-disabled='true'],
.nb-pager__step[aria-disabled='true'] {
  color: var(--nb-ash);
  background: transparent;
  cursor: not-allowed;
}

.nb-pager__step svg {
  width: 15px;
  height: 15px;
  flex: none;
}

@media (max-width: 599px) {
  .nb-pager {
    justify-content: flex-start;
  }

  .nb-pager__controls {
    margin-left: 0;
    width: 100%;
  }

  .nb-pager__pages {
    flex: 1;
  }

  .nb-pager__step-label {
    display: none;
  }
}

/* ---------------------------------------------------------------------------
   PDP
   --------------------------------------------------------------------------- */
/* ============================================================================
   NEBULA MARKET — PDP LAYER
   ----------------------------------------------------------------------------
   Additive partial for: components/product-page.njk, snippets/product-form.njk,
   snippets/product-card-horizontal.njk.
   Depends on custom.css (tokens) + nebula-ui.css (compositions).
   Every value here is composed from existing --nb-* tokens: no new colour,
   easing, radius, font or keyframe is introduced. The only animation reused is
   `nb-pulse`, already defined in custom.css.

   Loaded by product-page.njk. If it is added to layouts/master.njk the
   horizontal card also picks it up inside the search overlay.
   ========================================================================== */

/* ==================================================== 1. PDP PAGE / MASTHEAD */

.nb-pdp-page {
  position: relative;
}

/* Masthead: title occupies the left measure, the status readout is pinned to
   the right end of a hairline. Deliberately not a centred header. */
.nb-pdp-head {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
  gap: var(--nb-s5);
  padding-block: clamp(2rem, 5vw, 4.25rem) var(--nb-s5);
  border-bottom: 1px solid var(--nb-line-soft);
}

@media (max-width: 767px) {
  .nb-pdp-head {
    grid-template-columns: minmax(0, 1fr);
    align-items: start;
  }
}

.nb-pdp-head__title {
  margin-top: var(--nb-s4);
  font-size: clamp(2rem, 5vw, 4.1rem);
  font-weight: 800;
  line-height: 0.94;
  letter-spacing: -0.045em;
  max-width: 20ch;
}

/* Instrument strip under the masthead rule: mono readouts, hairline separated. */
.nb-pdp-strip {
  display: flex;
  flex-wrap: wrap;
  gap: 0;
  padding-block: var(--nb-s3);
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-pdp-strip > * {
  display: flex;
  align-items: baseline;
  gap: var(--nb-s2);
  padding-inline: var(--nb-s4);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-mist);
  border-left: 1px solid var(--nb-line-soft);
}

.nb-pdp-strip > *:first-child {
  padding-left: 0;
  border-left: 0;
}

.nb-pdp-strip b {
  font-weight: 500;
  color: var(--nb-dust);
}

/* ---- Status readout (merchant-defined colour lives in --st) ---- */
.nb-pdp-status {
  display: inline-flex;
  align-items: center;
  gap: var(--nb-s3);
  min-height: 44px;
  padding: 0.45rem 1rem 0.45rem 0.8rem;
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-pill);
}

.nb-pdp-status__dot {
  position: relative;
  width: 9px;
  height: 9px;
  flex: none;
  border-radius: 50%;
  background: var(--st, var(--nb-ember));
  box-shadow: 0 0 10px 1px var(--st, var(--nb-ember));
  animation: nb-pulse 2.4s var(--nb-ease-orbit) infinite;
}

/* Preserved legacy node — rendered as a static halo instead of a second loop. */
.nb-pdp-status .pulsating {
  position: absolute;
  inset: -3px;
  border-radius: 50%;
  opacity: 0.3;
  filter: blur(4px);
  pointer-events: none;
}

/* The dot carries the merchant colour; the label stays high-contrast so the
   status is legible whatever hex the shop owner picks. */
.nb-pdp-status__label {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-white);
}

/* ========================================================= 2. MEDIA COLUMN */

.nb-pdp__info {
  display: grid;
  gap: var(--nb-s6);
  align-content: start;
}

/* Reticle inside the aperture stage — instrument, not decoration for its own
   sake. Masked so it never crosses the product itself. */
.nb-pdp-stage__reticle {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  opacity: 0.85;
  background-image:
    linear-gradient(to right, var(--nb-line-soft) 1px, transparent 1px),
    linear-gradient(to bottom, var(--nb-line-soft) 1px, transparent 1px);
  background-size: 25% 25%;
  mask-image: radial-gradient(circle at 50% 50%, transparent 32%, #000 80%);
  -webkit-mask-image: radial-gradient(circle at 50% 50%, transparent 32%, #000 80%);
}

.nb-pdp-stage__tick {
  position: absolute;
  z-index: 2;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  color: var(--nb-dust);
  white-space: nowrap;
}

.nb-pdp-stage__tick--tl {
  top: var(--nb-s4);
  left: var(--nb-s4);
}

.nb-pdp-stage__tick--br {
  bottom: var(--nb-s4);
  right: var(--nb-s4);
}

@media (max-width: 519px) {
  .nb-pdp-stage__tick {
    display: none;
  }
}

.nb-pdp-stage__ph {
  width: 34%;
  color: var(--nb-ash);
  z-index: 1;
}

/* Circular plate thumbnails — the aperture motif at small scale. */
.nb-pdp-thumbs {
  margin-top: var(--nb-s4);
}

.nb-pdp-thumb {
  flex: none;
  display: grid;
  place-items: center;
  width: 72px;
  height: 72px;
  border-radius: 50%;
  background: var(--nb-abyss);
  border: 1px solid var(--nb-line-soft);
  overflow: hidden;
  transition:
    border-color var(--nb-t-fast) var(--nb-ease-orbit),
    transform var(--nb-t-fast) var(--nb-ease-mass);
}

.nb-pdp-thumb img {
  width: 72%;
  height: 72%;
  object-fit: contain;
}

.nb-pdp-thumb:hover,
.nb-pdp-thumb:focus-visible {
  border-color: rgba(var(--nb-ember-rgb), 0.5);
  transform: translateY(-2px);
}

/* ============================================================ 3. BUY PANEL */

.nb-buy {
  position: relative;
  display: grid;
  gap: var(--nb-s5);
  padding: clamp(1.1rem, 2.4vw, 1.6rem);
  background: linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-lg);
  overflow: hidden;
  isolation: isolate;
}

/* One soft light source, top-right. Replaces the glow border. */
.nb-buy::before {
  content: '';
  position: absolute;
  top: -34%;
  right: -18%;
  width: 62%;
  aspect-ratio: 1;
  z-index: -1;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(var(--nb-ember-rgb), 0.13), transparent 66%);
  pointer-events: none;
}

.nb-buy__head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--nb-s4);
}

.nb-buy__price {
  min-width: 0;
}

.nb-buy__block {
  padding-top: var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-buy__stock {
  padding-bottom: 0.35rem;
}

/* Out of stock must stay readable — dust is too dim for a real state. */
.nb-buy .nb-pip--out {
  color: var(--nb-mist);
}

/* <small> validation messages need to occupy their own line. */
.nb-buy .nb-field-error {
  display: block;
}

.nb-buy__inf {
  width: 15px;
  height: 15px;
  color: var(--nb-mist);
}

.nb-buy__cta {
  display: grid;
  gap: var(--nb-s3);
}

@media (min-width: 520px) {
  .nb-buy__cta {
    grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
  }
}

/* --------------------------------------------------------- 3a. VARIANTS -- */

.nb-variants {
  display: grid;
  gap: var(--nb-s2);
}

.nb-variant {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--nb-s4);
  width: 100%;
  min-height: 56px;
  padding: 0.7rem 0.95rem;
  text-align: left;
  color: var(--nb-frost);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-md);
  overflow: hidden;
  transition:
    background var(--nb-t-micro) var(--nb-ease-orbit),
    border-color var(--nb-t-micro) var(--nb-ease-orbit),
    color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-variant:not([data-active]):hover:not(:disabled) {
  background: var(--nb-surface-2);
  border-color: var(--nb-line-hard);
}

.nb-variant:disabled {
  opacity: 0.44;
  cursor: not-allowed;
}

.nb-variant[data-active] {
  background: rgba(var(--nb-ember-rgb), 0.09);
  border-color: rgba(var(--nb-ember-rgb), 0.42);
  color: var(--nb-white);
}

/* Selection is an ember meridian on the edge, not a filled pill. */
.nb-variant[data-active]::before {
  content: '';
  position: absolute;
  left: 0;
  top: 50%;
  width: 2px;
  height: 44%;
  transform: translateY(-50%);
  background: var(--nb-ember);
  box-shadow: 0 0 10px 1px rgba(var(--nb-ember-rgb), 0.8);
}

.nb-variant__main {
  flex: 1;
  min-width: 0;
}

.nb-variant__name {
  display: block;
  font-size: var(--nb-fs-sm);
  font-weight: 620;
  letter-spacing: -0.012em;
}

.nb-variant__desc {
  display: block;
  margin-top: 2px;
  font-size: var(--nb-fs-xs);
  color: var(--nb-mist);
  white-space: pre-line;
}

.nb-variant__stock {
  display: block;
  margin-top: 5px;
}

.nb-variant__cost {
  flex: none;
  text-align: right;
}

.nb-variant__price {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-sm);
  font-weight: 600;
  letter-spacing: -0.02em;
  color: var(--nb-white);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.nb-variant__slash {
  display: block;
  margin-top: 2px;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  color: var(--nb-dust);
  text-decoration: line-through;
  white-space: nowrap;
}

/* --------------------------------------------------------- 3b. QUANTITY -- */

.nb-qty {
  display: flex;
  align-items: stretch;
  max-width: 13.5rem;
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-pill);
  overflow: hidden;
}

.nb-qty:focus-within {
  border-color: rgba(var(--nb-ember-rgb), 0.6);
  box-shadow: 0 0 0 3px rgba(var(--nb-ember-rgb), 0.14);
}

.nb-qty__btn {
  display: grid;
  place-items: center;
  width: 46px;
  min-height: 46px;
  flex: none;
  color: var(--nb-mist);
  transition:
    color var(--nb-t-micro) var(--nb-ease-orbit),
    background var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-qty__btn:hover:enabled {
  color: var(--nb-white);
  background: var(--nb-surface-3);
}

.nb-qty__btn:disabled {
  opacity: 0.34;
  pointer-events: none;
}

.nb-qty__btn svg {
  width: 18px;
  height: 18px;
}

.nb-qty__input {
  flex: 1;
  min-width: 0;
  padding: 0 0.4rem;
  text-align: center;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-sm);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--nb-white);
  background: transparent;
  border: 0;
  border-inline: 1px solid var(--nb-line-soft);
}

.nb-qty__input::-webkit-outer-spin-button,
.nb-qty__input::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}

.nb-qty__input[type='number'] {
  -moz-appearance: textfield;
  appearance: textfield;
}

.nb-qty__input:disabled {
  color: var(--nb-dust);
}

/* ----------------------------------------------------------- 3c. ADDONS -- */

.nb-addons {
  display: grid;
  gap: var(--nb-s2);
}

.nb-addon {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--nb-s3);
  padding: var(--nb-s3);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-md);
}

.nb-addon__img {
  width: 46px;
  height: 46px;
  flex: none;
  border-radius: 50%;
  object-fit: cover;
  border: 1px solid var(--nb-line);
}

.nb-addon__main {
  flex: 1 1 8rem;
  min-width: 0;
}

.nb-addon__name {
  font-size: var(--nb-fs-sm);
  font-weight: 620;
}

.nb-addon__desc {
  margin-top: 2px;
  font-size: var(--nb-fs-xs);
  color: var(--nb-mist);
  white-space: pre-line;
}

.nb-addon__act {
  display: flex;
  align-items: center;
  gap: var(--nb-s4);
  margin-left: auto;
}

.nb-addon__price {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-sm);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--nb-white);
  white-space: nowrap;
}

.nb-addon__btn {
  min-width: 6.75rem;
}

.nb-addon__btn--drop {
  --btn-fg: var(--nb-mist);
  --btn-line: var(--nb-line);
}

.nb-addon__btn--drop:hover {
  --btn-fg: var(--nb-ember-hot);
  --btn-line: rgba(var(--nb-ember-rgb), 0.5);
}

/* ------------------------------------------------- 3d. NOTES / DISCOUNTS -- */

.nb-note {
  display: flex;
  align-items: flex-start;
  gap: var(--nb-s3);
  padding: 0.72rem 0.9rem;
  font-size: var(--nb-fs-sm);
  color: var(--nb-mist);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-left: 2px solid var(--nb-ash);
  border-radius: var(--nb-r-sm);
}

.nb-note__ico {
  display: grid;
  place-items: center;
  width: 19px;
  height: 19px;
  flex: none;
  margin-top: 2px;
  color: var(--nb-mist);
  border: 1px solid var(--nb-line-hard);
  border-radius: 50%;
}

.nb-note__ico svg {
  width: 11px;
  height: 11px;
}

.nb-note--err {
  color: var(--nb-frost);
  background: rgba(var(--nb-ember-rgb), 0.08);
  border-color: rgba(var(--nb-ember-rgb), 0.28);
  border-left-color: var(--nb-ember);
}

.nb-vol {
  display: grid;
  gap: var(--nb-s3);
  padding: 0.85rem 0.9rem;
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-md);
}

.nb-vol__row {
  display: flex;
  align-items: flex-start;
  gap: var(--nb-s3);
}

.nb-vol__txt {
  font-size: var(--nb-fs-sm);
  color: var(--nb-mist);
}

.nb-vol__num {
  font-family: var(--nb-font-mono);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--nb-white);
}

.nb-vol__hint {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.12em;
  color: var(--nb-dust);
}

.nb-vol__bar {
  height: 3px;
  border-radius: var(--nb-r-pill);
  background: var(--nb-surface-3);
  overflow: hidden;
}

.nb-vol__fill {
  height: 100%;
  background: linear-gradient(90deg, var(--nb-ember-deep), var(--nb-ember));
  transition: width var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-tiers-wrap {
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-md);
  overflow: hidden;
}

.nb-tiers-wrap__head {
  padding: 0.6rem 0.85rem;
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-tiers-scroll {
  overflow-x: auto;
  overscroll-behavior-x: contain;
}

.nb-tiers {
  width: 100%;
  min-width: 20rem;
  border-collapse: collapse;
  font-size: var(--nb-fs-sm);
}

.nb-tiers th {
  padding: 0.5rem 0.85rem;
  text-align: left;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
  border-bottom: 1px solid var(--nb-line-soft);
  white-space: nowrap;
}

.nb-tiers td {
  padding: 0.6rem 0.85rem;
  color: var(--nb-mist);
  border-bottom: 1px solid var(--nb-line-soft);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-xs);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.nb-tiers tr:last-child td {
  border-bottom: 0;
}

.nb-tiers th:last-child,
.nb-tiers td:last-child {
  text-align: right;
}

.nb-tiers__off {
  color: var(--nb-white);
  font-weight: 600;
}

/* ======================================================== 4. LIVE SIGNALS */

.nb-livestats {
  display: grid;
  gap: var(--nb-s4);
  padding-top: var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-livestat {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
  font-size: var(--nb-fs-sm);
  color: var(--nb-mist);
}

.nb-livestat__ico {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  flex: none;
  color: var(--nb-mist);
  border: 1px solid var(--nb-line);
  border-radius: 50%;
}

.nb-livestat__ico svg {
  width: 16px;
  height: 16px;
}

.nb-livestat b {
  font-family: var(--nb-font-mono);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--nb-white);
}

.nb-upsell {
  display: grid;
  gap: var(--nb-s3);
  padding-top: var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
}

/* ---- Page badges ---- */
.nb-pdp-badges {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s2);
}

.nb-pdp-badges span {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 4px 9px;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: #fff;
  background: color-mix(in srgb, var(--badge-color, var(--nb-ember)) 82%, black);
  border-radius: var(--nb-r-xs);
}

/* ============================================================= 5. DOSSIER */
/* Long-form product copy reuses .nb-legal (sticky index + prose measure);
   only the numbered plate markers are new. */

.nb-dossier__sec {
  scroll-margin-top: calc(var(--nb-nav-h) + 2rem);
}

.nb-dossier__sec + .nb-dossier__sec {
  margin-top: var(--nb-s8);
  padding-top: var(--nb-s7);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-dossier__num {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: clamp(1.5rem, 3.6vw, 2.4rem);
  font-weight: 600;
  line-height: 1;
  letter-spacing: -0.04em;
  color: transparent;
  -webkit-text-stroke: 1px var(--nb-ash);
}

.nb-dossier__h {
  margin: var(--nb-s3) 0 var(--nb-s5);
}

/* ============================================================== 6. PLATES */
/* Secondary imagery, deliberately uneven so it never reads as a photo grid. */

.nb-plates {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: var(--nb-s4);
}

.nb-plates__cell {
  position: relative;
  grid-column: span 6;
  margin: 0;
  scroll-margin-top: calc(var(--nb-nav-h) + 2rem);
  background: var(--nb-abyss);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  overflow: hidden;
}

.nb-plates__cell img {
  width: 100%;
  height: auto;
}

.nb-plates__idx {
  position: absolute;
  top: var(--nb-s3);
  left: var(--nb-s4);
  z-index: 1;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  color: var(--nb-mist);
  text-shadow: 0 1px 6px rgba(4, 5, 10, 0.9);
}

@media (min-width: 900px) {
  .nb-plates__cell {
    grid-column: span 3;
  }

  .nb-plates__cell:nth-child(4n + 1) {
    grid-column: span 4;
  }

  .nb-plates__cell:nth-child(4n + 2) {
    grid-column: span 2;
    align-self: end;
  }

  .nb-plates__cell:nth-child(4n + 3) {
    grid-column: 2 / span 2;
  }

  .nb-plates__cell:nth-child(4n + 4) {
    grid-column: span 3;
  }
}

/* =================================================== 7. SALES NOTIFICATION */

.nb-salesnote {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
  max-width: 23rem;
  padding: var(--nb-s2) var(--nb-s5) var(--nb-s2) var(--nb-s2);
  background: linear-gradient(180deg, var(--nb-carbon), var(--nb-abyss));
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-pill);
  box-shadow: var(--nb-e3);
}

.nb-salesnote__img {
  width: 46px;
  height: 46px;
  flex: none;
  border-radius: 50%;
  object-fit: cover;
  border: 1px solid var(--nb-line);
}

.nb-salesnote__body {
  min-width: 0;
}

.nb-salesnote__k {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.nb-salesnote__n {
  display: block;
  font-size: var(--nb-fs-sm);
  font-weight: 620;
  color: var(--nb-white);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ==================================================== 8. HORIZONTAL CARD */
/* Used by the PDP upsell rail and the search overlay. NOTE: display is
   intentionally left to the Tailwind `flex` utility on the element so the
   search filter's `.hidden` toggle keeps winning the cascade. */

.nb-hcard {
  position: relative;
  padding: var(--nb-s2);
  color: var(--nb-frost);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-md);
  transition:
    background var(--nb-t-fast) var(--nb-ease-orbit),
    border-color var(--nb-t-fast) var(--nb-ease-orbit),
    transform var(--nb-t-fast) var(--nb-ease-orbit);
  -webkit-tap-highlight-color: transparent;
}

.nb-hcard.hidden {
  display: none !important;
}

.nb-hcard:hover,
.nb-hcard:focus-visible {
  background: var(--nb-surface-2);
  border-color: var(--nb-line-hard);
  transform: translateX(3px);
}

.nb-hcard__media {
  position: relative;
  display: grid;
  place-items: center;
  width: clamp(64px, 17vw, 88px);
  height: clamp(64px, 17vw, 88px);
  flex: none;
  border-radius: 50%;
  background:
    radial-gradient(circle at 50% 40%, rgba(255, 255, 255, 0.05), transparent 62%),
    var(--nb-abyss);
  border: 1px solid var(--nb-line-soft);
  overflow: hidden;
}

.nb-hcard__media img {
  width: 68%;
  height: 68%;
}

.nb-hcard__ph {
  width: 44%;
  color: var(--nb-ash);
}

.nb-hcard__body {
  flex: 1;
  min-width: 0;
}

.nb-hcard__title {
  display: block;
  font-size: var(--nb-fs-sm);
  font-weight: 650;
  letter-spacing: -0.015em;
  color: var(--nb-white);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.nb-hcard__badges {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-top: 4px;
}

.nb-hcard__badges span {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  padding: 2px 6px;
  font-family: var(--nb-font-mono);
  font-size: 9.5px;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: #fff;
  background: color-mix(in srgb, var(--badge-color, var(--nb-ember)) 82%, black);
  border-radius: var(--nb-r-xs);
}

.nb-hcard__meta {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--nb-s2) var(--nb-s3);
  margin-top: 5px;
}

/* Same legibility floor as the buy panel: dust is too dim for a real state. */
.nb-hcard .nb-pip--out {
  color: var(--nb-mist);
}

.nb-hcard__price {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-sm);
  font-weight: 600;
  letter-spacing: -0.025em;
  color: var(--nb-white);
  font-variant-numeric: tabular-nums;
}

.nb-hcard__slash {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  color: var(--nb-dust);
  text-decoration: line-through;
}

.nb-hcard__go {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  flex: none;
  margin-right: var(--nb-s2);
  color: var(--nb-mist);
  border: 1px solid var(--nb-line-soft);
  border-radius: 50%;
  transition:
    color var(--nb-t-fast) var(--nb-ease-orbit),
    border-color var(--nb-t-fast) var(--nb-ease-orbit),
    transform var(--nb-t-fast) var(--nb-ease-mass);
}

.nb-hcard__go svg {
  width: 15px;
  height: 15px;
}

.nb-hcard:hover .nb-hcard__go {
  color: var(--nb-white);
  border-color: rgba(var(--nb-ember-rgb), 0.55);
  transform: translateX(2px);
}

@media (max-width: 519px) {
  .nb-hcard__go {
    display: none;
  }
}

/* ---------------------------------------------------------------------------
   CART-AUTH
   --------------------------------------------------------------------------- */
/* ============================================================================
   NEBULA MARKET — CART / CHECKOUT / AUTH  (Deep Field partial)
   ----------------------------------------------------------------------------
   Owned by the cart + auth pass. Depends on tokens from custom.css and the
   primitives in nebula-ui.css. No new colours, easings, radii or fonts —
   every value below resolves to an existing var(--nb-*).

   Three compositions that nebula-ui.css does not already cover:
     1. THE MANIFEST — the cart as an instrument readout. One panel, hairline
        rows, an aperture per specimen, mono tabular columns. Not a stack of
        rounded product boxes.
     2. THE SUMMARY  — a sticky machined panel with a single large mono amount.
     3. THE AUTH MODAL internals — step telemetry + a 6-cell OTP register.
   ========================================================================== */

/* ================================================== 1. CART PAGE MASTHEAD */
/* Asymmetric: copy hugs the left, live telemetry is pinned bottom-right on
   the same optical baseline. No centred pill → H1 → subtitle stack. */

.nb-cart-head {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
  gap: var(--nb-s5) var(--nb-s6);
  padding-bottom: var(--nb-s5);
  margin-bottom: clamp(2rem, 5vw, 3.5rem);
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-cart-head__glyph {
  width: 15px;
  height: 15px;
  flex: none;
  color: var(--nb-mist);
}

.nb-cart-head__title {
  margin-top: var(--nb-s4);
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-display);
  font-weight: 800;
  line-height: 0.88;
  letter-spacing: -0.05em;
}

.nb-cart-head__lead {
  max-width: 44ch;
  margin-top: var(--nb-s4);
  color: var(--nb-mist);
}

.nb-cart-head__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s4) clamp(1.25rem, 3.5vw, 2.75rem);
  text-align: right;
  justify-content: flex-end;
}

@media (max-width: 767px) {
  .nb-cart-head {
    grid-template-columns: minmax(0, 1fr);
    align-items: start;
  }

  .nb-cart-head__meta {
    justify-content: flex-start;
    text-align: left;
  }
}

/* ====================================================== 2. CART FRAMEWORK */
/* Deliberately off-balance: the manifest takes roughly 2/3, the instrument
   panel 1/3, with a wide optical gutter between them. */

.nb-cart {
  display: grid;
  grid-template-columns: minmax(0, 1.66fr) minmax(0, 0.6fr);
  gap: clamp(1.5rem, 3.5vw, 3.25rem);
  align-items: start;
}

@media (max-width: 1023px) {
  .nb-cart {
    grid-template-columns: minmax(0, 1fr);
  }
}

.nb-cart__items {
  min-width: 0;
}

/* ----------------------------------------------------------- 2a. MESSAGES */

.nb-cart-msg {
  display: grid;
  gap: 0.2rem;
  margin-bottom: var(--nb-s4);
  padding: var(--nb-s4) var(--nb-s5);
  font-size: var(--nb-fs-sm);
  color: var(--nb-frost);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line);
  border-left: 2px solid var(--nb-ember);
  border-radius: var(--nb-r-md);
}

.nb-cart-msg--err {
  margin-block: var(--nb-s4);
  color: var(--nb-white);
  background: rgba(var(--nb-ember-rgb), 0.1);
  border-color: rgba(var(--nb-ember-rgb), 0.32);
  border-left-color: var(--nb-ember);
}

/* ------------------------------------------------------------ 2b. LOADING */
/* The instrument is acquiring the signal: an aperture, not a page spinner. */

.nb-cart-loading {
  display: grid;
  justify-items: center;
  gap: var(--nb-s4);
  padding: clamp(2.5rem, 8vw, 5rem) var(--nb-s5);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  background: var(--nb-surface-1);
}

.nb-cart-loading__eye {
  display: grid;
  place-items: center;
  width: clamp(72px, 11vw, 96px);
  aspect-ratio: 1;
  border-radius: 50%;
  border: 1px solid var(--nb-line);
  color: var(--nb-ember);
}

.nb-cart-loading__eye svg {
  width: 38%;
  height: auto;
}

.nb-cart-loading__label {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--nb-mist);
}

/* ======================================================== 3. THE MANIFEST */
/* One enclosure, hairline-separated rows, mono column headers. Reads as a
   cargo/observation manifest rather than a list of product cards. */

.nb-manifest {
  --nb-manifest-cols: 2.1rem 76px minmax(0, 1fr) auto minmax(92px, auto) 44px;
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  background: linear-gradient(180deg, var(--nb-surface-1), transparent 55%);
  overflow: hidden;
}

.nb-manifest__head {
  display: grid;
  grid-template-columns: var(--nb-manifest-cols);
  gap: var(--nb-s4);
  align-items: center;
  padding: var(--nb-s3) clamp(0.9rem, 1.8vw, 1.5rem);
  background: var(--nb-surface-1);
  border-bottom: 1px solid var(--nb-line);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-manifest__head span:nth-child(5) {
  text-align: right;
}

.nb-manifest__row {
  position: relative;
  display: grid;
  grid-template-columns: var(--nb-manifest-cols);
  grid-template-areas: 'idx eye body step price kill';
  gap: var(--nb-s4);
  align-items: center;
  padding: var(--nb-s4) clamp(0.9rem, 1.8vw, 1.5rem);
  transition: background var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-manifest__row + .nb-manifest__row {
  border-top: 1px solid var(--nb-line-soft);
}

.nb-manifest__row:hover {
  background: var(--nb-surface-1);
}

.nb-manifest__idx {
  grid-area: idx;
  font-family: var(--nb-font-mono);
  font-size: 0.82rem;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.06em;
  color: var(--nb-ash);
  line-height: 1;
}

/* ---- The specimen aperture: every line item is framed by a circle ---- */
.nb-manifest__eye {
  grid-area: eye;
  position: relative;
  display: grid;
  place-items: center;
  width: 76px;
  aspect-ratio: 1;
  border-radius: 50%;
  background:
    radial-gradient(circle at 50% 38%, rgba(255, 255, 255, 0.06), transparent 62%),
    var(--nb-abyss);
  border: 1px solid var(--nb-line-soft);
  overflow: hidden;
  transition: border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-manifest__eye::after {
  content: '';
  position: absolute;
  inset: 7%;
  border-radius: 50%;
  border: 1px solid var(--nb-line-soft);
  pointer-events: none;
  transition:
    inset var(--nb-t-base) var(--nb-ease-orbit),
    border-color var(--nb-t-base) var(--nb-ease-orbit);
}

.nb-manifest__row:hover .nb-manifest__eye {
  border-color: var(--nb-line-hard);
}

.nb-manifest__row:hover .nb-manifest__eye::after {
  inset: 2%;
  border-color: rgba(var(--nb-ember-rgb), 0.4);
}

/* object-fit intentionally not declared — the theme's own image-fit class
   (object-cover / object-scale-down) stays in control. */
.nb-manifest__eye img {
  width: 74%;
  height: 74%;
  border-radius: 50%;
}

.nb-manifest__eye svg {
  width: 44%;
  height: auto;
  color: var(--nb-ash);
}

/* ---- Body ---- */
.nb-manifest__body {
  grid-area: body;
  min-width: 0;
  display: grid;
  gap: 3px;
  justify-items: start;
}

.nb-manifest__name {
  max-width: 100%;
  font-size: 0.98rem;
  font-weight: 620;
  line-height: 1.28;
  letter-spacing: -0.015em;
  color: var(--nb-white);
  overflow-wrap: anywhere;
  transition: color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-manifest__name:hover {
  color: var(--nb-ember-hot);
}

.nb-manifest__variant {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
  overflow-wrap: anywhere;
}

.nb-manifest__hint {
  font-size: var(--nb-fs-xs);
  line-height: 1.45;
  color: var(--nb-mist);
}

.nb-manifest__hint::before {
  content: '';
  display: inline-block;
  vertical-align: middle;
  width: 5px;
  height: 5px;
  margin-right: 0.5em;
  border-radius: 50%;
  background: var(--nb-ember);
  box-shadow: 0 0 8px rgba(var(--nb-ember-rgb), 0.8);
}

.nb-manifest__hint span {
  font-family: var(--nb-font-mono);
  font-variant-numeric: tabular-nums;
  color: var(--nb-frost);
}

.nb-manifest__addons {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-top: 2px;
}

.nb-manifest__addon {
  display: inline-flex;
  align-items: center;
  padding: 2px 8px;
  font-family: var(--nb-font-mono);
  font-size: 9.5px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--nb-mist);
  background: var(--nb-surface-2);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-xs);
}

/* ---- Quantity register: a machined segmented control ---- */
.nb-step {
  grid-area: step;
  justify-self: start;
  display: inline-flex;
  align-items: center;
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-pill);
  overflow: hidden;
  transition:
    border-color var(--nb-t-micro) var(--nb-ease-orbit),
    box-shadow var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-step:focus-within {
  border-color: rgba(var(--nb-ember-rgb), 0.55);
  box-shadow: 0 0 0 3px rgba(var(--nb-ember-rgb), 0.13);
}

.nb-step__btn {
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  flex: none;
  color: var(--nb-mist);
  background: transparent;
  transition:
    color var(--nb-t-micro) var(--nb-ease-orbit),
    background var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-step__btn:hover:not(:disabled) {
  color: var(--nb-white);
  background: var(--nb-surface-3);
}

.nb-step__btn:disabled {
  opacity: 0.35;
  cursor: not-allowed;
  pointer-events: none;
}

.nb-step__btn svg {
  width: 16px;
  height: 16px;
}

.nb-step__field {
  width: 3.2rem;
  height: 44px;
  padding: 0;
  text-align: center;
  font-family: var(--nb-font-mono);
  font-size: 0.9rem;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  color: var(--nb-white);
  background: transparent;
  border: 0;
  border-inline: 1px solid var(--nb-line-soft);
  border-radius: 0;
  appearance: textfield;
  -moz-appearance: textfield;
}

.nb-step__field::-webkit-outer-spin-button,
.nb-step__field::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}

.nb-step__field:disabled {
  opacity: 0.5;
}

/* ---- Price readout ---- */
.nb-manifest__price {
  grid-area: price;
  display: grid;
  gap: 2px;
  justify-items: end;
  text-align: right;
}

.nb-manifest__k {
  font-family: var(--nb-font-mono);
  font-size: 9.5px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-manifest__v {
  font-family: var(--nb-font-mono);
  font-size: 1.02rem;
  font-weight: 600;
  letter-spacing: -0.03em;
  font-variant-numeric: tabular-nums;
  color: var(--nb-white);
  white-space: nowrap;
}

/* ---- Remove: an aperture that ignites on hover ---- */
.nb-manifest__kill {
  grid-area: kill;
  justify-self: end;
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  color: var(--nb-dust);
  background: transparent;
  border: 1px solid transparent;
  border-radius: 50%;
  transition:
    color var(--nb-t-micro) var(--nb-ease-orbit),
    background var(--nb-t-micro) var(--nb-ease-orbit),
    border-color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-manifest__kill:hover {
  color: var(--nb-ember-hot);
  background: rgba(var(--nb-ember-rgb), 0.1);
  border-color: rgba(var(--nb-ember-rgb), 0.42);
}

.nb-manifest__kill svg {
  width: 16px;
  height: 16px;
}

/* ---- Mobile: the row folds into two bands, nothing is merely stacked ---- */
@media (max-width: 899px) {
  .nb-manifest__head {
    display: none;
  }

  .nb-manifest__idx {
    display: none;
  }

  .nb-manifest__row {
    grid-template-columns: 64px minmax(0, 1fr) auto;
    grid-template-areas:
      'eye  body body'
      'step step price';
    gap: var(--nb-s3) var(--nb-s4);
    align-items: center;
    padding: var(--nb-s4) var(--nb-s4);
  }

  .nb-manifest__eye {
    width: 64px;
    align-self: start;
  }

  /* The remove control leaves the flow so the two bands stay tight. */
  .nb-manifest__kill {
    grid-area: auto;
    position: absolute;
    top: var(--nb-s2);
    right: var(--nb-s2);
  }

  .nb-manifest__body {
    padding-right: 40px;
  }

  .nb-manifest__price {
    align-self: center;
  }
}

@media (max-width: 519px) {
  .nb-step__field {
    width: 2.6rem;
  }
}

/* ==================================================== 4. THE ORDER PANEL */

.nb-cart__summary {
  min-width: 0;
}

.nb-summary {
  position: sticky;
  top: calc(var(--nb-nav-h) + var(--nb-s5));
  padding: clamp(1.15rem, 2.2vw, 1.75rem);
}

@media (max-width: 1023px) {
  .nb-summary {
    position: static;
  }
}

.nb-summary__rail {
  margin-bottom: var(--nb-s4);
}

.nb-summary__title {
  font-size: var(--nb-fs-h3);
  margin-bottom: var(--nb-s4);
}

.nb-summary__line {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--nb-s4);
  padding: 0.55rem 0;
  border-top: 1px solid var(--nb-line-soft);
}

.nb-summary__k {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-summary__v {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-sm);
  font-variant-numeric: tabular-nums;
  color: var(--nb-frost);
}

.nb-summary__amount {
  display: grid;
  gap: var(--nb-s2);
  padding: var(--nb-s4) 0 var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-summary__total {
  font-family: var(--nb-font-mono);
  font-size: clamp(1.55rem, 3.2vw, 2.05rem);
  font-weight: 600;
  line-height: 1;
  letter-spacing: -0.045em;
  font-variant-numeric: tabular-nums;
  color: var(--nb-white);
  overflow-wrap: anywhere;
}

.nb-summary__captcha {
  margin-bottom: var(--nb-s4);
}

.nb-summary__assure {
  display: grid;
  gap: var(--nb-s2);
  margin-top: var(--nb-s5);
  padding-top: var(--nb-s4);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-summary__assure li {
  display: flex;
  align-items: center;
  gap: 0.6em;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-mist);
}

.nb-summary__assure svg {
  width: 13px;
  height: 13px;
  flex: none;
  color: var(--nb-dust);
}

/* ======================================================= 5. AUTH MODAL */
/* Uses .nb-modal__backdrop / __panel / __close from nebula-ui.css; only the
   shell and the internals of the two auth steps are defined here. */

.nb-authmodal {
  position: fixed;
  inset: 0;
  z-index: 90;
  overflow-y: auto;
  overscroll-behavior: contain;
}

.nb-authmodal__shell {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  padding: var(--nb-s6) var(--nb-gutter);
}

/* The shared close control is bumped to a 44px touch target inside this
   modal only — nebula-ui.css stays untouched. */
.nb-authmodal .nb-modal__close {
  width: 44px;
  height: 44px;
}

.nb-authmodal__head {
  display: flex;
  align-items: flex-start;
  gap: var(--nb-s4);
  margin-bottom: var(--nb-s5);
  padding-right: 48px;
}

/* The aperture mark: identity, and the only ember in the panel besides the CTA. */
.nb-authmodal__eye {
  position: relative;
  display: grid;
  place-items: center;
  width: 42px;
  height: 42px;
  flex: none;
  border-radius: 50%;
  border: 1px solid var(--nb-line-hard);
  background:
    radial-gradient(circle at 34% 30%, rgba(var(--nb-ember-rgb), 0.5), transparent 58%),
    var(--nb-abyss);
}

.nb-authmodal__eye::after {
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--nb-ember);
  box-shadow: 0 0 10px rgba(var(--nb-ember-rgb), 0.9);
}

.nb-authmodal__kicker {
  display: block;
  margin-bottom: 2px;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

/* Step telemetry — replaces a progress bar with two coordinate readouts. */
.nb-authmodal__steps {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s5);
  padding-bottom: var(--nb-s5);
  margin-bottom: var(--nb-s5);
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-authmodal__step {
  display: flex;
  align-items: center;
  gap: 0.55em;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-ash);
  transition: color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-authmodal__step::before {
  content: '';
  width: 6px;
  height: 6px;
  flex: none;
  border-radius: 50%;
  background: currentColor;
}

.nb-authmodal__step.is-on {
  color: var(--nb-frost);
}

.nb-authmodal__step.is-on::before {
  background: var(--nb-ember);
  box-shadow: 0 0 9px rgba(var(--nb-ember-rgb), 0.85);
}

.nb-authmodal__hint {
  margin-top: 0.15rem;
  font-size: var(--nb-fs-xs);
  line-height: 1.5;
  color: var(--nb-mist);
}

.nb-authmodal__hint span {
  color: var(--nb-frost);
  overflow-wrap: anywhere;
}

.nb-authmodal__field {
  margin-top: var(--nb-s4);
}

.nb-authmodal__captcha {
  margin-top: var(--nb-s4);
}

.nb-authmodal__cta {
  margin-top: var(--nb-s5);
}

/* ---- OTP register: six machined cells, mono, tabular ---- */
.nb-otp {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: var(--nb-s2);
  max-width: 21rem;
  margin-top: var(--nb-s4);
}

.nb-otp input {
  width: 100%;
  height: 52px;
  padding: 0;
  text-align: center;
  font-family: var(--nb-font-mono);
  font-size: 1.1rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--nb-white);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-sm);
  transition:
    border-color var(--nb-t-micro) var(--nb-ease-orbit),
    background var(--nb-t-micro) var(--nb-ease-orbit),
    box-shadow var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-otp input:hover {
  border-color: var(--nb-line-hard);
}

/* Focus outline is never removed here — :focus-visible from custom.css still
   paints on top of this ring. */
.nb-otp input:focus {
  background: var(--nb-surface-2);
  border-color: rgba(var(--nb-ember-rgb), 0.6);
  box-shadow: 0 0 0 3px rgba(var(--nb-ember-rgb), 0.14);
}

@media (max-width: 519px) {
  .nb-otp {
    gap: 6px;
    max-width: none;
  }

  .nb-otp input {
    height: 48px;
    font-size: 1rem;
  }

  .nb-authmodal__shell {
    padding: var(--nb-s5) var(--nb-s4);
  }

  .nb-authmodal__head {
    gap: var(--nb-s3);
  }
}

/* Validation copy shared by both auth steps and the checkout form. */
.nb-form-error {
  margin-top: var(--nb-s3);
  font-size: var(--nb-fs-sm);
  color: var(--nb-ember-hot);
}

/* ---------------------------------------------------------------------------
   REVIEWS
   --------------------------------------------------------------------------- */
/* ============================================================================
   NEBULA MARKET — REVIEWS / SOCIAL PROOF PARTIAL
   ----------------------------------------------------------------------------
   Owned by the reviews pass (feedback page, feedback band, vouches).
   Built ONLY from tokens in custom.css and compositions already in
   nebula-ui.css (.nb-review, .nb-reviews-cols, .nb-stars, .nb-specs,
   .nb-rail, .nb-ticked, .nb-empty). No new colours, radii or easings.

   Concept: reviews are the *log* of the instrument. Metadata is mono
   telemetry, the aggregate is an aperture readout, the homepage strip is a
   slow drift rather than a hype marquee.
   ========================================================================== */

/* ============================================ 1. AGGREGATE — APERTURE READOUT */

.nb-agg {
  display: grid;
  gap: var(--nb-s5);
  justify-items: start;
}

.nb-agg__disc {
  position: relative;
  width: clamp(8.5rem, 14vw, 12rem);
  aspect-ratio: 1;
  display: grid;
  align-content: center;
  justify-items: center;
  border-radius: 50%;
  border: 1px solid var(--nb-line-hard);
  background:
    radial-gradient(circle at 50% 40%, rgba(var(--nb-ember-rgb), 0.11), transparent 64%),
    var(--nb-surface-1);
}

/* Two concentric hairlines: the instrument reticle. Decorative only —
   the markup nodes carry aria-hidden and sit inside a [data-nb-gate]
   section, so `.nb-offscreen *` parks them when scrolled away. */
.nb-agg__ring {
  position: absolute;
  inset: 7%;
  border-radius: 50%;
  border: 1px dashed var(--nb-line);
  animation: nb-orbit 42s linear infinite;
  pointer-events: none;
}

.nb-agg__ring--inner {
  inset: 20%;
  border-style: solid;
  border-color: transparent;
  border-top-color: rgba(var(--nb-ember-rgb), 0.55);
  animation-duration: 16s;
  animation-direction: reverse;
}

.nb-agg__val {
  font-family: var(--nb-font-mono);
  font-variant-numeric: tabular-nums;
  font-feature-settings: 'tnum' 1;
  font-size: clamp(1.55rem, 3.2vw, 2.35rem);
  font-weight: 600;
  line-height: 1;
  letter-spacing: -0.04em;
  color: var(--nb-white);
}

.nb-agg__key {
  margin-top: 0.55rem;
  max-width: 10ch;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  line-height: 1.45;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  text-align: center;
  color: var(--nb-dust);
}

.nb-agg__stars {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
  flex-wrap: wrap;
}

.nb-agg__score {
  font-family: var(--nb-font-mono);
  font-variant-numeric: tabular-nums;
  font-size: var(--nb-fs-sm);
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--nb-frost);
}

.nb-agg .nb-specs {
  width: 100%;
  min-width: min(100%, 15rem);
}

/* ================================================ 2. FEEDBACK BAND (HOMEPAGE) */
/* Title left, aggregate right, then a full-bleed drift. Deliberately NOT a
   centred header over an equal grid. */

.nb-revband {
  position: relative;
  overflow: hidden;
  border-top: 1px solid var(--nb-line-soft);
}

.nb-revband__head {
  display: grid;
  grid-template-columns: minmax(0, 1.5fr) minmax(0, 0.72fr);
  align-items: end;
  gap: var(--nb-s7) var(--nb-s6);
  margin-bottom: clamp(2.5rem, 5vw, 4.5rem);
}

.nb-revband__title {
  margin-top: var(--nb-s5);
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h1);
  font-weight: 780;
  line-height: 0.96;
  letter-spacing: -0.042em;
  max-width: 16ch;
}

.nb-revband__lead {
  margin-top: var(--nb-s4);
  max-width: 46ch;
  color: var(--nb-mist);
}

.nb-revband__aside {
  justify-self: end;
}

@media (max-width: 899px) {
  .nb-revband__head {
    grid-template-columns: minmax(0, 1fr);
    align-items: start;
    gap: var(--nb-s6);
  }

  .nb-revband__aside {
    justify-self: start;
    width: 100%;
  }

  /* Disc beside the rating, spec table on its own full-width row below. */
  .nb-agg {
    grid-template-columns: auto minmax(0, 1fr);
    align-items: center;
    gap: var(--nb-s5);
  }

  .nb-agg__disc {
    width: clamp(6.5rem, 24vw, 8.5rem);
  }

  .nb-agg .nb-specs {
    grid-column: 1 / -1;
  }
}

@media (max-width: 519px) {
  .nb-agg {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--nb-s4);
  }

  .nb-agg .nb-specs {
    grid-column: auto;
  }
}

/* ======================================================== 3. THE DRIFT STRIP */
/* Same duplicated-track mechanism as before, but slowed to a drift, edge
   masked, paused on hover/focus, parked off-screen by [data-nb-gate], and
   turned into a plain scroller under prefers-reduced-motion. */

.nb-marquee {
  --nb-mq-gap: var(--nb-s4);
  position: relative;
  overflow: hidden;
  padding-block: var(--nb-s2) var(--nb-s6);
  mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
}

.nb-marquee__track {
  display: flex;
  gap: var(--nb-mq-gap);
  width: max-content;
  animation: nb-marquee-drift 104s linear infinite;
  will-change: transform;
}

.nb-marquee__lane {
  display: flex;
  align-items: flex-start;
  gap: var(--nb-mq-gap);
}

/* Uneven vertical rhythm so the strip reads as a constellation, not a rack. */
.nb-marquee__lane > *:nth-child(3n + 2) {
  margin-top: var(--nb-s5);
}

.nb-marquee__lane > *:nth-child(4n + 3) {
  margin-top: var(--nb-s3);
}

.nb-marquee:hover .nb-marquee__track,
.nb-marquee:focus-within .nb-marquee__track {
  animation-play-state: paused;
}

@keyframes nb-marquee-drift {
  from {
    transform: translate3d(0, 0, 0);
  }
  to {
    transform: translate3d(calc(-50% - (var(--nb-mq-gap) / 2)), 0, 0);
  }
}

@media (prefers-reduced-motion: reduce) {
  .nb-marquee {
    overflow-x: auto;
    scrollbar-width: none;
    mask-image: none;
    -webkit-mask-image: none;
  }

  .nb-marquee::-webkit-scrollbar {
    display: none;
  }

  .nb-marquee__track {
    animation: none;
  }
}

/* ---- Strip card: compact sibling of the full review card ---- */
.nb-revstrip {
  display: flex;
  flex-direction: column;
  gap: var(--nb-s3);
  width: clamp(16rem, 26vw, 21rem);
  padding: var(--nb-s5);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  transition:
    border-color var(--nb-t-fast) var(--nb-ease-orbit),
    background var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-revstrip:hover {
  border-color: var(--nb-line-hard);
  background: var(--nb-surface-2);
}

.nb-revstrip__top {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
}

.nb-revstrip__id {
  min-width: 0;
  display: grid;
  gap: 2px;
}

.nb-revstrip__name {
  font-size: var(--nb-fs-sm);
  font-weight: 620;
  color: var(--nb-white);
  letter-spacing: -0.012em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.nb-revstrip__badge {
  display: inline-flex;
  align-items: center;
  gap: 0.35em;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

/* Monochrome check — inherits the badge colour, no new hue introduced. */
.nb-revstrip__badge svg {
  width: 11px;
  height: 11px;
  flex: none;
}

.nb-revstrip__msg {
  display: -webkit-box;
  -webkit-line-clamp: 4;
  line-clamp: 4;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: var(--nb-fs-sm);
  line-height: 1.55;
  color: var(--nb-mist);
}

.nb-revstrip__foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--nb-s3);
  padding-top: var(--nb-s3);
  border-top: 1px solid var(--nb-line-soft);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-revstrip__date {
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* ================================================ 4. FEEDBACK PAGE MASTHEAD */
/* A different rhythm from the band: oversized display type hanging off the
   left edge, telemetry column pinned right, one hairline under both. */

.nb-revhead {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
  gap: var(--nb-s7) var(--nb-s8);
  padding-bottom: var(--nb-s6);
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-revhead__title {
  margin-top: var(--nb-s5);
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-display);
  font-weight: 800;
  line-height: 0.9;
  letter-spacing: -0.05em;
  max-width: 12ch;
}

.nb-revhead__sub {
  margin-top: var(--nb-s5);
  max-width: 44ch;
  color: var(--nb-mist);
}

@media (max-width: 1023px) {
  .nb-revhead {
    grid-template-columns: minmax(0, 1fr);
    align-items: start;
    gap: var(--nb-s6);
  }
}

/* ---- Body: narrow sticky legend + masonry columns. Not a symmetric grid. -- */
.nb-revbody {
  display: grid;
  grid-template-columns: minmax(0, 0.2fr) minmax(0, 1fr);
  gap: var(--nb-s8);
  margin-top: clamp(2.5rem, 5vw, 4rem);
}

.nb-revlegend {
  position: sticky;
  top: calc(var(--nb-nav-h) + var(--nb-s5));
  align-self: start;
  display: grid;
  gap: var(--nb-s4);
}

.nb-revlegend__k {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  line-height: 1.7;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-revlegend__k b {
  display: block;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  color: var(--nb-mist);
}

@media (max-width: 1023px) {
  .nb-revbody {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--nb-s5);
  }

  .nb-revlegend {
    position: static;
    grid-auto-flow: column;
    grid-auto-columns: max-content;
    gap: var(--nb-s5);
    overflow-x: auto;
    scrollbar-width: none;
  }

  .nb-revlegend::-webkit-scrollbar {
    display: none;
  }
}

/* ============================================== 5. FULL REVIEW CARD (LOG ROW) */
/* Layered on top of .nb-review from nebula-ui.css. */

.nb-rev {
  position: relative;
  cursor: pointer;
  padding-block-end: 0;
  overflow: hidden;
}

/* Cards carrying a shop reply get an ember meridian on the leading edge —
   a pointer, not a surface. */
.nb-rev--replied::before {
  content: '';
  position: absolute;
  left: 0;
  top: var(--nb-s5);
  bottom: var(--nb-s5);
  width: 2px;
  border-radius: 99px;
  background: linear-gradient(180deg, var(--nb-ember), transparent);
  pointer-events: none;
}

.nb-rev__index {
  position: absolute;
  top: var(--nb-s4);
  right: var(--nb-s5);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.18em;
  color: var(--nb-ash);
  pointer-events: none;
}

.nb-rev__head {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
  padding-right: 4.5rem;
}

.nb-rev__id {
  min-width: 0;
  display: grid;
  gap: 1px;
}

.nb-rev__name {
  font-size: var(--nb-fs-sm);
  font-weight: 620;
  letter-spacing: -0.012em;
  color: var(--nb-white);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.nb-rev__date {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-rev__msg {
  font-size: var(--nb-fs-body);
  line-height: 1.6;
  color: var(--nb-frost);
  overflow-wrap: anywhere;
}

/* The Alpine binding `:class="{ 'truncate': !expanded }"` is untouched — the
   utility is simply redefined *for this element* as a multi-line clamp so a
   collapsed review still reads as a paragraph instead of one clipped line. */
.nb-rev__msg.truncate,
.nb-rev__reply-msg.truncate {
  display: -webkit-box;
  -webkit-line-clamp: 4;
  line-clamp: 4;
  -webkit-box-orient: vertical;
  overflow: hidden;
  white-space: normal;
  text-overflow: clip;
}

.nb-rev--pull .nb-rev__msg {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h3);
  font-weight: 700;
  line-height: 1.22;
  letter-spacing: -0.028em;
  color: var(--nb-white);
}

.nb-rev--pull .nb-rev__msg.truncate {
  -webkit-line-clamp: 6;
  line-clamp: 6;
}

/* ---- Shop reply: an inset transmission, not a grey box ---- */
.nb-rev__reply {
  padding-left: var(--nb-s4);
  border-left: 1px solid var(--nb-line-hard);
}

.nb-rev__reply-msg {
  font-size: var(--nb-fs-sm);
  line-height: 1.55;
  color: var(--nb-mist);
  overflow-wrap: anywhere;
}

.nb-rev__reply-meta {
  margin-top: var(--nb-s2);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-rev__reply-meta b {
  font-weight: 500;
  color: var(--nb-ember-hot);
}

/* ---- Toggle: a real button so the card is keyboard-reachable. It carries no
   handler of its own — the click bubbles to the existing @click on the
   wrapper, so the Alpine logic stays exactly as it was. ---- */
.nb-rev__toggle {
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  align-self: flex-start;
  min-height: 44px;
  padding: 0.5rem 0;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-mist);
  transition: color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-rev__toggle:hover {
  color: var(--nb-white);
}

.nb-rev__toggle svg {
  width: 12px;
  height: 12px;
  transition: transform var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-rev__toggle svg.is-open {
  transform: rotate(180deg);
}

/* ---- Order footer: aperture thumbnails + mono manifest ---- */
.nb-rev__foot {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
  margin: var(--nb-s2) calc(var(--nb-s5) * -1) 0;
  padding: var(--nb-s3) var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
  background: rgba(255, 255, 255, 0.012);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-rev__thumbs {
  display: flex;
  flex: none;
  align-items: center;
}

.nb-rev__thumb {
  width: 26px;
  height: 26px;
  border-radius: 50%;
  object-fit: cover;
  border: 1px solid var(--nb-line-hard);
  background: var(--nb-carbon);
}

.nb-rev__thumb + .nb-rev__thumb {
  margin-left: -8px;
}

.nb-rev__thumb--ghost {
  display: grid;
  place-items: center;
  color: var(--nb-ash);
}

.nb-rev__thumb--ghost svg {
  width: 13px;
  height: 13px;
}

.nb-rev__items {
  min-width: 0;
  flex: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* ============================================================== 6. VOUCHES */
/* Third-party feed presented as an instrument port: framed, labelled, and
   honest about being an external source. */

.nb-vouch__head {
  display: grid;
  gap: var(--nb-s4);
  margin-bottom: clamp(2rem, 4vw, 3rem);
}

.nb-vouch__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h1);
  font-weight: 780;
  line-height: 0.96;
  letter-spacing: -0.042em;
  max-width: 18ch;
}

.nb-vouch--center .nb-vouch__head {
  justify-items: center;
  text-align: center;
}

.nb-vouch--center .nb-vouch__title {
  max-width: 24ch;
}

.nb-vouch--right .nb-vouch__head {
  justify-items: end;
  text-align: right;
}

.nb-vouch__frame {
  position: relative;
  padding: clamp(1rem, 3vw, 2rem);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  background: var(--nb-surface-1);
}

.nb-vouch__bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--nb-s4);
  flex-wrap: wrap;
  margin-bottom: var(--nb-s5);
  padding-bottom: var(--nb-s3);
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-vouch__src {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

/* The external widget injects its own markup here; keep it inside the frame
   and never let it push the page sideways. */
.nb-vouch__port {
  min-height: 8rem;
  overflow-x: auto;
  scrollbar-width: thin;
}

.nb-vouch__port > * {
  max-width: 100%;
}

/* ============================================================ 7. PAGINATION */
/* pagination.njk is shared and not rewritten here; these scoped rules only
   pull its typography onto the mono telemetry system where it is used
   inside .nb-pagi. */

.nb-pagi {
  margin-top: clamp(2.5rem, 5vw, 4rem);
  padding-top: var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-pagi nav p,
.nb-pagi nav a,
.nb-pagi nav span {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.nb-pagi nav a,
.nb-pagi nav span {
  border-color: var(--nb-line);
  color: var(--nb-mist);
}

.nb-pagi nav a:hover {
  color: var(--nb-white);
  background: var(--nb-surface-2);
  border-color: var(--nb-line-hard);
}

.nb-pagi nav [aria-current='page'] {
  color: var(--nb-white);
  background: rgba(var(--nb-ember-rgb), 0.16);
  border-color: rgba(var(--nb-ember-rgb), 0.5);
}

/* ---------------------------------------------------------------------------
   LEGAL-FAQ
   --------------------------------------------------------------------------- */
/* ============================================================================
   NEBULA MARKET — LEGAL / FAQ / STATUS COMPOSITIONS
   ----------------------------------------------------------------------------
   Scoped additions for:
     components/faq.njk
     components/terms-page.njk
     components/privacy-policy-page.njk
     components/refund-policy-page.njk
     components/status-page.njk
     snippets/status-card.njk

   Everything here is composed from tokens declared in custom.css. No new
   colours, easings, radii or font stacks are introduced. Loaded after
   nebula-ui.css so the few deliberate overrides below win on source order.
   ========================================================================== */

/* ==========================================================================
   1. FAQ — "support log"
   Asymmetric: a sticky masthead column (rail, title, entry gauge) against a
   wider interrogation list. Not a centred header over a full-width stack.
   ========================================================================== */

.nb-faq-sec {
  position: relative;
  padding-block: var(--nb-section);
}

.nb-faq {
  display: grid;
  grid-template-columns: minmax(0, 0.78fr) minmax(0, 1.32fr);
  gap: clamp(2rem, 6vw, 5.5rem);
  align-items: start;
}

@media (max-width: 899px) {
  .nb-faq {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--nb-s6);
  }
}

.nb-faq__aside {
  display: grid;
  gap: var(--nb-s4);
  justify-items: start;
}

@media (min-width: 900px) {
  .nb-faq__aside {
    position: sticky;
    top: calc(var(--nb-nav-h) + var(--nb-s6));
  }
}

.nb-faq__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h1);
  font-weight: 780;
  line-height: 0.96;
  letter-spacing: -0.042em;
  max-width: 14ch;
}

.nb-faq__lead {
  color: var(--nb-mist);
  max-width: 38ch;
}

/* Entry gauge — the aperture, used as a counter dial. */
.nb-faq__gauge {
  position: relative;
  display: grid;
  place-items: center;
  margin-top: var(--nb-s3);
  width: clamp(104px, 14vw, 144px);
  aspect-ratio: 1;
  border-radius: 50%;
  border: 1px solid var(--nb-line);
  background: radial-gradient(circle at 50% 50%, var(--nb-surface-1), transparent 72%);
}

.nb-faq__gauge::before {
  content: '';
  position: absolute;
  inset: 12%;
  border-radius: 50%;
  border: 1px dashed var(--nb-line-soft);
  pointer-events: none;
}

/* Single ember tick on the rim — the pointer, not a glow border. */
.nb-faq__gauge::after {
  content: '';
  position: absolute;
  top: 50%;
  left: -1px;
  width: 11px;
  height: 1px;
  background: var(--nb-ember);
  box-shadow: 0 0 8px rgba(var(--nb-ember-rgb), 0.8);
  pointer-events: none;
}

.nb-faq__gauge-n {
  font-family: var(--nb-font-mono);
  font-variant-numeric: tabular-nums;
  font-size: clamp(1.5rem, 3.2vw, 2.1rem);
  font-weight: 600;
  letter-spacing: -0.04em;
  line-height: 1;
  color: var(--nb-white);
}

.nb-faq__gauge-k {
  margin-top: 0.4rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

/* ---- List ---- */

.nb-faq__list {
  --faq-gutter: 3rem;
  border-top: 1px solid var(--nb-line-soft);
}

@media (max-width: 519px) {
  .nb-faq__list {
    --faq-gutter: 2rem;
  }
}

/* The question is a heading that *contains* the button; the heading itself
   must not impose its own scale. */
.nb-faq__h {
  margin: 0;
  font-family: inherit;
  font-size: inherit;
  font-weight: inherit;
  letter-spacing: inherit;
  line-height: inherit;
  color: inherit;
}

.nb-faq__list .nb-faq__q {
  display: grid;
  grid-template-columns: var(--faq-gutter) minmax(0, 1fr) auto;
  align-items: start;
  column-gap: var(--nb-s4);
  min-height: 60px;
}

.nb-faq__n {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 500;
  letter-spacing: 0.16em;
  font-variant-numeric: tabular-nums;
  color: var(--nb-dust);
  padding-top: 0.42em;
  transition: color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-faq__item.is-open .nb-faq__n {
  color: var(--nb-ember);
}

.nb-faq__qt {
  display: block;
}

.nb-faq__list .nb-faq__icon {
  margin-top: 0.12em;
}

/* Answer copy hangs under the question text, not under the index. */
.nb-faq__list .nb-faq__a > div {
  padding-left: calc(var(--faq-gutter) + var(--nb-s4));
}

/* Armed by an inline script during parse so closed panels never flash open
   before nebula.js measures them. Without JS the class is never added and
   every answer stays readable. `visibility` also keeps links inside a closed
   answer out of the tab order and the accessibility tree — nebula.js only
   controls max-height/opacity inline, so this is the piece that makes the
   collapsed state genuinely hidden. */
.nb-faq__list.is-armed .nb-faq__item:not(.is-open) .nb-faq__a {
  max-height: 0;
  opacity: 0;
  visibility: hidden;
}

/* ==========================================================================
   2. LEGAL DOCUMENTS — "record sheet"
   Shared body (sticky index + 72ch prose); three distinct mastheads so terms,
   privacy and refunds do not read as the same page three times.
   ========================================================================== */

.nb-doc {
  position: relative;
  padding-block: clamp(1.5rem, 4vw, 3rem) var(--nb-section);
}

.nb-doc__head {
  position: relative;
  margin-bottom: clamp(2.5rem, 6vw, 4.5rem);
  padding-bottom: var(--nb-s5);
  border-bottom: 1px solid var(--nb-line);
}

.nb-doc__eyebrow {
  margin-bottom: var(--nb-s5);
}

.nb-doc__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-display);
  font-weight: 800;
  line-height: 0.9;
  letter-spacing: -0.05em;
  max-width: 15ch;
}

.nb-doc__lead {
  margin-top: var(--nb-s4);
  max-width: 46ch;
  font-size: clamp(1rem, 1.4vw, 1.16rem);
  line-height: 1.55;
  color: var(--nb-mist);
}

.nb-doc__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s2) var(--nb-s5);
  margin-top: var(--nb-s5);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-doc__meta b {
  font-weight: 500;
  color: var(--nb-mist);
}

/* ---- Masthead A: cropped outline numeral (terms) ---- */

.nb-doc__head--numeral {
  overflow: hidden;
  padding-right: clamp(0rem, 14vw, 13rem);
}

.nb-doc__numeral {
  position: absolute;
  right: -0.04em;
  bottom: -0.1em;
  max-height: 0.68em;
  overflow: hidden;
  font-family: var(--nb-font-display);
  font-size: clamp(7rem, 20vw, 17rem);
  font-weight: 800;
  line-height: 0.72;
  letter-spacing: -0.07em;
  color: transparent;
  -webkit-text-stroke: 1px rgba(255, 255, 255, 0.09);
  user-select: none;
  pointer-events: none;
}

@media (max-width: 767px) {
  .nb-doc__head--numeral {
    padding-right: 0;
  }

  .nb-doc__numeral {
    display: none;
  }
}

/* ---- Masthead B: mirrored — telemetry column left, headline right ---- */

.nb-doc__head--mirror {
  display: grid;
  grid-template-columns: minmax(0, 0.62fr) minmax(0, 1.38fr);
  gap: clamp(1.5rem, 5vw, 4rem);
  align-items: end;
}

.nb-doc__head--mirror .nb-doc__eyebrow {
  grid-column: 1 / -1;
  margin-bottom: var(--nb-s4);
}

.nb-doc__head--mirror .nb-doc__side {
  display: grid;
  gap: var(--nb-s4);
  justify-items: start;
  padding-left: var(--nb-s4);
  border-left: 1px solid var(--nb-line-soft);
}

.nb-doc__head--mirror .nb-doc__meta {
  margin-top: 0;
  flex-direction: column;
  gap: var(--nb-s3);
}

.nb-doc__head--mirror .nb-doc__title {
  max-width: 13ch;
}

@media (max-width: 899px) {
  .nb-doc__head--mirror {
    grid-template-columns: minmax(0, 1fr);
    align-items: start;
  }

  .nb-doc__head--mirror .nb-doc__main {
    order: 2;
  }

  .nb-doc__head--mirror .nb-doc__side {
    order: 3;
    padding-left: 0;
    border-left: 0;
  }

  .nb-doc__head--mirror .nb-doc__meta {
    flex-direction: row;
    flex-wrap: wrap;
    gap: var(--nb-s2) var(--nb-s5);
  }
}

/* ---- Masthead C: aperture seal on the baseline (refunds) ---- */

.nb-doc__head--seal {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: clamp(1.25rem, 4vw, 2.75rem);
  align-items: center;
}

.nb-doc__head--seal .nb-doc__eyebrow {
  grid-column: 1 / -1;
}

.nb-doc__head--seal .nb-doc__meta {
  grid-column: 1 / -1;
}

.nb-doc__seal {
  position: relative;
  display: grid;
  place-items: center;
  width: clamp(84px, 12vw, 128px);
  aspect-ratio: 1;
  border-radius: 50%;
  border: 1px solid var(--nb-line-hard);
  background:
    radial-gradient(circle at 36% 32%, rgba(var(--nb-ember-rgb), 0.16), transparent 62%),
    var(--nb-surface-1);
}

.nb-doc__seal::before {
  content: '';
  position: absolute;
  inset: 15%;
  border-radius: 50%;
  border: 1px solid var(--nb-line-soft);
  pointer-events: none;
}

.nb-doc__seal span {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  line-height: 1.5;
  text-transform: uppercase;
  text-align: center;
  color: var(--nb-mist);
}

@media (max-width: 519px) {
  .nb-doc__head--seal {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* ---- Index (table of contents) ---- */

.nb-doc__toc-label {
  display: block;
  padding: 0 0 var(--nb-s3) 0.7rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-doc__toc a {
  display: flex;
  align-items: center;
  min-height: 38px;
  line-height: 1.3;
}

.nb-doc__toc a.is-sub {
  padding-left: 1.55rem;
  color: var(--nb-ash);
}

.nb-doc__toc a.is-sub:hover,
.nb-doc__toc a.is-sub.is-active {
  color: var(--nb-frost);
}

/* The index only exists once it has been derived from the document. Until
   then — no JS, or the builder re-injecting markup without running scripts —
   the record degrades to a clean single column rather than an empty rail.
   Same for a document whose content carries no headings at all. */
.nb-doc:not([data-nb-doc='ready']) .nb-legal,
.nb-doc--no-toc .nb-legal {
  grid-template-columns: minmax(0, 1fr);
}

.nb-doc:not([data-nb-doc='ready']) .nb-legal__index,
.nb-doc--no-toc .nb-legal__index {
  display: none;
}

/* Mobile: the index becomes a horizontal rail so it never eats a screen. */
@media (max-width: 899px) {
  .nb-doc__toc {
    grid-auto-flow: column;
    grid-auto-columns: max-content;
    gap: var(--nb-s2);
    overflow-x: auto;
    scrollbar-width: none;
    -ms-overflow-style: none;
    scroll-snap-type: x proximity;
    padding-bottom: var(--nb-s2);
    margin-bottom: var(--nb-s5);
    border-bottom: 1px solid var(--nb-line-soft);
  }

  .nb-doc__toc::-webkit-scrollbar {
    display: none;
  }

  .nb-doc__toc > * {
    scroll-snap-align: start;
  }

  .nb-doc__toc-label {
    align-self: center;
    padding: 0 var(--nb-s3) 0 0;
  }

  .nb-doc__toc a {
    min-height: 44px;
    padding-inline: var(--nb-s3);
    white-space: nowrap;
    border-left: 0;
    border-bottom: 1px solid var(--nb-line-soft);
  }

  .nb-doc__toc a.is-sub {
    padding-left: var(--nb-s3);
  }

  .nb-doc__toc a:hover,
  .nb-doc__toc a.is-active {
    border-bottom-color: var(--nb-ember);
  }
}

/* ---- Prose: real hierarchy over shop-authored HTML ---- */
/* SellAuth's rich-text editor emits `<h2 class="e-heading-h2">`,
   `<p class="e-paragraph">`, `<ul class="e-list-ul">` … so tag selectors keep
   working; the `e-*` rules below cover what plain tags do not describe. */

.nb-doc__body {
  counter-reset: nbsec;
}

.nb-prose h1 {
  margin: var(--nb-s7) 0 var(--nb-s4);
  font-size: var(--nb-fs-h2);
  scroll-margin-top: calc(var(--nb-nav-h) + 2rem);
}

.nb-prose h1:first-child {
  margin-top: 0;
}

.nb-prose h2 {
  padding-top: var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
  color: var(--nb-white);
}

.nb-prose h2:first-child {
  padding-top: 0;
  border-top: 0;
}

/* Mono section counter — telemetry, not decoration. `.nb-doc__body` is the
   same element as `.nb-prose`; the counter is scoped to it so prose used
   elsewhere is unaffected. */
.nb-doc__body h2::before {
  counter-increment: nbsec;
  content: 'SEC ' counter(nbsec, decimal-leading-zero);
  display: block;
  margin-bottom: var(--nb-s2);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 500;
  letter-spacing: 0.22em;
  color: var(--nb-dust);
}

.nb-prose h3 {
  color: var(--nb-frost);
  scroll-margin-top: calc(var(--nb-nav-h) + 2rem);
}

.nb-prose h4,
.nb-prose h5,
.nb-prose h6 {
  margin: var(--nb-s5) 0 var(--nb-s3);
  font-size: 1rem;
  color: var(--nb-frost);
  scroll-margin-top: calc(var(--nb-nav-h) + 2rem);
}

.nb-prose a {
  word-break: break-word;
}

.nb-prose blockquote,
.nb-prose .e-quote {
  margin: var(--nb-s5) 0;
  padding: var(--nb-s2) 0 var(--nb-s2) var(--nb-s4);
  border-left: 2px solid rgba(var(--nb-ember-rgb), 0.6);
  color: var(--nb-frost);
  font-style: normal;
}

.nb-prose hr,
.nb-prose .e-hr {
  height: 1px;
  margin: var(--nb-s6) 0;
  border: 0;
  background: var(--nb-line);
}

.nb-prose img,
.nb-prose iframe,
.nb-prose video {
  max-width: 100%;
  border-radius: var(--nb-r-md);
}

.nb-prose .e-list-ul {
  list-style: disc;
}

.nb-prose .e-list-ol {
  list-style: decimal;
}

.nb-prose .e-nested-listitem {
  list-style: none;
}

.nb-prose code,
.nb-prose .e-text-code {
  padding: 0.1em 0.4em;
  font-family: var(--nb-font-mono);
  font-size: 0.9em;
  color: var(--nb-frost);
  background: var(--nb-surface-2);
  border-radius: var(--nb-r-xs);
}

.nb-prose pre,
.nb-prose .e-code {
  display: block;
  overflow-x: auto;
  padding: var(--nb-s4);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-sm);
  background: var(--nb-abyss);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-md);
}

.nb-prose table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--nb-fs-sm);
}

.nb-prose th,
.nb-prose td {
  padding: 0.6rem 0.85rem;
  text-align: left;
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-prose th {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
  font-weight: 500;
}

/* Wide content never breaks the page — the doc script wraps tables in this. */
.nb-doc__scroll {
  overflow-x: auto;
  margin-bottom: var(--nb-s4);
}

/* ==========================================================================
   3. STATUS — instrument readout
   A monitoring sheet: hanging mono index, service name, dot-leader, pip.
   No card grid, no equal boxes.
   ========================================================================== */

.nb-status {
  position: relative;
  padding-block: var(--nb-section);
}

.nb-status__head {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
  gap: var(--nb-s5) var(--nb-s7);
  margin-bottom: clamp(2.5rem, 6vw, 4rem);
  padding-bottom: var(--nb-s5);
  border-bottom: 1px solid var(--nb-line);
}

@media (max-width: 767px) {
  .nb-status__head {
    grid-template-columns: minmax(0, 1fr);
    align-items: start;
  }
}

.nb-status__title {
  margin-top: var(--nb-s5);
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-display);
  font-weight: 800;
  line-height: 0.88;
  letter-spacing: -0.05em;
  max-width: 12ch;
}

.nb-status__readout {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s5) clamp(1.2rem, 3vw, 2.4rem);
  text-align: right;
}

@media (max-width: 767px) {
  .nb-status__readout {
    text-align: left;
  }
}

/* The sheet keeps single services and clusters in their authored order. */
.nb-status__sheet {
  counter-reset: nbsvc;
}

.nb-status__sheet > .nb-stat:first-child {
  border-top: 1px solid var(--nb-line-soft);
}

.nb-status__group {
  margin-block: var(--nb-s6);
}

.nb-status__group:first-child {
  margin-top: 0;
}

.nb-status__group-head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--nb-s3) var(--nb-s4);
  margin-bottom: var(--nb-s4);
}

.nb-status__group-title {
  font-size: var(--nb-fs-h3);
  font-weight: 700;
  letter-spacing: -0.025em;
}

.nb-status__group .nb-status__list {
  counter-reset: nbsvc;
  padding-left: var(--nb-s5);
  border-left: 1px solid var(--nb-line-soft);
}

@media (max-width: 599px) {
  .nb-status__group .nb-status__list {
    padding-left: var(--nb-s4);
  }
}

.nb-status__list {
  display: block;
  border-top: 1px solid var(--nb-line-soft);
}

/* ---- Row ---- */

.nb-stat {
  position: relative;
  display: grid;
  grid-template-columns: auto minmax(0, auto) minmax(var(--nb-s5), 1fr) auto;
  align-items: baseline;
  gap: var(--nb-s2) var(--nb-s4);
  min-height: 62px;
  padding: var(--nb-s4) var(--nb-s3);
  border-bottom: 1px solid var(--nb-line-soft);
  transition: background var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-stat::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 2px;
  background: var(--nb-ember);
  transform: scaleY(0);
  transform-origin: 50% 100%;
  transition: transform var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-stat:hover,
.nb-stat:focus-visible {
  background: var(--nb-surface-1);
}

.nb-stat:hover::before,
.nb-stat:focus-visible::before {
  transform: scaleY(1);
}

/* Row number comes from a CSS counter, so it stays gapless no matter which
   entries the template's conditionals skip. */
.nb-stat__idx {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 500;
  letter-spacing: 0.16em;
  font-variant-numeric: tabular-nums;
  color: var(--nb-dust);
}

.nb-stat__idx::before {
  counter-increment: nbsvc;
  content: counter(nbsvc, decimal-leading-zero);
}

.nb-stat__name {
  font-family: var(--nb-font-ui);
  font-size: var(--nb-fs-body);
  font-weight: 600;
  letter-spacing: -0.015em;
  line-height: 1.35;
  color: var(--nb-frost);
  overflow-wrap: break-word;
  transition: color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-stat:hover .nb-stat__name {
  color: var(--nb-white);
}

/* Dot leader — the instrument-panel detail that ties name to reading. */
.nb-stat__leader {
  align-self: center;
  height: 1px;
  background-image: linear-gradient(90deg, var(--nb-ash) 0 2px, transparent 2px 6px);
  background-size: 6px 1px;
  background-repeat: repeat-x;
  opacity: 0.55;
}

/* The shop-configured status colour drives the pip through `currentColor`. */
.nb-stat__state {
  justify-self: end;
  font-size: var(--nb-fs-mono);
  white-space: nowrap;
}

/* Only a shop-configured (i.e. actively reported) status breathes; the
   stock-derived fallback states stay still. `nb-pip--live` brings its own. */
.nb-stat__state.is-reported::before {
  box-shadow: 0 0 8px currentColor;
  animation: nb-pulse 2.4s var(--nb-ease-orbit) infinite;
}

@media (max-width: 599px) {
  .nb-stat {
    grid-template-columns: auto minmax(0, 1fr);
    align-items: start;
  }

  .nb-stat__leader {
    display: none;
  }

  .nb-stat__state {
    grid-column: 2;
    justify-self: start;
  }
}

/* ---------------------------------------------------------------------------
   BLOCKS
   --------------------------------------------------------------------------- */
/* ============================================================================
   NEBULA MARKET — "DEEP FIELD" NARRATIVE BLOCKS
   ----------------------------------------------------------------------------
   Compositions for the homepage narrative surfaces:
   why-choose-us · stats · text / text+image / text+video · galleries ·
   featured product · price comparison.

   Depends on: assets/custom.css (tokens) and assets/nebula-ui.css
   (.nb-bento, .nb-tut, .nb-panel, .nb-pip, .nb-rail, .nb-btn ...).

   No new colours, easings, radii, fonts or font sizes are declared here —
   everything is composed from existing var(--nb-*) tokens.

   REQUIRED WIRING (layouts/master.njk, after nebula-ui.css):
     <link href="{{ '_nb-blocks.css' | assetUrl }}?v={{ assetVersion }}" rel="stylesheet"/>
   ========================================================================== */

/* --------------------------------------------------------- 0. SHARED ATOMS */

/* Rhythm variants so consecutive sections do not all breathe identically. */
.nb-section--tight {
  padding-block: clamp(2.5rem, 6vw, 5rem);
}

.nb-section--lead {
  padding-block: clamp(3.5rem, 8vw, 7rem) clamp(2rem, 4vw, 3.5rem);
}

/* Alignment utilities — these back the theme's title/content alignment
   selects, which used to emit Tailwind classes. */
.nb-al-start {
  text-align: left;
}

.nb-al-mid {
  text-align: center;
}

.nb-al-end {
  text-align: right;
}

.nb-jc-start {
  justify-content: flex-start;
}

.nb-jc-mid {
  justify-content: center;
}

.nb-jc-end {
  justify-content: flex-end;
}

.nb-btnrow {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--nb-s3);
}

/* ---- Header A: staggered 12-column head. Title low-left, gloss high-right. */
.nb-offhead {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: var(--nb-s5);
  align-items: end;
  margin-bottom: clamp(2rem, 5vw, 3.75rem);
}

.nb-offhead__main {
  grid-column: 1 / span 7;
}

.nb-offhead__aside {
  grid-column: 9 / span 4;
  padding-bottom: 0.4rem;
  border-left: 1px solid var(--nb-line-soft);
  padding-left: var(--nb-s4);
}

@media (max-width: 899px) {
  .nb-offhead__main,
  .nb-offhead__aside {
    grid-column: 1 / -1;
  }

  .nb-offhead__aside {
    border-left: 0;
    border-top: 1px solid var(--nb-line-soft);
    padding-left: 0;
    padding-top: var(--nb-s4);
  }
}

/* ---- Header C: mirrored — telemetry column left, headline pushed right. ---
   Namespaced .nb-vidhead, not .nb-revhead: the feedback page already owns
   .nb-revhead with a different child contract, and because this block is
   merged later it silently won and collapsed that masthead into 12 columns. */
.nb-vidhead {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: var(--nb-s5);
  align-items: start;
  margin-bottom: clamp(2rem, 5vw, 3.75rem);
}

.nb-vidhead__meta {
  grid-column: 1 / span 3;
  padding-top: 0.4rem;
}

.nb-vidhead__main {
  grid-column: 5 / span 8;
}

@media (max-width: 899px) {
  .nb-vidhead__meta,
  .nb-vidhead__main {
    grid-column: 1 / -1;
  }
}

/* ---- Header B: one hairline, label left / title right on the same baseline. */
.nb-linehead {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--nb-s4);
  padding-bottom: var(--nb-s4);
  margin-bottom: clamp(1.75rem, 4vw, 3rem);
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-linehead__meta {
  display: flex;
  align-items: center;
  gap: var(--nb-s4);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

/* =========================================================== 1. WHY / BENTO */
/* Uneven tiles: 4+2 / 3+3 / 2+4. Each tile carries its own instrument
   readout instead of an icon in a rounded square. */

.nb-why__eyebrowline {
  display: block;
  margin-top: var(--nb-s4);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

/* Tile head: index + label sit above the copy, hairline separated. */
.nb-tile__head {
  display: flex;
  align-items: baseline;
  gap: var(--nb-s3);
  margin-bottom: auto;
}

.nb-tile__idx {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 600;
  letter-spacing: 0.2em;
  color: var(--nb-ember);
}

.nb-tile__rule {
  flex: 1;
  align-self: center;
  height: 1px;
  background: linear-gradient(90deg, var(--nb-line-hard), transparent);
}

/* ---- Terminal readout (support tile) ---- */
.nb-term {
  margin-bottom: var(--nb-s4);
  padding: var(--nb-s3);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  line-height: 2;
  letter-spacing: 0.06em;
  color: var(--nb-dust);
  background: var(--nb-abyss);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-sm);
  overflow: hidden;
}

.nb-term__bar {
  display: flex;
  align-items: center;
  gap: 5px;
  padding-bottom: var(--nb-s2);
  margin-bottom: var(--nb-s2);
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-term__bar i {
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--nb-ash);
}

.nb-term__bar em {
  margin-left: auto;
  font-style: normal;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-ash);
}

.nb-term__line {
  display: flex;
  align-items: center;
  gap: 0.5em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.nb-term__line b {
  font-weight: 600;
  color: var(--nb-frost);
  font-variant-numeric: tabular-nums;
}

.nb-term__caret {
  display: inline-block;
  width: 6px;
  height: 0.95em;
  vertical-align: -0.12em;
  background: var(--nb-ember);
  flex: none;
}

/* ---- Disc figure (instant delivery tile) ---- */
.nb-figdisc {
  position: relative;
  width: min(100%, 168px);
  aspect-ratio: 1;
  margin: 0 auto var(--nb-s4);
  display: grid;
  place-items: center;
  border-radius: 50%;
  background:
    radial-gradient(circle at 48% 40%, rgba(var(--nb-ember-rgb), 0.16), transparent 58%),
    radial-gradient(circle at 64% 68%, rgba(46, 31, 94, 0.55), transparent 60%),
    var(--nb-abyss);
  border: 1px solid var(--nb-line-soft);
  overflow: hidden;
}

.nb-figdisc img {
  width: 64%;
  height: 64%;
  object-fit: contain;
}

/* ---- Step ladder (instructions tile) ---- */
.nb-steps {
  display: grid;
  gap: 0;
  margin-bottom: var(--nb-s4);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-steps__row {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
  padding: 0.45rem 0;
  border-bottom: 1px solid var(--nb-line-soft);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-steps__pin {
  display: grid;
  place-items: center;
  width: 18px;
  height: 18px;
  flex: none;
  border: 1px solid var(--nb-line);
  border-radius: 50%;
  font-size: 9px;
  line-height: 1;
}

.nb-steps__row.is-done {
  color: var(--nb-mist);
}

.nb-steps__row.is-done .nb-steps__pin {
  color: var(--nb-frost);
  border-color: var(--nb-line-hard);
}

.nb-steps__row.is-active {
  color: var(--nb-frost);
}

.nb-steps__row.is-active .nb-steps__pin {
  color: #fff;
  background: var(--nb-ember);
  border-color: var(--nb-ember);
}

/* ---- Receipt readout (no hidden fees tile) ---- */
.nb-receipt {
  display: grid;
  gap: 0;
  margin-bottom: var(--nb-s4);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.08em;
}

.nb-receipt__row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--nb-s3);
  padding: 0.4rem 0;
  border-bottom: 1px dashed var(--nb-line-soft);
  color: var(--nb-dust);
}

.nb-receipt__row b {
  font-weight: 600;
  color: var(--nb-frost);
  font-variant-numeric: tabular-nums;
}

.nb-receipt__row--total {
  border-bottom: 0;
  border-top: 1px solid var(--nb-line-hard);
  margin-top: 0.25rem;
  padding-top: 0.55rem;
  color: var(--nb-frost);
}

.nb-receipt__row--total b {
  color: var(--nb-white);
}

.nb-receipt__zero {
  color: var(--nb-ember-hot);
}

/* ---- Static demand bars (restocks tile). Deliberately not animated. ---- */
.nb-bars {
  display: flex;
  align-items: flex-end;
  gap: 5px;
  height: 56px;
  margin-bottom: var(--nb-s4);
}

.nb-bars span {
  flex: 1;
  border-radius: 2px 2px 0 0;
  background: linear-gradient(180deg, var(--nb-mineral), var(--nb-slate));
}

.nb-bars span:last-child {
  background: linear-gradient(180deg, var(--nb-ember), var(--nb-ember-deep));
}

/* ---- Payment orbit: chips seated on two static apertures ---- */
.nb-payorb {
  position: relative;
  width: min(100%, 250px);
  aspect-ratio: 1;
  margin-inline: auto;
  display: grid;
  place-items: center;
  flex: none;
}

.nb-payorb__core {
  display: grid;
  place-items: center;
  width: 30%;
  aspect-ratio: 1;
  border-radius: 50%;
  color: var(--nb-frost);
  background:
    radial-gradient(circle at 36% 32%, rgba(var(--nb-ember-rgb), 0.3), transparent 62%),
    var(--nb-carbon);
  border: 1px solid var(--nb-line-hard);
}

.nb-payorb__core svg {
  width: 44%;
  height: auto;
}

.nb-payorb__ring {
  position: absolute;
  inset: 0;
  border-radius: 50%;
  border: 1px solid var(--nb-line-soft);
  pointer-events: none;
}

.nb-payorb__ring--inner {
  inset: 25%;
  border-style: dashed;
}

.nb-payorb__slot {
  position: absolute;
  inset: 0;
  transform: rotate(calc(var(--i) * var(--orb-step, 60deg)));
}

.nb-payorb__chip {
  position: absolute;
  top: -15px;
  left: 50%;
  width: 30px;
  height: 30px;
  margin-left: -15px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--nb-abyss);
  border: 1px solid var(--nb-line);
  transform: rotate(calc(var(--i) * var(--orb-step, 60deg) * -1));
}

.nb-payorb__chip img {
  width: 16px;
  height: 16px;
  object-fit: contain;
  opacity: 0.72;
}

/* Payments tile lays the copy and the orbit side by side on wide screens. */
.nb-paylay {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(1.25rem, 4vw, 3rem);
}

.nb-paylay__copy {
  flex: 1 1 260px;
  min-width: 0;
}

.nb-paychips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s2);
  margin-top: var(--nb-s4);
}

.nb-paychips span {
  display: inline-flex;
  align-items: center;
  gap: 0.4em;
  padding: 0.32rem 0.7rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--nb-mist);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-pill);
}

.nb-paychips img {
  width: 15px;
  height: 15px;
  object-fit: contain;
}

@media (max-width: 519px) {
  .nb-payorb {
    width: min(100%, 210px);
  }

  .nb-payorb__chip {
    width: 26px;
    height: 26px;
    top: -13px;
    margin-left: -13px;
  }
}

/* ============================================================ 2. TELEMETRY */
/* stats — mono tabular readouts hung off a coordinate rail. No count-up. */

.nb-tele {
  display: grid;
  grid-template-columns: minmax(0, 0.66fr) minmax(0, 1fr);
  gap: clamp(1.75rem, 5vw, 4.5rem);
  align-items: start;
}

@media (max-width: 899px) {
  .nb-tele {
    grid-template-columns: minmax(0, 1fr);
  }
}

.nb-tele__aside {
  position: sticky;
  top: calc(var(--nb-nav-h) + var(--nb-s6));
}

@media (max-width: 899px) {
  .nb-tele__aside {
    position: static;
  }
}

.nb-tele__list {
  display: grid;
  border-top: 1px solid var(--nb-line);
}

.nb-tele__row {
  display: grid;
  grid-template-columns: 3ch 44px minmax(0, 1fr) auto;
  gap: var(--nb-s4);
  align-items: start;
  padding: clamp(1.1rem, 2.4vw, 1.7rem) 0;
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-tele__idx {
  padding-top: 0.75rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  color: var(--nb-ash);
}

.nb-tele__eye {
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  color: var(--nb-mist);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line);
  transition:
    color var(--nb-t-fast) var(--nb-ease-orbit),
    border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-tele__eye svg {
  width: 20px;
  height: 20px;
}

.nb-tele__eye i {
  font-size: 16px;
}

.nb-tele__row:hover .nb-tele__eye {
  color: var(--nb-frost);
  border-color: rgba(var(--nb-ember-rgb), 0.5);
}

.nb-tele__val {
  font-family: var(--nb-font-mono);
  font-size: clamp(1.15rem, 2.5vw, 1.9rem);
  font-weight: 600;
  line-height: 1.06;
  letter-spacing: -0.035em;
  color: var(--nb-white);
  font-variant-numeric: tabular-nums;
}

.nb-tele__desc {
  margin-top: 0.4rem;
  font-size: var(--nb-fs-sm);
  line-height: 1.6;
  color: var(--nb-mist);
  max-width: 48ch;
}

.nb-tele__coord {
  padding-top: 0.75rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.14em;
  color: var(--nb-ash);
  white-space: nowrap;
}

@media (max-width: 767px) {
  .nb-tele__row {
    grid-template-columns: 3ch minmax(0, 1fr);
    gap: var(--nb-s3);
  }

  .nb-tele__eye,
  .nb-tele__coord {
    display: none;
  }
}

/* ========================================================== 3. TEXT BLOCK */
/* Head hangs in the left margin; the measure sits off-axis to its right. */

.nb-txt {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: var(--nb-s5) var(--nb-s6);
  align-items: start;
}

.nb-txt__head {
  grid-column: 1 / span 4;
}

.nb-txt__body {
  grid-column: 6 / span 7;
}

.nb-txt--end .nb-txt__head {
  grid-column: 9 / span 4;
  order: 2;
}

.nb-txt--end .nb-txt__body {
  grid-column: 1 / span 7;
  order: 1;
}

.nb-txt--mid .nb-txt__head {
  grid-column: 1 / -1;
  max-width: 46ch;
  margin-inline: auto;
}

.nb-txt--mid .nb-txt__body {
  grid-column: 2 / span 10;
}

@media (min-width: 900px) {
  .nb-txt__head {
    position: sticky;
    top: calc(var(--nb-nav-h) + var(--nb-s6));
  }

  .nb-txt--mid .nb-txt__head {
    position: static;
  }
}

@media (max-width: 899px) {
  .nb-txt__head,
  .nb-txt__body,
  .nb-txt--end .nb-txt__head,
  .nb-txt--end .nb-txt__body,
  .nb-txt--mid .nb-txt__body {
    grid-column: 1 / -1;
    order: initial;
  }
}

.nb-txt__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h1);
  font-weight: 780;
  line-height: 0.98;
  letter-spacing: -0.042em;
  margin-top: var(--nb-s4);
}

/* Optional panel treatment behind the measure. */
.nb-txt__pad {
  padding: clamp(1.25rem, 3vw, 2.5rem);
}

/* =================================================== 4. ASYMMETRIC SPLIT */
/* text-image-block / text-video-block. Copy and media never share a
   centre line; the media carries the aperture. */

.nb-split {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: clamp(1.75rem, 4vw, 3.5rem);
  align-items: center;
}

.nb-split__copy {
  grid-column: 1 / span 5;
}

.nb-split__media {
  grid-column: 7 / span 6;
}

.nb-split--rev .nb-split__copy {
  grid-column: 8 / span 5;
  order: 2;
}

.nb-split--rev .nb-split__media {
  grid-column: 1 / span 6;
  order: 1;
}

.nb-split--stack .nb-split__copy {
  grid-column: 3 / span 8;
}

.nb-split--stack .nb-split__media {
  grid-column: 2 / span 10;
}

/* Nudge the copy off the media's optical centre. */
@media (min-width: 900px) {
  .nb-split__copy {
    padding-block: var(--nb-s6);
  }

  .nb-split--rev .nb-split__copy {
    padding-block: var(--nb-s6);
  }
}

@media (max-width: 899px) {
  .nb-split__copy,
  .nb-split__media,
  .nb-split--rev .nb-split__copy,
  .nb-split--rev .nb-split__media,
  .nb-split--stack .nb-split__copy,
  .nb-split--stack .nb-split__media {
    grid-column: 1 / -1;
    order: initial;
  }
}

.nb-split__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h2);
  font-weight: 780;
  line-height: 0.98;
  letter-spacing: -0.04em;
  margin-block: var(--nb-s4) var(--nb-s4);
}

/* ---- Figure: the aperture frame ---- */
.nb-figwrap {
  position: relative;
  width: 100%;
  max-width: 560px;
  margin-inline: auto;
}

.nb-figwrap__halo {
  position: absolute;
  inset: -5.5%;
  border-radius: 50%;
  border: 1px dashed var(--nb-line-soft);
  pointer-events: none;
}

.nb-figwrap__coord {
  position: absolute;
  z-index: 2;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  color: var(--nb-dust);
  white-space: nowrap;
}

.nb-figwrap__coord--tl {
  top: -1.5rem;
  left: 0;
}

.nb-figwrap__coord--br {
  bottom: -1.5rem;
  right: 0;
}

@media (max-width: 767px) {
  .nb-figwrap__coord {
    display: none;
  }
}

.nb-fig {
  position: relative;
  width: 100%;
  display: grid;
  place-items: center;
  overflow: hidden;
  background:
    radial-gradient(circle at 50% 38%, rgba(255, 255, 255, 0.06), transparent 60%),
    linear-gradient(180deg, var(--nb-carbon), var(--nb-abyss));
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
}

.nb-fig--aperture {
  aspect-ratio: 1;
  border-radius: 50%;
}

.nb-fig--1x1 {
  aspect-ratio: 1;
}

.nb-fig--4x3 {
  aspect-ratio: 4 / 3;
}

.nb-fig--16x9 {
  aspect-ratio: 16 / 9;
}

.nb-fig img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  cursor: zoom-in;
}

.nb-fig--aperture img {
  width: 72%;
  height: 72%;
}

.nb-fig__ring {
  position: absolute;
  inset: 9%;
  border-radius: 50%;
  border: 1px solid var(--nb-line-soft);
  pointer-events: none;
}

.nb-fig--aperture .nb-fig__ring {
  inset: 6%;
}

/* ============================================================ 5. TUTORIALS */
/* video-gallery + text-video-block. Built on .nb-tut / .nb-tut__frame /
   .nb-tut__num from nebula-ui.css. */

.nb-tuts {
  display: grid;
  gap: var(--nb-s5);
  grid-auto-flow: dense;
}

.nb-tuts--1 {
  grid-template-columns: minmax(0, 1fr);
  max-width: 900px;
}

.nb-tuts--2 {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.nb-tuts--3 {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

.nb-tuts--4 {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

/* The opening tutorial is deliberately larger — the grid is not uniform. */
.nb-tuts__lead {
  grid-column: span 2;
}

@media (max-width: 1023px) {
  .nb-tuts--4 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 899px) {
  .nb-tuts--3 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 599px) {
  .nb-tuts,
  .nb-tuts--2,
  .nb-tuts--3,
  .nb-tuts--4 {
    grid-template-columns: minmax(0, 1fr);
  }

  .nb-tuts__lead {
    grid-column: span 1;
  }
}

.nb-tut__head {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
}

.nb-tut__label {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-tut__rule {
  flex: 1;
  height: 1px;
  background: linear-gradient(90deg, var(--nb-line-hard), transparent);
}

.nb-tut__frame--9x16 {
  aspect-ratio: 9 / 16;
  max-width: 320px;
  margin-inline: auto;
  width: 100%;
}

/* lite-yt-embed.css loads after nebula-ui.css and caps the player at 720px. */
.nb-tut__frame lite-youtube {
  max-width: none;
}

/* ---- text-video-block: narrow briefing column + dominant video panel ---- */
.nb-brief {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: clamp(1.75rem, 4vw, 3.5rem);
  align-items: start;
}

.nb-brief__copy {
  grid-column: 1 / span 4;
}

.nb-brief__media {
  grid-column: 6 / span 7;
}

.nb-brief--rev .nb-brief__copy {
  grid-column: 9 / span 4;
  order: 2;
}

.nb-brief--rev .nb-brief__media {
  grid-column: 1 / span 7;
  order: 1;
}

.nb-brief--stack .nb-brief__copy {
  grid-column: 1 / -1;
  max-width: 62ch;
}

.nb-brief--stack .nb-brief__media {
  grid-column: 1 / -1;
}

@media (min-width: 900px) {
  .nb-brief__copy {
    padding-top: var(--nb-s6);
  }
}

.nb-brief__media--mid {
  max-width: 900px;
  margin-inline: auto;
}

@media (max-width: 899px) {
  .nb-brief__copy,
  .nb-brief__media,
  .nb-brief--rev .nb-brief__copy,
  .nb-brief--rev .nb-brief__media {
    grid-column: 1 / -1;
    order: initial;
  }
}

/* Video panel used by text-video-block: bigger, with its own coordinate. */
.nb-vidframe {
  position: relative;
}

.nb-vidframe__coord {
  position: absolute;
  right: 0;
  bottom: -1.5rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  color: var(--nb-dust);
  white-space: nowrap;
}

@media (max-width: 767px) {
  .nb-vidframe__coord {
    display: none;
  }
}

/* ========================================================= 6. IMAGE PLATES */
/* `.nb-plates` is also the product page's secondary-image grid (section 6 of
   the PDP block), which sets its own 6-column track. Only the gallery's
   modifier variants opt into dense packing — applying it to the bare class
   leaked into the PDP and could reorder its images. */

.nb-plates {
  display: grid;
  gap: var(--nb-s4);
}

.nb-plates--1,
.nb-plates--2,
.nb-plates--3,
.nb-plates--4 {
  grid-auto-flow: dense;
}

.nb-plates--1 {
  grid-template-columns: minmax(0, 1fr);
}

.nb-plates--2 {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.nb-plates--3 {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

.nb-plates--4 {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

.nb-plates__lead {
  grid-column: span 2;
}

@media (max-width: 1023px) {
  .nb-plates--4 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 767px) {
  .nb-plates--3 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 519px) {
  .nb-plates,
  .nb-plates--2,
  .nb-plates--3,
  .nb-plates--4 {
    grid-template-columns: minmax(0, 1fr);
  }

  .nb-plates__lead {
    grid-column: span 1;
  }
}

.nb-plate {
  position: relative;
  margin: 0;
  display: grid;
  place-items: center;
  overflow: hidden;
  padding: var(--nb-s3);
  background:
    radial-gradient(circle at 50% 40%, rgba(255, 255, 255, 0.05), transparent 62%),
    var(--nb-abyss);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  transition: border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-plate:hover {
  border-color: var(--nb-line-hard);
}

.nb-plate::after {
  content: '';
  position: absolute;
  inset: 11%;
  border-radius: 50%;
  border: 1px solid var(--nb-line-soft);
  pointer-events: none;
  transition:
    inset var(--nb-t-base) var(--nb-ease-orbit),
    border-color var(--nb-t-base) var(--nb-ease-orbit);
}

.nb-plate:hover::after {
  inset: 6%;
  border-color: rgba(var(--nb-ember-rgb), 0.35);
}

.nb-plate--1x1 {
  aspect-ratio: 1;
}

.nb-plate--4x3 {
  aspect-ratio: 4 / 3;
}

.nb-plate--16x9 {
  aspect-ratio: 16 / 9;
}

.nb-plate img {
  position: relative;
  z-index: 1;
  width: 100%;
  height: 100%;
  object-fit: contain;
  cursor: zoom-in;
}

/* "Default" aspect: the plate is sized by the picture, not the other way. */
.nb-plate--auto img {
  height: auto;
}

.nb-plate__idx {
  position: absolute;
  top: 0.55rem;
  left: 0.75rem;
  z-index: 2;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  color: var(--nb-dust);
}

/* ===================================================== 7. FEATURED PRODUCT */
/* An instrument panel: aperture stage left, spec/price column right. */

.nb-feat {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
  gap: clamp(1.75rem, 4vw, 3.5rem);
  align-items: center;
  padding: clamp(1.25rem, 3vw, 2.75rem);
  background: linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-lg);
  overflow: hidden;
  isolation: isolate;
}

.nb-feat + .nb-feat {
  margin-top: var(--nb-s5);
}

@media (max-width: 899px) {
  .nb-feat {
    grid-template-columns: minmax(0, 1fr);
  }
}

.nb-feat__stagewrap {
  position: relative;
  width: min(100%, 400px);
  margin-inline: auto;
}

.nb-feat__stage {
  position: relative;
  aspect-ratio: 1;
  display: grid;
  place-items: center;
  border-radius: 50%;
  overflow: hidden;
  background:
    radial-gradient(circle at 44% 36%, rgba(var(--nb-ember-rgb), 0.2), transparent 54%),
    radial-gradient(circle at 66% 70%, rgba(46, 31, 94, 0.6), transparent 58%),
    var(--nb-abyss);
  border: 1px solid var(--nb-line);
}

.nb-feat__stage img {
  width: 66%;
  height: 66%;
  object-fit: contain;
}

.nb-feat__stage .nb-feat__placeholder {
  width: 40%;
  color: var(--nb-ash);
}

.nb-feat__ring {
  position: absolute;
  inset: -5%;
  border-radius: 50%;
  border: 1px dashed var(--nb-line-soft);
  pointer-events: none;
}

.nb-feat__flag {
  position: absolute;
  left: 50%;
  bottom: -0.6rem;
  transform: translateX(-50%);
  z-index: 2;
  padding: 0.28rem 0.75rem;
  background: var(--nb-carbon);
  border: 1px solid var(--nb-line-hard);
  border-radius: var(--nb-r-pill);
  white-space: nowrap;
}

.nb-feat__kicker {
  display: block;
  margin-bottom: var(--nb-s3);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-feat__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h2);
  font-weight: 780;
  line-height: 0.98;
  letter-spacing: -0.04em;
}

.nb-feat__desc {
  margin-top: var(--nb-s4);
  color: var(--nb-mist);
  font-size: var(--nb-fs-sm);
  line-height: 1.65;
  max-width: 56ch;
}

.nb-feat__perks {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: var(--nb-s5);
  margin-block: var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-feat__perks li {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  padding: 0.65rem 0;
  border-bottom: 1px solid var(--nb-line-soft);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--nb-mist);
}

.nb-feat__perks li svg {
  width: 14px;
  height: 14px;
  flex: none;
  color: var(--nb-ember);
}

@media (max-width: 519px) {
  .nb-feat__perks {
    grid-template-columns: minmax(0, 1fr);
  }
}

.nb-feat__bottom {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--nb-s4);
  padding-top: var(--nb-s5);
  border-top: 1px solid var(--nb-line);
}

.nb-feat__price small {
  display: block;
  margin-bottom: 2px;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-feat__price strong {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: clamp(1.5rem, 3.2vw, 2.3rem);
  font-weight: 600;
  letter-spacing: -0.045em;
  color: var(--nb-white);
  font-variant-numeric: tabular-nums;
  line-height: 1;
}

/* ==================================================== 8. PRICE COMPARISON */
/* Retail vs Nebula, read as an instrument panel. All JS hooks are data-
   attributes so the carousel script keeps working untouched. */

/* Header: headline first at display scale, telemetry hung UNDER it on a
   hairline — the inverse of every other head in the theme. */
.nb-cmphead {
  margin-bottom: clamp(1.75rem, 4vw, 3rem);
}

.nb-cmphead__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-display);
  font-weight: 800;
  line-height: 0.9;
  letter-spacing: -0.05em;
  max-width: 15ch;
}

.nb-cmphead__foot {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--nb-s4);
  margin-top: var(--nb-s5);
  padding-top: var(--nb-s4);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-cmphead__foot p {
  color: var(--nb-mist);
  font-size: var(--nb-fs-sm);
  max-width: 46ch;
  text-align: right;
}

@media (max-width: 767px) {
  .nb-cmphead__foot p {
    text-align: left;
  }
}

.nb-cmp__stars {
  color: var(--nb-ember);
  letter-spacing: 0.08em;
}

.nb-cmp {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.95fr);
  gap: clamp(1.75rem, 4vw, 3.5rem);
  align-items: center;
  padding: clamp(1.25rem, 3.4vw, 3rem);
  background: linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-lg);
  overflow: hidden;
  isolation: isolate;
}

@media (max-width: 899px) {
  .nb-cmp {
    grid-template-columns: minmax(0, 1fr);
  }
}

.nb-cmp__bg {
  position: absolute;
  inset: 0;
  z-index: -1;
  overflow: hidden;
  pointer-events: none;
}

.nb-cmp__bg-grid {
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(to right, rgba(255, 255, 255, 0.03) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(255, 255, 255, 0.03) 1px, transparent 1px);
  background-size: 62px 62px;
  mask-image: radial-gradient(85% 75% at 26% 0%, #000 8%, transparent 76%);
  -webkit-mask-image: radial-gradient(85% 75% at 26% 0%, #000 8%, transparent 76%);
}

.nb-cmp__bg-halo {
  position: absolute;
  top: -30%;
  right: -12%;
  width: 62%;
  aspect-ratio: 1;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(var(--nb-ember-rgb), 0.13), transparent 66%);
}

.nb-cmp__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h1);
  font-weight: 800;
  line-height: 0.92;
  letter-spacing: -0.045em;
  margin-block: var(--nb-s4) var(--nb-s4);
}

.nb-cmp__title em {
  display: block;
  font-style: normal;
  padding-left: clamp(0px, 4vw, 3rem);
}

.nb-cmp__sub {
  color: var(--nb-mist);
  font-size: var(--nb-fs-sm);
  line-height: 1.65;
  max-width: 46ch;
}

.nb-cmp__trust {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s2) var(--nb-s5);
  margin-block: var(--nb-s5);
  padding-top: var(--nb-s4);
  border-top: 1px solid var(--nb-line-soft);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-cmp__trust > span {
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
}

.nb-cmp__trust b {
  font-weight: 600;
  color: var(--nb-frost);
  font-variant-numeric: tabular-nums;
}

/* ---- Right: the specimen under observation ---- */
.nb-cmp__stagewrap {
  position: relative;
  width: min(100%, 186px);
  margin: 0 auto var(--nb-s6);
}

.nb-cmp__stage {
  position: relative;
  width: 100%;
  aspect-ratio: 1;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--nb-abyss);
  border: 1px solid var(--nb-line);
  overflow: hidden;
}

.nb-cmp__stage::before {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: radial-gradient(circle at 50% 46%, color-mix(in srgb, var(--acc, #ffffff) 20%, transparent), transparent 68%);
  pointer-events: none;
}

.nb-cmp__stage img {
  position: relative;
  z-index: 1;
  width: 54%;
  height: 54%;
  object-fit: contain;
}

.nb-cmp__halo {
  position: absolute;
  inset: -8%;
  border-radius: 50%;
  border: 1px dashed var(--nb-line-soft);
  pointer-events: none;
}

.nb-cmp__tag {
  position: absolute;
  left: 50%;
  bottom: -0.85rem;
  transform: translateX(-50%);
  z-index: 2;
  padding: 0.26rem 0.8rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-frost);
  background: var(--nb-carbon);
  border: 1px solid var(--nb-line-hard);
  border-radius: var(--nb-r-pill);
  white-space: nowrap;
}

.nb-cmp__read {
  position: relative;
  display: grid;
}

.nb-cmp__row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--nb-s4);
  padding: var(--nb-s4) 0;
  border-top: 1px solid var(--nb-line-soft);
}

.nb-cmp__row:last-child {
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-cmp__k {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.55rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-cmp__v {
  font-family: var(--nb-font-mono);
  font-weight: 600;
  letter-spacing: -0.03em;
  font-variant-numeric: tabular-nums;
  text-align: right;
}

.nb-cmp__v--their {
  font-size: clamp(1rem, 1.8vw, 1.3rem);
  color: var(--nb-dust);
  text-decoration: line-through;
  text-decoration-thickness: 1px;
  text-decoration-color: rgba(var(--nb-ember-rgb), 0.85);
}

.nb-cmp__v--our {
  font-size: clamp(1.45rem, 3.2vw, 2.2rem);
  color: var(--nb-white);
  line-height: 1;
}

.nb-cmp__note {
  display: block;
  margin-top: 3px;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-style: normal;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-cmp__save {
  display: inline-block;
  padding: 0.2rem 0.6rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 600;
  letter-spacing: 0.12em;
  color: #fff;
  background: linear-gradient(180deg, var(--nb-ember-hot), var(--nb-ember-deep));
  border-radius: var(--nb-r-xs);
}

/* One-shot wipe when the script repaints the saving. No scale entrance. */
.nb-cmp__save.is-pop {
  animation: nb-cmp-wipe 480ms var(--nb-ease-enter) both;
}

@keyframes nb-cmp-wipe {
  from {
    opacity: 0;
    clip-path: inset(0 100% 0 0);
  }
  to {
    opacity: 1;
    clip-path: inset(0 0 0 0);
  }
}

/* The script adds .is-swapping ~440ms before repainting the slide. */
.nb-cmp__swap {
  transition:
    opacity var(--nb-t-fast) var(--nb-ease-orbit),
    transform var(--nb-t-fast) var(--nb-ease-orbit);
}

[data-cmp].is-swapping .nb-cmp__swap {
  opacity: 0;
  transform: translate3d(0, 10px, 0);
}

/* ---- Footer bar: dots are real buttons rendered by the script ---- */
.nb-cmp__bar {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--nb-s3);
  margin-top: var(--nb-s5);
  padding-top: var(--nb-s4);
  border-top: 1px solid var(--nb-line-soft);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-cmp__dots {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 0;
}

.nb-cmp__dots button {
  display: grid;
  place-items: center;
  width: 26px;
  height: 44px;
  padding: 0;
  background: none;
  border: 0;
  border-radius: var(--nb-r-sm);
  cursor: pointer;
}

.nb-cmp__dots button::before {
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--nb-ash);
  transition:
    background var(--nb-t-micro) var(--nb-ease-orbit),
    box-shadow var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-cmp__dots button:hover::before {
  background: var(--nb-mist);
}

.nb-cmp__dots button.is-active::before {
  background: var(--nb-ember);
  box-shadow: 0 0 10px 1px rgba(var(--nb-ember-rgb), 0.75);
}

@media (max-width: 599px) {
  .nb-cmp__bar {
    justify-content: center;
    text-align: center;
  }
}

/* ---------------------------------------------------------------------------
   CUSTOMER
   --------------------------------------------------------------------------- */
/* ============================================================================
   NEBULA MARKET — CUSTOMER AREA / "THE CONTROL ROOM"
   ----------------------------------------------------------------------------
   Owned by the customer-area templates only:
     templates/customer-{dashboard,invoices,tickets,ticket,balance,affiliate}
     snippets/{customer-sidebar,ticket-create-modal}

   Concept: the logged-in area is the instrument's control room. A persistent
   console rail (aperture avatar + mono nav) sits beside readouts. All numeric
   and metadata content is mono/tabular. Status is a pip, never a coloured pill.
   Tables become card-per-row below 767px so nothing overflows horizontally.

   Built exclusively from the tokens in custom.css. No new colours, easings,
   radii or fonts.
   ========================================================================== */

/* ============================================================ 1. THE CONSOLE */

.nb-console {
  position: relative;
  padding-block: clamp(2.25rem, 5vw, 4rem) var(--nb-section);
}

.nb-console__inner {
  width: 100%;
  max-width: var(--nb-max);
  margin-inline: auto;
  padding-inline: var(--nb-gutter);
}

/* Asymmetric body: the rail is deliberately narrow and the readout column
   takes the rest. The masthead above spans both. */
.nb-console__grid {
  display: grid;
  grid-template-columns: minmax(0, 272px) minmax(0, 1fr);
  gap: clamp(1.25rem, 2.6vw, 2.5rem);
  align-items: start;
}

@media (max-width: 1023px) {
  .nb-console__grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

.nb-console__aside {
  position: sticky;
  top: calc(var(--nb-nav-h) + var(--nb-s4));
  align-self: start;
  min-width: 0;
}

@media (max-width: 1023px) {
  .nb-console__aside {
    position: static;
  }
}

.nb-console__main {
  display: grid;
  gap: var(--nb-s5);
  min-width: 0;
}

/* ---- Masthead. Off-axis by default; modifiers change the rhythm per page. -- */

.nb-chead {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
  gap: var(--nb-s4) var(--nb-s6);
  margin-bottom: clamp(1.5rem, 3.5vw, 2.75rem);
  padding-bottom: var(--nb-s5);
  border-bottom: 1px solid var(--nb-line-soft);
}

@media (max-width: 767px) {
  .nb-chead {
    grid-template-columns: minmax(0, 1fr);
    align-items: start;
  }
}

/* Quiet variant: no right column, tighter rule — used where the page body
   itself is the statement (balance vault, transcript). */
.nb-chead--quiet {
  grid-template-columns: minmax(0, 1fr);
  border-bottom: 0;
  padding-bottom: 0;
  margin-bottom: clamp(1.25rem, 3vw, 2rem);
}

.nb-chead__title {
  margin-top: var(--nb-s4);
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h1);
  font-weight: 780;
  line-height: 0.95;
  letter-spacing: -0.042em;
  color: var(--nb-white);
}

/* Subject headlines (a ticket) run long — let them wrap without ballooning. */
.nb-chead__title--long {
  font-size: clamp(1.5rem, 3.2vw, 2.4rem);
  max-width: 24ch;
}

.nb-chead__sub {
  margin-top: var(--nb-s3);
  max-width: 52ch;
  font-size: var(--nb-fs-sm);
  color: var(--nb-mist);
}

.nb-chead__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s3) clamp(1.2rem, 3vw, 2.4rem);
  padding-left: var(--nb-s5);
  border-left: 1px solid var(--nb-line-soft);
}

@media (max-width: 767px) {
  .nb-chead__meta {
    padding-left: 0;
    padding-top: var(--nb-s4);
    border-left: 0;
    border-top: 1px solid var(--nb-line-soft);
    width: 100%;
  }
}

.nb-chead__k {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-chead__v {
  display: block;
  margin-top: 4px;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-sm);
  font-weight: 600;
  letter-spacing: -0.01em;
  color: var(--nb-frost);
  font-variant-numeric: tabular-nums;
  overflow-wrap: anywhere;
}

/* Oversized outlined counter — the masthead's right-hand statement. */
.nb-chead__big {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: clamp(2.6rem, 7vw, 4.8rem);
  font-weight: 600;
  line-height: 0.82;
  letter-spacing: -0.06em;
  color: transparent;
  -webkit-text-stroke: 1px var(--nb-ash);
  font-variant-numeric: tabular-nums;
}

.nb-chead__bigk {
  display: block;
  margin-top: var(--nb-s2);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
  text-align: right;
}

@media (max-width: 767px) {
  .nb-chead__bigk {
    text-align: left;
  }
}

/* ======================================================= 2. THE CONSOLE RAIL */
/* Persistent navigation. Aperture avatar, mono labels, ember pip for the
   active station. Below 1024 it collapses into a horizontal scrolling rail
   instead of a stacked column of full-width blocks. */

.nb-cnav {
  position: relative;
  display: grid;
  gap: var(--nb-s4);
  padding: var(--nb-s5);
  background: linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-lg);
}

.nb-cnav__id {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
  padding-bottom: var(--nb-s4);
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-cnav__eye {
  position: relative;
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  flex: none;
  border-radius: 50%;
  font-family: var(--nb-font-mono);
  font-size: 0.95rem;
  font-weight: 600;
  text-transform: uppercase;
  color: var(--nb-white);
  background:
    radial-gradient(circle at 34% 30%, rgba(var(--nb-ember-rgb), 0.55), transparent 56%),
    radial-gradient(circle at 70% 74%, var(--nb-violet), transparent 62%),
    var(--nb-abyss);
  border: 1px solid var(--nb-line-hard);
}

.nb-cnav__eye::after {
  content: '';
  position: absolute;
  inset: -6px;
  border-radius: 50%;
  border: 1px dashed var(--nb-line);
  pointer-events: none;
}

.nb-cnav__who {
  min-width: 0;
}

.nb-cnav__k {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-cnav__mail {
  display: block;
  margin-top: 3px;
  font-size: 0.84rem;
  font-weight: 550;
  line-height: 1.35;
  color: var(--nb-frost);
  overflow-wrap: anywhere;
}

.nb-cnav__list {
  display: grid;
  gap: 2px;
}

.nb-cnav__item {
  display: flex;
  align-items: center;
  gap: var(--nb-s3);
  width: 100%;
  min-height: 44px;
  padding: 0.55rem 0.7rem;
  font-size: var(--nb-fs-sm);
  font-weight: 550;
  text-align: left;
  color: var(--nb-mist);
  border-left: 1px solid var(--nb-line-soft);
  border-radius: 0 var(--nb-r-sm) var(--nb-r-sm) 0;
  transition:
    color var(--nb-t-micro) var(--nb-ease-orbit),
    background var(--nb-t-micro) var(--nb-ease-orbit),
    border-color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-cnav__item:hover {
  color: var(--nb-white);
  background: var(--nb-surface-1);
  border-left-color: var(--nb-line-hard);
}

.nb-cnav__item.is-on {
  color: var(--nb-white);
  background: var(--nb-surface-2);
  border-left-color: var(--nb-ember);
}

.nb-cnav__idx {
  flex: none;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  color: var(--nb-dust);
}

.nb-cnav__item.is-on .nb-cnav__idx {
  color: var(--nb-ember);
}

.nb-cnav__ico {
  width: 17px;
  height: 17px;
  flex: none;
  opacity: 0.7;
}

.nb-cnav__item:hover .nb-cnav__ico,
.nb-cnav__item.is-on .nb-cnav__ico {
  opacity: 1;
}

.nb-cnav__label {
  flex: 1;
  min-width: 0;
}

.nb-cnav__val {
  flex: none;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-xs);
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.01em;
  color: var(--nb-frost);
}

.nb-cnav__out {
  padding-top: var(--nb-s4);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-cnav__out .nb-cnav__item {
  border-left-color: transparent;
}

/* ---- Mobile: the column becomes a snapping rail. ---- */
@media (max-width: 1023px) {
  .nb-cnav {
    padding: var(--nb-s4);
    gap: var(--nb-s3);
  }

  .nb-cnav__list {
    grid-auto-flow: column;
    grid-auto-columns: max-content;
    gap: var(--nb-s2);
    overflow-x: auto;
    scrollbar-width: none;
    -ms-overflow-style: none;
    scroll-snap-type: x proximity;
    padding-bottom: 2px;
  }

  .nb-cnav__list::-webkit-scrollbar {
    display: none;
  }

  .nb-cnav__item {
    width: auto;
    scroll-snap-align: start;
    padding-inline: 0.9rem;
    border: 1px solid var(--nb-line-soft);
    border-radius: var(--nb-r-pill);
    white-space: nowrap;
  }

  .nb-cnav__item.is-on {
    border-color: rgba(var(--nb-ember-rgb), 0.5);
  }

  .nb-cnav__out {
    padding-top: var(--nb-s3);
  }

  .nb-cnav__out .nb-cnav__item {
    border-color: var(--nb-line-soft);
    width: auto;
  }
}

/* ========================================================== 3. READOUT TILES */

.nb-read {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: var(--nb-s2);
  padding: var(--nb-s5);
  background: linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  overflow: hidden;
  isolation: isolate;
  transition: border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-read:hover {
  border-color: var(--nb-line-hard);
}

.nb-read__k {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-read__v {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: clamp(1.35rem, 2.6vw, 1.9rem);
  font-weight: 600;
  line-height: 1.05;
  letter-spacing: -0.04em;
  color: var(--nb-white);
  font-variant-numeric: tabular-nums;
  overflow-wrap: anywhere;
}

.nb-read__note {
  font-size: var(--nb-fs-xs);
  color: var(--nb-mist);
}

.nb-read__note a {
  color: var(--nb-ember-hot);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.nb-read__note a:hover {
  color: var(--nb-ember);
}

/* Primary readout: taller, value sits on the floor, aperture in the corner. */
.nb-read--lead {
  justify-content: flex-end;
  min-height: 216px;
}

.nb-read--lead .nb-read__v {
  font-size: clamp(2.1rem, 5.2vw, 3.4rem);
  line-height: 0.9;
}

.nb-read__eye {
  position: absolute;
  z-index: -1;
  top: -30%;
  right: -12%;
  width: 62%;
  aspect-ratio: 1;
  border-radius: 50%;
  border: 1px solid var(--nb-line);
  background: radial-gradient(circle, rgba(var(--nb-ember-rgb), 0.12), transparent 66%);
  pointer-events: none;
}

.nb-read__eye::after {
  content: '';
  position: absolute;
  inset: 20%;
  border-radius: 50%;
  border: 1px dashed var(--nb-line-soft);
}

/* Title inside a readout when the value is a product name, not a number. */
.nb-read__name {
  font-size: clamp(1.05rem, 1.8vw, 1.35rem);
  font-weight: 650;
  line-height: 1.25;
  letter-spacing: -0.02em;
  color: var(--nb-white);
}

/* ---- Dashboard tile grid: deliberately uneven. ---- */
.nb-dash {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: var(--nb-s4);
}

.nb-dash__lead {
  grid-column: span 7;
  grid-row: span 2;
}

.nb-dash__side {
  grid-column: span 5;
}

.nb-dash__wide {
  grid-column: span 8;
}

.nb-dash__narrow {
  grid-column: span 4;
}

.nb-dash__full {
  grid-column: span 12;
}

@media (max-width: 899px) {
  .nb-dash__lead {
    grid-column: span 12;
    grid-row: auto;
  }

  .nb-dash__side {
    grid-column: span 6;
  }

  .nb-dash__wide,
  .nb-dash__narrow {
    grid-column: span 12;
  }
}

@media (max-width: 519px) {
  .nb-dash__side {
    grid-column: span 12;
  }
}

/* ---- Destructive zone: a hairline footer, not a red button in the flow. ---- */
.nb-danger {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--nb-s4);
  padding-top: var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-danger__k {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-danger__p {
  margin-top: 5px;
  max-width: 46ch;
  font-size: var(--nb-fs-xs);
  color: var(--nb-mist);
}

/* Ember already is the system's red — no new colour needed for danger. */
.nb-btn--danger {
  --btn-bg: transparent;
  --btn-line: rgba(var(--nb-ember-rgb), 0.45);
  --btn-fg: var(--nb-ember-hot);
}

.nb-btn--danger:hover {
  --btn-bg: rgba(var(--nb-ember-rgb), 0.12);
  --btn-line: var(--nb-ember);
  --btn-fg: #fff;
  transform: translateY(-2px);
}

/* ================================================================= 4. LOGS */
/* Invoice / ticket entries as instrument rows: aperture index, mono telemetry,
   pip status, quiet actions. Below 767px each row becomes its own card. */

.nb-log {
  display: grid;
  gap: var(--nb-s3);
}

.nb-log__row {
  position: relative;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  gap: var(--nb-s3) var(--nb-s4);
  align-items: start;
  padding: var(--nb-s5);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
  transition:
    background var(--nb-t-fast) var(--nb-ease-orbit),
    border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-log__row:hover {
  background: var(--nb-surface-2);
  border-color: var(--nb-line-hard);
}

.nb-log__eye {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  flex: none;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.04em;
  color: var(--nb-mist);
  border: 1px solid var(--nb-line);
  border-radius: 50%;
  transition:
    color var(--nb-t-fast) var(--nb-ease-orbit),
    border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-log__row:hover .nb-log__eye {
  color: var(--nb-white);
  border-color: rgba(var(--nb-ember-rgb), 0.45);
}

.nb-log__body {
  display: grid;
  gap: 6px;
  min-width: 0;
}

.nb-log__title {
  font-size: 1.02rem;
  font-weight: 640;
  line-height: 1.3;
  letter-spacing: -0.018em;
  color: var(--nb-white);
  overflow-wrap: anywhere;
}

a.nb-log__title:hover {
  color: var(--nb-ember-hot);
}

.nb-log__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 4px var(--nb-s4);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-log__meta b {
  font-weight: 500;
  letter-spacing: 0.06em;
  color: var(--nb-frost);
  font-variant-numeric: tabular-nums;
}

.nb-log__ref {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-log__ref b {
  font-weight: 500;
  color: var(--nb-ember-hot);
}

a.nb-log__ref:hover b {
  color: var(--nb-ember);
}

.nb-log__side {
  display: grid;
  justify-items: end;
  align-content: start;
  gap: var(--nb-s3);
}

.nb-log__acts {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s2);
  justify-content: flex-end;
}

/* Quoted transcript preview inside a ticket row. */
.nb-quote {
  display: grid;
  gap: 3px;
  margin-top: var(--nb-s2);
  padding-left: var(--nb-s4);
  border-left: 1px solid var(--nb-line);
}

.nb-quote__k {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-quote__v {
  font-size: var(--nb-fs-sm);
  line-height: 1.5;
  color: var(--nb-mist);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.nb-quote__who {
  color: var(--nb-frost);
  font-weight: 620;
}

@media (max-width: 767px) {
  .nb-log__row {
    padding: var(--nb-s4);
  }

  .nb-log__side {
    grid-column: 1 / -1;
    justify-items: stretch;
    padding-top: var(--nb-s3);
    border-top: 1px solid var(--nb-line-soft);
  }

  .nb-log__acts {
    justify-content: stretch;
  }

  .nb-log__acts > * {
    flex: 1 1 9rem;
  }
}

/* An "info" pip for in-flight / reversed states. Mist is an existing token,
   so this adds a level without adding a colour. */
.nb-pip--info {
  color: var(--nb-mist);
}

/* ---- Advisory strip: one ember rule, no filled banner. ---- */
.nb-advis {
  display: flex;
  align-items: flex-start;
  gap: var(--nb-s3);
  padding: var(--nb-s4) var(--nb-s5);
  font-size: var(--nb-fs-sm);
  color: var(--nb-mist);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-left: 2px solid var(--nb-ember);
  border-radius: var(--nb-r-md);
}

.nb-advis svg {
  width: 18px;
  height: 18px;
  flex: none;
  margin-top: 2px;
  color: var(--nb-ember);
}

.nb-advis a {
  color: var(--nb-ember-hot);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.nb-advis a:hover {
  color: var(--nb-ember);
}

/* Pagination sits on its own rule below a log. */
.nb-pagi {
  margin-top: var(--nb-s5);
}

/* ============================================================ 5. TRANSCRIPT */

.nb-tx {
  display: grid;
  grid-template-rows: auto minmax(0, 1fr) auto;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-lg);
  overflow: hidden;
  background: linear-gradient(180deg, var(--nb-surface-1), rgba(4, 5, 10, 0.55));
}

.nb-tx__head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--nb-s3);
  padding: var(--nb-s4) var(--nb-s5);
  background: var(--nb-surface-1);
  border-bottom: 1px solid var(--nb-line);
}

.nb-tx__tags {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--nb-s2);
}

.nb-tag {
  display: inline-flex;
  align-items: center;
  gap: 0.45em;
  padding: 0.4rem 0.75rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--nb-mist);
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-pill);
}

a.nb-tag {
  transition:
    color var(--nb-t-micro) var(--nb-ease-orbit),
    background var(--nb-t-micro) var(--nb-ease-orbit),
    border-color var(--nb-t-micro) var(--nb-ease-orbit);
}

a.nb-tag:hover {
  color: var(--nb-white);
  background: var(--nb-surface-2);
  border-color: var(--nb-line-hard);
}

/* Shape + typography only. Colour is supplied by the Alpine :class binding
   that this element has always carried — do not set colour here. */
.nb-tstatus {
  display: inline-flex;
  align-items: center;
  padding: 0.4rem 0.75rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  border-width: 1px;
  border-style: solid;
  border-radius: var(--nb-r-pill);
}

.nb-tx__stream {
  display: grid;
  align-content: start;
  gap: var(--nb-s5);
  height: clamp(320px, 54vh, 640px);
  padding: var(--nb-s5);
  overflow-y: auto;
  overscroll-behavior: contain;
}

/* NOTE: never set flex-direction / text-align here — Alpine toggles
   `flex-row-reverse` and `text-right` on these nodes. */
.nb-tx__msg {
  min-width: 0;
}

.nb-tx__eye {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  flex: none;
  overflow: hidden;
  color: var(--nb-mist);
  background: var(--nb-abyss);
  border: 1px solid var(--nb-line);
  border-radius: 50%;
}

.nb-tx__eye img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  padding: 5px;
}

.nb-tx__eye svg {
  width: 19px;
  height: 19px;
}

.nb-tx__eye--you {
  color: var(--nb-ember-hot);
  border-color: rgba(var(--nb-ember-rgb), 0.45);
}

.nb-tx__body {
  flex: 1 1 auto;
  min-width: 0;
}

.nb-tx__line {
  display: flex;
  align-items: center;
  gap: var(--nb-s2);
  margin-bottom: 6px;
}

/* No `color` here on purpose: Alpine binds `text-accent-400` (the customer)
   or `text-t-primary` (the shop) to this node, and both map to theme tokens.
   Declaring a colour here would win on source order and kill that signal. */
.nb-tx__who {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

.nb-tx__time {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.08em;
  color: var(--nb-dust);
}

.nb-tx__text {
  padding: 0.7rem 0.95rem;
  font-size: var(--nb-fs-sm);
  line-height: 1.65;
  color: var(--nb-frost);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-md);
  overflow-wrap: anywhere;
}

/* `text-right` is the class Alpine adds to the customer's own messages — use
   it as the hook so the operator's replies read differently. */
.text-right > .nb-tx__text {
  border-color: rgba(var(--nb-ember-rgb), 0.28);
  background: rgba(var(--nb-ember-rgb), 0.06);
}

.nb-tx__foot {
  padding: var(--nb-s4) var(--nb-s5) var(--nb-s5);
  background: rgba(4, 5, 10, 0.6);
  border-top: 1px solid var(--nb-line);
}

.nb-tx__form {
  position: relative;
  display: flex;
  align-items: flex-end;
  gap: var(--nb-s3);
}

.nb-tx__composer {
  resize: none;
  max-height: 7rem;
  overflow-y: auto;
}

.nb-tx__send {
  flex: none;
}

.nb-tx__sendlabel {
  display: none;
}

@media (min-width: 900px) {
  .nb-tx__sendlabel {
    display: inline;
  }
}

.nb-tx__err {
  position: absolute;
  left: 0;
  top: 100%;
  margin-top: 5px;
  font-size: var(--nb-fs-xs);
  color: var(--nb-ember-hot);
}

.nb-tx__closed {
  text-align: center;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

@media (max-width: 519px) {
  .nb-tx__head,
  .nb-tx__stream,
  .nb-tx__foot {
    padding-inline: var(--nb-s4);
  }
}

/* ================================================================ 6. VAULT */
/* Balance. The amount lives inside an aperture — the page's focal object —
   and the top-up denominations sit beside it as an instrument rail. */

.nb-vault {
  display: grid;
  grid-template-columns: minmax(0, 0.82fr) minmax(0, 1.18fr);
  gap: var(--nb-s4);
  align-items: stretch;
}

@media (max-width: 899px) {
  .nb-vault {
    grid-template-columns: minmax(0, 1fr);
  }
}

.nb-vault__disc {
  position: relative;
  display: grid;
  place-items: center;
  gap: var(--nb-s4);
  padding: clamp(1.5rem, 4vw, 2.5rem) var(--nb-s5);
  text-align: center;
  background:
    radial-gradient(90% 70% at 50% 0%, rgba(var(--nb-ember-rgb), 0.1), transparent 62%),
    linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-lg);
}

.nb-vault__eye {
  position: relative;
  display: grid;
  place-content: center;
  gap: 6px;
  width: min(100%, 208px);
  aspect-ratio: 1;
  border-radius: 50%;
  background:
    radial-gradient(circle at 44% 36%, rgba(var(--nb-ember-rgb), 0.32), transparent 58%),
    radial-gradient(circle at 68% 72%, rgba(46, 31, 94, 0.8), transparent 62%),
    var(--nb-abyss);
  border: 1px solid var(--nb-line-hard);
}

.nb-vault__eye::after {
  content: '';
  position: absolute;
  inset: -9%;
  border-radius: 50%;
  border: 1px dashed var(--nb-line);
  pointer-events: none;
}

.nb-vault__amt {
  font-family: var(--nb-font-mono);
  font-size: clamp(1.35rem, 4.2vw, 1.95rem);
  font-weight: 600;
  letter-spacing: -0.045em;
  color: var(--nb-white);
  font-variant-numeric: tabular-nums;
}

.nb-vault__k {
  display: block;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-vault__note {
  max-width: 34ch;
  font-size: var(--nb-fs-xs);
  color: var(--nb-mist);
}

.nb-topup {
  display: grid;
  align-content: start;
  gap: var(--nb-s4);
  padding: var(--nb-s5);
  background: linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
}

.nb-topup__opts {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s2);
}

.nb-amt {
  position: relative;
  min-height: 48px;
  padding: 0.7rem 1.15rem;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-sm);
  font-weight: 600;
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
  color: var(--nb-frost);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-pill);
  transition:
    color var(--nb-t-micro) var(--nb-ease-orbit),
    background var(--nb-t-micro) var(--nb-ease-orbit),
    border-color var(--nb-t-micro) var(--nb-ease-orbit),
    transform var(--nb-t-micro) var(--nb-ease-mass);
}

.nb-amt:hover:not(:disabled) {
  color: var(--nb-white);
  background: var(--nb-surface-2);
  border-color: rgba(var(--nb-ember-rgb), 0.5);
  transform: translateY(-2px);
}

.nb-amt:disabled {
  cursor: progress;
}

.nb-amt__spin {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  color: var(--nb-ember);
}

.nb-amt__spin svg {
  width: 18px;
  height: 18px;
  animation: nb-orbit 900ms linear infinite;
}

/* ============================================================== 7. LEDGERS */
/* Tabular readouts. Below 767px every row folds into a labelled card, so the
   table never forces horizontal scroll. */

.nb-ledger-wrap {
  margin-top: var(--nb-s2);
}

.nb-ledger {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--nb-fs-sm);
}

.nb-ledger th {
  padding: 0.65rem var(--nb-s4) 0.65rem 0;
  text-align: left;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
  white-space: nowrap;
  border-bottom: 1px solid var(--nb-line);
}

.nb-ledger td {
  padding: 0.85rem var(--nb-s4) 0.85rem 0;
  vertical-align: top;
  color: var(--nb-frost);
  border-bottom: 1px solid var(--nb-line-soft);
  overflow-wrap: anywhere;
}

.nb-ledger th:last-child,
.nb-ledger td:last-child {
  padding-right: 0;
}

.nb-ledger tbody tr {
  transition: background var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-ledger tbody tr:hover {
  background: var(--nb-surface-1);
}

.nb-ledger__num {
  font-family: var(--nb-font-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.02em;
  white-space: nowrap;
}

.nb-ledger__dim {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-xs);
  letter-spacing: 0.06em;
  color: var(--nb-mist);
  white-space: nowrap;
}

.nb-ledger__type {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-mist);
}

.nb-ledger a {
  color: var(--nb-frost);
  text-decoration: underline;
  text-decoration-color: var(--nb-ash);
  text-underline-offset: 3px;
}

.nb-ledger a:hover {
  color: var(--nb-ember-hot);
  text-decoration-color: currentColor;
}

@media (max-width: 767px) {
  .nb-ledger thead {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
  }

  .nb-ledger,
  .nb-ledger tbody,
  .nb-ledger tr,
  .nb-ledger td {
    display: block;
    width: 100%;
  }

  .nb-ledger tr {
    padding: var(--nb-s4);
    margin-bottom: var(--nb-s3);
    background: var(--nb-surface-1);
    border: 1px solid var(--nb-line-soft);
    border-radius: var(--nb-r-md);
  }

  .nb-ledger tr:last-child {
    margin-bottom: 0;
  }

  .nb-ledger td {
    display: grid;
    grid-template-columns: minmax(78px, 32%) minmax(0, 1fr);
    gap: var(--nb-s3);
    align-items: baseline;
    padding: 0.32rem 0;
    border-bottom: 0;
  }

  .nb-ledger td::before {
    content: attr(data-k);
    font-family: var(--nb-font-mono);
    font-size: var(--nb-fs-mono);
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--nb-dust);
  }
}

/* =============================================================== 8. RELAY */
/* Affiliate. Commission lives in an aperture; the referral link is a
   transmitter strip; stats are a mono telemetry rail. */

.nb-relay {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: var(--nb-s4);
}

.nb-relay__disc {
  position: relative;
  grid-column: span 4;
  grid-row: span 2;
  display: grid;
  place-items: center;
  align-content: center;
  gap: var(--nb-s4);
  padding: var(--nb-s6) var(--nb-s5);
  text-align: center;
  background:
    radial-gradient(80% 60% at 50% 100%, rgba(46, 31, 94, 0.5), transparent 66%),
    linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-lg);
}

.nb-relay__eye {
  position: relative;
  display: grid;
  place-content: center;
  width: min(100%, 176px);
  aspect-ratio: 1;
  border-radius: 50%;
  background:
    radial-gradient(circle at 42% 36%, rgba(var(--nb-ember-rgb), 0.34), transparent 58%),
    var(--nb-abyss);
  border: 1px solid var(--nb-line-hard);
}

.nb-relay__eye::after {
  content: '';
  position: absolute;
  inset: -10%;
  border-radius: 50%;
  border: 1px dashed var(--nb-line);
  pointer-events: none;
}

.nb-relay__pct {
  font-family: var(--nb-font-mono);
  font-size: clamp(1.9rem, 5vw, 2.8rem);
  font-weight: 600;
  letter-spacing: -0.05em;
  color: var(--nb-white);
  font-variant-numeric: tabular-nums;
}

.nb-relay__link {
  grid-column: span 8;
  display: grid;
  gap: var(--nb-s3);
  align-content: start;
  padding: var(--nb-s5);
  background: linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
}

.nb-relay__stat {
  grid-column: span 8;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--nb-s4) clamp(1.5rem, 4vw, 3rem);
  padding: var(--nb-s5);
  background: var(--nb-surface-1);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
}

@media (max-width: 899px) {
  .nb-relay__disc,
  .nb-relay__link,
  .nb-relay__stat {
    grid-column: span 12;
    grid-row: auto;
  }
}

.nb-relay__head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--nb-s3);
}

/* The link itself: a dashed transmitter field that scrolls instead of
   breaking the layout on long URLs. */
.nb-relay__field {
  display: block;
  width: 100%;
  padding: 0.8rem 1rem;
  min-height: 46px;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-xs);
  letter-spacing: 0.02em;
  text-align: left;
  color: var(--nb-frost);
  background: var(--nb-abyss);
  border: 1px dashed var(--nb-line-hard);
  border-radius: var(--nb-r-md);
  white-space: nowrap;
  overflow-x: auto;
  scrollbar-width: none;
  transition:
    border-color var(--nb-t-micro) var(--nb-ease-orbit),
    color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-relay__field::-webkit-scrollbar {
  display: none;
}

.nb-relay__field:hover {
  color: var(--nb-white);
  border-color: rgba(var(--nb-ember-rgb), 0.55);
}

.nb-relay__note {
  font-size: var(--nb-fs-xs);
  color: var(--nb-mist);
  max-width: 58ch;
}

/* ================================================================ 9. MODALS */
/* Shared shell for the delete-account and open-ticket dialogs. */

.nb-mwrap {
  position: fixed;
  inset: 0;
  z-index: 90;
  overflow-y: auto;
}

.nb-mwrap__inner {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  padding: var(--nb-s5) var(--nb-gutter);
}

.nb-mform {
  display: grid;
  gap: var(--nb-s4);
  margin-top: var(--nb-s5);
}

.nb-mform__actions {
  display: grid;
  gap: var(--nb-s3);
  margin-top: var(--nb-s2);
}

@media (min-width: 520px) {
  .nb-mform__actions--split {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

.nb-mkicker {
  display: block;
  margin-bottom: var(--nb-s2);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-mlead {
  font-size: var(--nb-fs-sm);
  line-height: 1.6;
  color: var(--nb-mist);
}

.nb-minput--locked {
  color: var(--nb-mist);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-xs);
  letter-spacing: 0.08em;
  pointer-events: none;
}

.nb-mform__err {
  font-size: var(--nb-fs-xs);
  color: var(--nb-ember-hot);
}

/* Keep the header clear of the absolutely positioned close aperture. */
.nb-mwrap .nb-mkicker,
.nb-mwrap .nb-modal__title {
  padding-right: 2.8rem;
}

/* ============================================================== 10. SLABS */
/* The plain sectioned panel used for ledgers. Deliberately quieter than a
   readout tile so the table inside is the thing you look at. */

.nb-slab {
  display: grid;
  gap: var(--nb-s4);
  padding: var(--nb-s5);
  background: linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-lg);
}

.nb-slab__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--nb-s3) var(--nb-s4);
  padding-bottom: var(--nb-s4);
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-slab__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h3);
  font-weight: 720;
  letter-spacing: -0.03em;
  color: var(--nb-white);
}

/* .nb-empty is authored against h3; these pages already own the h1, so their
   empty states use h2/h3 depending on depth. Match both. */
.nb-empty h2 {
  font-size: var(--nb-fs-h3);
}

@media (max-width: 519px) {
  .nb-slab {
    padding: var(--nb-s4);
  }
}

/* ---------------------------------------------------------------------------
   MISC
   --------------------------------------------------------------------------- */
/* ============================================================================
   NEBULA MARKET — ANNOUNCEMENT TICKER + BLOG (EDITORIAL)
   ----------------------------------------------------------------------------
   Owned by the announcement/blog pass. Depends on custom.css (tokens) and
   nebula-ui.css (.nb-shell, .nb-rail, .nb-pip, .nb-empty, .nb-prose,
   .nb-tel__val/.nb-tel__key, .nb-btn). No new colours, easings, radii or
   fonts — every value below resolves to an existing --nb-* token.

   Wired from the components that need it:
     components/announcement.njk, components/blog-page.njk,
     components/blog-posts.njk, components/blog-post-page.njk

   Namespaces used here (checked against every other partial for collisions):
     .nb-ann*       announcement ticker
     .nb-blogidx*   /blog index page
     .nb-blogsec*   "latest posts" section on other pages
     .nb-blogcard*  small post card
     .nb-blogfeat*  enlarged newest-post card
     .nb-blogpost*  single post page
   ========================================================================== */

/* ==================================================== A. ANNOUNCEMENT TICKER */
/* Was a full-bleed ember bar. Now a slim instrument ticker: hairline bottom
   rule, mono uppercase telemetry, one ember dot as the "carrier signal".
   Both transports (marquee + rotator) share this chrome. */

.nb-ann__bar {
  background: linear-gradient(180deg, var(--nb-surface-2), var(--nb-surface-1));
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-ann__inner {
  display: flex;
  align-items: center;
  gap: var(--nb-s4);
  width: 100%;
  max-width: var(--nb-max);
  min-height: 40px;
  margin-inline: auto;
  padding-block: 0.3rem;
  padding-inline: var(--nb-gutter);
}

/* Carrier: ember dot + channel label. The dot is the only ember in the bar. */
.nb-ann__sig {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  flex: none;
}

.nb-ann__key {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 500;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--nb-dust);
  white-space: nowrap;
}

.nb-ann__feed {
  position: relative;
  flex: 1 1 auto;
  min-width: 0;
}

/* Hairline gutters either side of the feed — machined, not decorative. */
.nb-ann__feed::before {
  content: '';
  position: absolute;
  left: calc(var(--nb-s4) * -0.5);
  top: 15%;
  bottom: 15%;
  width: 1px;
  background: var(--nb-line-soft);
}

/* All ticker copy is mono telemetry, including the anchor rendered by
   snippets/announcement-item.njk (which this pass does not own). */
.nb-ann__feed,
.nb-ann__feed p,
.nb-ann__feed a {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-mist);
}

.nb-ann__feed a {
  transition: color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-ann__feed a:hover {
  color: var(--nb-white);
}

/* The external-link glyph ships at 16px from the shared snippet; scale it to
   the mono cap-height instead of editing a file this pass does not own. */
.nb-ann__feed svg {
  width: 11px;
  height: 11px;
  margin-left: 0.5em;
}

/* Both transports get the same track height so the bar never jumps between
   the two branches. Two classes deep so it wins over the utility height. */
.nb-ann__feed .nb-ann__marquee,
.nb-ann__feed .nb-ann__rotator {
  height: 1.6rem;
}

.nb-ann__feed .nb-ann__marquee > div,
.nb-ann__feed .nb-ann__rotator p {
  line-height: 1.6rem;
}

/* Edges dissolve rather than cutting off mid-glyph. */
.nb-ann__marquee {
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 2.2rem, #000 calc(100% - 2.2rem), transparent);
  mask-image: linear-gradient(90deg, transparent, #000 2.2rem, #000 calc(100% - 2.2rem), transparent);
}

.nb-ann__stamp {
  flex: none;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--nb-ash);
  white-space: nowrap;
}

@media (max-width: 767px) {
  .nb-ann__inner {
    min-height: 44px;
    gap: var(--nb-s3);
  }

  .nb-ann__key,
  .nb-ann__stamp,
  .nb-ann__feed::before {
    display: none;
  }
}

/* ======================================================= B. BLOG INDEX PAGE */
/* Masthead is a 12-column editorial grid: headline left-weighted across eight
   columns, mono counters pinned right on the same baseline, one hairline rule
   under the whole thing. No centred pill, no centred H1. */

.nb-blogidx {
  position: relative;
  padding-block: clamp(3rem, 7vw, 6rem) var(--nb-section);
}

/* Depth only — a cold halo off the top-right corner. */
.nb-blogidx__arc {
  position: absolute;
  top: -34%;
  right: -8%;
  z-index: -1;
  width: min(62vw, 620px);
  aspect-ratio: 1;
  border-radius: 50%;
  border: 1px solid var(--nb-line-soft);
  background: radial-gradient(
    circle at 42% 40%,
    rgba(var(--nb-ember-rgb), 0.1),
    rgba(46, 31, 94, 0.14) 44%,
    transparent 70%
  );
  pointer-events: none;
}

.nb-blogidx__head {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  align-items: end;
  gap: var(--nb-s4) var(--nb-s5);
  padding-bottom: var(--nb-s6);
  border-bottom: 1px solid var(--nb-line-soft);
  margin-bottom: clamp(2rem, 5vw, 4.5rem);
}

.nb-blogidx__rail {
  grid-column: 1 / -1;
  margin-bottom: var(--nb-s3);
}

.nb-blogidx__title {
  grid-column: 1 / span 8;
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-display);
  font-weight: 800;
  line-height: 0.88;
  letter-spacing: -0.05em;
}

.nb-blogidx__meta {
  grid-column: 10 / -1;
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--nb-s5);
  text-align: right;
  padding-bottom: 0.35rem;
}

@media (max-width: 1023px) {
  .nb-blogidx__title {
    grid-column: 1 / -1;
  }

  .nb-blogidx__meta {
    grid-column: 1 / -1;
    justify-content: flex-start;
    text-align: left;
    padding-top: var(--nb-s4);
  }
}

.nb-blogidx__feature {
  margin-bottom: clamp(2.5rem, 6vw, 5rem);
}

/* Uneven columns + a per-column vertical drift: the row baseline is never
   flat, which is what stops this reading as a generic 3-up blog grid. */
.nb-blogidx__grid {
  display: grid;
  grid-template-columns: minmax(0, 1.14fr) minmax(0, 0.9fr) minmax(0, 1.02fr);
  gap: clamp(1.75rem, 3.4vw, 3rem) var(--nb-s5);
  align-items: start;
}

@media (min-width: 1024px) {
  .nb-blogidx__grid > *:nth-child(3n + 2) {
    margin-top: var(--nb-s8);
  }

  .nb-blogidx__grid > *:nth-child(3n + 3) {
    margin-top: var(--nb-s5);
  }
}

@media (max-width: 1023px) {
  .nb-blogidx__grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 599px) {
  .nb-blogidx__grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

.nb-blogidx__pager {
  margin-top: clamp(2.5rem, 6vw, 4.5rem);
  padding-top: var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
}

/* ================================================= C. "LATEST POSTS" SECTION */
/* Deliberately the mirror of the index page: the counter numeral takes the
   left margin column and the headline is pushed off-axis to the right. */

.nb-blogsec {
  position: relative;
  padding-block: var(--nb-section);
}

.nb-blogsec__head {
  display: grid;
  grid-template-columns: minmax(0, 0.72fr) minmax(0, 1.75fr);
  align-items: end;
  gap: clamp(1.5rem, 4vw, 3.5rem);
  margin-bottom: clamp(2rem, 5vw, 4rem);
}

.nb-blogsec__mark {
  position: relative;
  display: grid;
  gap: var(--nb-s2);
  padding-bottom: var(--nb-s2);
  border-bottom: 1px solid var(--nb-line-soft);
}

.nb-blogsec__mark-n {
  font-family: var(--nb-font-mono);
  font-size: clamp(2.6rem, 7vw, 5rem);
  font-weight: 600;
  line-height: 0.82;
  letter-spacing: -0.06em;
  color: transparent;
  -webkit-text-stroke: 1px var(--nb-ash);
  font-variant-numeric: tabular-nums;
}

.nb-blogsec__mark-k {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-blogsec__copy {
  display: grid;
  gap: var(--nb-s4);
  justify-items: start;
}

.nb-blogsec__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h1);
  font-weight: 780;
  line-height: 0.96;
  letter-spacing: -0.042em;
}

.nb-blogsec__sub {
  color: var(--nb-mist);
  max-width: 54ch;
}

@media (max-width: 899px) {
  .nb-blogsec__head {
    grid-template-columns: minmax(0, 1fr);
    align-items: start;
    gap: var(--nb-s5);
  }

  .nb-blogsec__mark {
    justify-self: start;
    padding-right: var(--nb-s6);
  }
}

/* Flex row keeps the original wrapping contract (fixed basis, no growth) so
   `properties.centered` still means what it meant. */
.nb-blogsec__row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nb-s5);
  width: 100%;
}

.nb-blogsec__row.is-centered {
  justify-content: center;
}

.nb-blogsec__item {
  flex: 0 1 100%;
  min-width: 0;
}

@media (min-width: 640px) {
  .nb-blogsec__item {
    flex-basis: calc((100% - var(--nb-s5)) / 2);
  }
}

@media (min-width: 1024px) {
  .nb-blogsec__item {
    flex-basis: calc((100% - 2 * var(--nb-s5)) / 3);
  }

  .nb-blogsec__item:nth-child(even) {
    margin-top: var(--nb-s6);
  }
}

@media (min-width: 1536px) {
  .nb-blogsec__item {
    flex-basis: calc((100% - 3 * var(--nb-s5)) / 4);
  }
}

.nb-blogsec__foot {
  display: flex;
  justify-content: flex-end;
  margin-top: clamp(2rem, 4vw, 3rem);
  padding-top: var(--nb-s5);
  border-top: 1px solid var(--nb-line-soft);
}

/* ============================================================ D. POST CARD */
/* Not a panel. A plate over a hairline rule — an index entry in a catalogue.
   The aperture is the read dial in the footer; it fills ember on hover. */

.nb-blogcard {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: var(--nb-s4);
  min-height: 100%;
  padding-bottom: var(--nb-s5);
  border-bottom: 1px solid var(--nb-line-soft);
  transition: border-color var(--nb-t-fast) var(--nb-ease-orbit);
  -webkit-tap-highlight-color: transparent;
}

.nb-blogcard:hover,
.nb-blogcard:focus-visible {
  border-bottom-color: rgba(var(--nb-ember-rgb), 0.55);
}

.nb-blogcard__plate {
  position: relative;
  aspect-ratio: 16 / 10;
  overflow: hidden;
  border-radius: var(--nb-r-md);
  border: 1px solid var(--nb-line-soft);
  background:
    radial-gradient(circle at 50% 38%, rgba(255, 255, 255, 0.05), transparent 62%),
    var(--nb-abyss);
  transition: border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-blogcard:hover .nb-blogcard__plate {
  border-color: var(--nb-line-hard);
}

.nb-blogcard__plate img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform var(--nb-t-base) var(--nb-ease-orbit);
}

.nb-blogcard:hover .nb-blogcard__plate img {
  transform: scale(1.045);
}

/* Instrument ticks inside the plate (the plate clips, so they sit inset). */
.nb-blogcard__ticks::before,
.nb-blogcard__ticks::after {
  content: '';
  position: absolute;
  width: 11px;
  height: 11px;
  border: 1px solid var(--nb-line-hard);
  pointer-events: none;
  z-index: 2;
}

.nb-blogcard__ticks::before {
  top: 9px;
  left: 9px;
  border-right: 0;
  border-bottom: 0;
}

.nb-blogcard__ticks::after {
  bottom: 9px;
  right: 9px;
  border-left: 0;
  border-top: 0;
}

/* No cover image → the aperture stands in for it. On-concept empty media. */
.nb-blogcard__ph {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
}

.nb-blogcard__ph::before {
  content: '';
  width: 42%;
  aspect-ratio: 1;
  border-radius: 50%;
  border: 1px solid var(--nb-line);
  background: radial-gradient(circle at 42% 38%, rgba(var(--nb-ember-rgb), 0.16), transparent 58%);
}

.nb-blogcard__ph::after {
  content: '';
  position: absolute;
  width: 62%;
  aspect-ratio: 1;
  border-radius: 50%;
  border: 1px dashed var(--nb-line-soft);
}

.nb-blogcard__body {
  display: flex;
  flex-direction: column;
  flex: 1;
  gap: var(--nb-s3);
}

.nb-blogcard__meta {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.5em;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-blogcard__title {
  font-family: var(--nb-font-display);
  font-size: 1.12rem;
  font-weight: 700;
  line-height: 1.16;
  letter-spacing: -0.03em;
  color: var(--nb-white);
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.nb-blogcard__excerpt {
  font-size: var(--nb-fs-sm);
  line-height: 1.6;
  color: var(--nb-mist);
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.nb-blogcard__cta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--nb-s3);
  margin-top: auto;
  padding-top: var(--nb-s4);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--nb-mist);
  transition: color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-blogcard:hover .nb-blogcard__cta {
  color: var(--nb-white);
}

.nb-blogcard__go {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  flex: none;
  color: var(--nb-mist);
  border: 1px solid var(--nb-line);
  border-radius: 50%;
  transition:
    color var(--nb-t-fast) var(--nb-ease-orbit),
    background var(--nb-t-fast) var(--nb-ease-orbit),
    border-color var(--nb-t-fast) var(--nb-ease-orbit),
    transform var(--nb-t-fast) var(--nb-ease-mass);
}

.nb-blogcard__go svg {
  width: 14px;
  height: 14px;
}

.nb-blogcard:hover .nb-blogcard__go {
  color: #fff;
  background: var(--nb-ember);
  border-color: var(--nb-ember);
  transform: rotate(-45deg);
}

/* The empty state borrows .nb-empty but needs a sane heading level on the
   index page, where <h1> is already taken by the masthead. */
.nb-empty h2 {
  font-size: var(--nb-fs-h3);
}

/* ========================================================= E. FEATURE CARD */
/* The newest post, given real scale. Copy left, plate right and bleeding past
   the hairline rules so the composition is never a tidy rectangle. */

.nb-blogfeat {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1.04fr) minmax(0, 0.96fr);
  align-items: center;
  gap: clamp(1.5rem, 4vw, 4rem);
  padding-block: clamp(1.75rem, 3.4vw, 3rem);
  border-top: 1px solid var(--nb-line);
  border-bottom: 1px solid var(--nb-line);
  -webkit-tap-highlight-color: transparent;
}

.nb-blogfeat::before {
  content: '';
  position: absolute;
  left: 0;
  bottom: -1px;
  width: 0;
  height: 1px;
  background: var(--nb-ember);
  transition: width var(--nb-t-slow) var(--nb-ease-enter);
  pointer-events: none;
}

.nb-blogfeat:hover::before,
.nb-blogfeat:focus-visible::before {
  width: 100%;
}

.nb-blogfeat__copy {
  display: grid;
  gap: var(--nb-s4);
  justify-items: start;
  padding-inline-start: clamp(0px, 3vw, 3rem);
}

.nb-blogfeat__title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h1);
  font-weight: 780;
  line-height: 0.94;
  letter-spacing: -0.045em;
  color: var(--nb-white);
}

.nb-blogfeat__excerpt {
  font-size: clamp(1rem, 1.2vw, 1.1rem);
  line-height: 1.6;
  color: var(--nb-mist);
  max-width: 50ch;
}

.nb-blogfeat__meta {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.75em;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-blogfeat__cta {
  display: inline-flex;
  align-items: center;
  gap: 0.6em;
  min-height: 46px;
  padding: 0.8em 1.4em;
  font-size: var(--nb-fs-sm);
  font-weight: 620;
  color: var(--nb-frost);
  border: 1px solid var(--nb-line-hard);
  border-radius: var(--nb-r-pill);
  transition:
    color var(--nb-t-fast) var(--nb-ease-orbit),
    background var(--nb-t-fast) var(--nb-ease-orbit),
    border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-blogfeat__cta svg {
  width: 15px;
  height: 15px;
  flex: none;
}

.nb-blogfeat:hover .nb-blogfeat__cta {
  color: var(--nb-white);
  background: var(--nb-surface-2);
  border-color: rgba(var(--nb-ember-rgb), 0.55);
}

/* The plate breaks the rules above and below it. */
.nb-blogfeat__plate {
  position: relative;
  aspect-ratio: 4 / 3;
  margin-block: clamp(-3rem, -3vw, -1rem);
  overflow: hidden;
  border-radius: var(--nb-r-lg);
  border: 1px solid var(--nb-line);
  background:
    radial-gradient(circle at 50% 36%, rgba(255, 255, 255, 0.06), transparent 60%),
    linear-gradient(180deg, var(--nb-carbon), var(--nb-abyss));
  box-shadow: var(--nb-e3);
  transition: border-color var(--nb-t-fast) var(--nb-ease-orbit);
}

.nb-blogfeat:hover .nb-blogfeat__plate {
  border-color: var(--nb-line-hard);
}

.nb-blogfeat__plate img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform var(--nb-t-slow) var(--nb-ease-orbit);
}

.nb-blogfeat:hover .nb-blogfeat__plate img {
  transform: scale(1.04);
}

/* Coordinate readout on the plate — instrument, not caption. */
.nb-blogfeat__coord {
  position: absolute;
  right: var(--nb-s4);
  bottom: var(--nb-s3);
  z-index: 2;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  color: var(--nb-frost);
  text-shadow: 0 1px 8px rgba(4, 5, 10, 0.9);
  pointer-events: none;
}

@media (max-width: 1023px) {
  .nb-blogfeat {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--nb-s5);
  }

  .nb-blogfeat__copy {
    padding-inline-start: 0;
    order: 2;
  }

  .nb-blogfeat__plate {
    order: 1;
    aspect-ratio: 16 / 9;
    margin-block: 0;
  }
}

/* ======================================================== F. SINGLE POST */

.nb-blogpost {
  position: relative;
  padding-block: clamp(2.5rem, 6vw, 5rem) var(--nb-section);
}

.nb-blogpost__arc {
  position: absolute;
  top: -26%;
  left: -14%;
  z-index: -1;
  width: min(56vw, 560px);
  aspect-ratio: 1;
  border-radius: 50%;
  border: 1px solid var(--nb-line-soft);
  background: radial-gradient(
    circle at 58% 44%,
    rgba(46, 31, 94, 0.22),
    rgba(var(--nb-ember-rgb), 0.07) 46%,
    transparent 72%
  );
  pointer-events: none;
}

.nb-blogpost__head {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: var(--nb-s4) var(--nb-s5);
  align-items: end;
  padding-bottom: var(--nb-s6);
  border-bottom: 1px solid var(--nb-line-soft);
  margin-bottom: clamp(2rem, 4vw, 3.5rem);
}

.nb-blogpost__rail {
  grid-column: 1 / -1;
  margin-bottom: var(--nb-s3);
}

.nb-blogpost__title {
  grid-column: 1 / span 9;
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-display);
  font-weight: 800;
  line-height: 0.9;
  letter-spacing: -0.05em;
}

.nb-blogpost__stamp {
  grid-column: 11 / -1;
  display: grid;
  gap: var(--nb-s1);
  justify-items: end;
  text-align: right;
  padding-bottom: 0.4rem;
}

.nb-blogpost__lead {
  grid-column: 1 / span 8;
  margin-top: var(--nb-s3);
  font-size: clamp(1rem, 1.4vw, 1.2rem);
  line-height: 1.55;
  color: var(--nb-mist);
  max-width: 58ch;
}

@media (max-width: 1023px) {
  .nb-blogpost__title,
  .nb-blogpost__lead,
  .nb-blogpost__stamp {
    grid-column: 1 / -1;
  }

  .nb-blogpost__stamp {
    justify-items: start;
    text-align: left;
    padding-bottom: 0;
    padding-top: var(--nb-s3);
  }
}

/* Hero plate: wide, ticked, with the aperture reveal. */
.nb-blogpost__hero {
  position: relative;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  margin: 0 0 clamp(2rem, 4vw, 3.5rem);
  border-radius: var(--nb-r-lg);
  border: 1px solid var(--nb-line);
  background: linear-gradient(180deg, var(--nb-carbon), var(--nb-abyss));
}

.nb-blogpost__hero img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Reading column with a sticky telemetry margin — asymmetric, and the body
   keeps a real measure instead of stretching to the container. */
.nb-blogpost__grid {
  display: grid;
  grid-template-columns: minmax(0, 220px) minmax(0, 1fr);
  gap: clamp(1.5rem, 5vw, 4rem);
  align-items: start;
}

@media (max-width: 899px) {
  .nb-blogpost__grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

.nb-blogpost__aside {
  position: sticky;
  top: calc(var(--nb-nav-h) + var(--nb-s5));
  display: grid;
  gap: var(--nb-s4);
}

@media (max-width: 899px) {
  .nb-blogpost__aside {
    position: static;
    padding-bottom: var(--nb-s5);
    border-bottom: 1px solid var(--nb-line-soft);
  }
}

.nb-blogpost__fact {
  display: grid;
  gap: 2px;
  margin: 0;
  padding-block: var(--nb-s3);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-blogpost__fact dt {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-blogpost__fact dd {
  margin: 0;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-sm);
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.01em;
  color: var(--nb-frost);
}

.nb-blogpost__back {
  display: inline-flex;
  align-items: center;
  gap: 0.55em;
  min-height: 44px;
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--nb-mist);
  transition: color var(--nb-t-micro) var(--nb-ease-orbit);
}

.nb-blogpost__back:hover {
  color: var(--nb-white);
}

.nb-blogpost__back svg {
  width: 13px;
  height: 13px;
  flex: none;
}

/* ---- Prose over shop-authored HTML ---- */
/* Extends .nb-prose (nebula-ui.css) for the tags a blog body uses that the
   legal/terms prose rules do not cover. Scoped so nothing else is affected. */

.nb-blogpost__body {
  max-width: 70ch;
  font-size: var(--nb-fs-body);
}

.nb-blogpost__body > *:first-child {
  margin-top: 0;
}

.nb-blogpost__body h1 {
  margin: var(--nb-s7) 0 var(--nb-s4);
  font-size: var(--nb-fs-h2);
}

.nb-blogpost__body h2 {
  color: var(--nb-white);
}

.nb-blogpost__body h3,
.nb-blogpost__body h4,
.nb-blogpost__body h5,
.nb-blogpost__body h6 {
  color: var(--nb-frost);
}

.nb-blogpost__body h4,
.nb-blogpost__body h5,
.nb-blogpost__body h6 {
  margin: var(--nb-s5) 0 var(--nb-s3);
  font-size: 1rem;
}

.nb-blogpost__body img,
.nb-blogpost__body video,
.nb-blogpost__body iframe {
  max-width: 100%;
  margin-block: var(--nb-s5);
  border-radius: var(--nb-r-md);
  border: 1px solid var(--nb-line-soft);
}

.nb-blogpost__body blockquote {
  margin: var(--nb-s5) 0;
  padding: var(--nb-s2) 0 var(--nb-s2) var(--nb-s4);
  border-left: 2px solid rgba(var(--nb-ember-rgb), 0.6);
  color: var(--nb-frost);
  font-style: normal;
}

.nb-blogpost__body hr {
  height: 1px;
  margin: var(--nb-s6) 0;
  border: 0;
  background: var(--nb-line);
}

.nb-blogpost__body code {
  padding: 0.1em 0.4em;
  font-family: var(--nb-font-mono);
  font-size: 0.9em;
  color: var(--nb-frost);
  background: var(--nb-surface-2);
  border-radius: var(--nb-r-xs);
}

.nb-blogpost__body pre {
  display: block;
  overflow-x: auto;
  margin-block: var(--nb-s5);
  padding: var(--nb-s4);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-sm);
  background: var(--nb-abyss);
  border: 1px solid var(--nb-line-soft);
  border-radius: var(--nb-r-md);
}

.nb-blogpost__body pre code {
  padding: 0;
  background: none;
}

/* Wide tables scroll inside themselves — the page never scrolls sideways. */
.nb-blogpost__body table {
  display: block;
  width: 100%;
  overflow-x: auto;
  border-collapse: collapse;
  margin-block: var(--nb-s5);
  font-size: var(--nb-fs-sm);
}

.nb-blogpost__body th,
.nb-blogpost__body td {
  padding: 0.55rem 0.8rem;
  border: 1px solid var(--nb-line-soft);
  text-align: left;
}

.nb-blogpost__body th {
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-blogpost__colophon {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--nb-s3);
  max-width: 70ch;
  margin-top: clamp(2rem, 4vw, 3rem);
  padding-top: var(--nb-s4);
  border-top: 1px solid var(--nb-line-soft);
  font-family: var(--nb-font-mono);
  font-size: var(--nb-fs-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--nb-dust);
}

.nb-blogpost__colophon b {
  font-weight: 600;
  color: var(--nb-frost);
}

/* ---- Related posts: a rail under the article, not a sidebar ---- */
.nb-blogpost__more {
  margin-top: clamp(3rem, 8vw, 6rem);
  padding-top: var(--nb-s6);
  border-top: 1px solid var(--nb-line-soft);
}

.nb-blogpost__more-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--nb-s4);
  margin-bottom: clamp(1.5rem, 3vw, 2.5rem);
}

.nb-blogpost__more-title {
  font-family: var(--nb-font-display);
  font-size: var(--nb-fs-h2);
  font-weight: 780;
  letter-spacing: -0.04em;
}

.nb-blogpost__more-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(248px, 1fr));
  gap: var(--nb-s5);
  align-items: start;
}

/* Slightly tighter cards down here — the article is the subject, not these. */
.nb-blogpost__more-grid .nb-blogcard__plate {
  aspect-ratio: 16 / 9;
}

.nb-blogpost__more-grid .nb-blogcard__excerpt {
  -webkit-line-clamp: 2;
}

@media (min-width: 1024px) {
  .nb-blogpost__more-grid > *:nth-child(even) {
    margin-top: var(--nb-s6);
  }
}
