/* ============================================================================
   NIMBUS DESIGN SYSTEM
   Extracted + extended from the launch-page fragments and live site theme.
   - Brand: Lato, primary #134176 (hover #0e305a), green #1a7a4c, orange #c0672a.
   - Three explorable DIRECTIONS via [data-direction] on <html>:
       faithful  -> matches the current Divi/Lato pages (the baseline)
       refined   -> same DNA, tighter type, more air, softer elevation
       modern    -> gallery-premium: serif display headings, larger scale, richer
   - Hero VARIATIONS via [data-hero] on <body>; non-active heroes are hidden.
   Tokens are the single source of truth; components read from them.
   ============================================================================ */

/* ---- Fonts (preview only; live Divi theme already provides Lato) ---- */

/* ============================ TOKENS ============================ */
:root{
  /* Brand color */
  --nb-blue:#0e305a;
  --nb-blue-dark:#0a2545;
  --nb-blue-tint:#eef3f9;
  --nb-green:#1a7a4c;
  --nb-green-tint:#e7f5ec;
  --nb-orange:#c0672a;
  --nb-orange-tint:#fbf0e7;

  /* Ink + neutrals */
  --nb-ink:#1b2733;
  --nb-body:#444b53;
  --nb-muted:#6b7480;
  --nb-faint:#9aa3ad;
  --nb-line:#e0e4e8;
  --nb-line-soft:#eceff2;
  --nb-bg:#ffffff;
  --nb-bg-soft:#f8f9fa;
  --nb-bg-deep:#0f2238;

  /* Type */
  --nb-font-body:'Lato',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
  --nb-font-display:var(--nb-font-body);
  --nb-display-weight:900;
  --nb-display-tracking:-0.01em;
  --nb-display-style:normal;

  --nb-h1:clamp(2.3rem, 1.6rem + 2.6vw, 3.4rem);
  --nb-h2:clamp(1.7rem, 1.4rem + 1.1vw, 2.2rem);
  --nb-h3:1.25rem;
  --nb-lede:clamp(1.12rem, 1.04rem + 0.4vw, 1.3rem);
  --nb-body-size:1.06rem;
  --nb-leading:1.7;

  /* Shape + elevation */
  --nb-radius:12px;
  --nb-radius-sm:6px;
  --nb-radius-lg:16px;
  --nb-card-border:1px solid var(--nb-line);
  --nb-shadow-sm:0 1px 4px rgba(15,34,56,.06);
  --nb-shadow-md:0 4px 16px rgba(19,65,118,.12);
  --nb-shadow-lg:0 14px 40px rgba(15,34,56,.14);
  --nb-card-shadow:var(--nb-shadow-sm);

  /* Space */
  --nb-section:clamp(56px, 4vw + 40px, 104px);
  --nb-gap:20px;
  --nb-maxw:1140px;
  --nb-maxw-narrow:880px;

  --nb-cta-radius:6px;
  --nb-cta-transform:uppercase;
  --nb-cta-tracking:.5px;
}

/* ---- DIRECTION: refined ---- */
[data-direction="refined"]{
  --nb-display-weight:700;
  --nb-display-tracking:-0.018em;
  --nb-h1:clamp(2.4rem, 1.6rem + 2.8vw, 3.6rem);
  --nb-leading:1.75;
  --nb-radius:10px;
  --nb-radius-lg:14px;
  --nb-card-border:1px solid var(--nb-line-soft);
  --nb-card-shadow:0 2px 10px rgba(15,34,56,.05);
  --nb-section:clamp(64px, 5vw + 44px, 128px);
  --nb-cta-radius:8px;
}

/* ---- DIRECTION: modern (gallery-premium) ---- */
[data-direction="modern"]{
  --nb-font-display:'Spectral',Georgia,'Times New Roman',serif;
  --nb-display-weight:600;
  --nb-display-tracking:-0.005em;
  --nb-display-style:normal;
  --nb-h1:clamp(2.7rem, 1.7rem + 3.6vw, 4.4rem);
  --nb-h2:clamp(1.9rem, 1.4rem + 1.6vw, 2.6rem);
  --nb-lede:clamp(1.18rem, 1.05rem + 0.55vw, 1.42rem);
  --nb-leading:1.72;
  --nb-radius:4px;
  --nb-radius-sm:3px;
  --nb-radius-lg:6px;
  --nb-card-border:1px solid var(--nb-line);
  --nb-card-shadow:none;
  --nb-shadow-md:0 10px 30px rgba(15,34,56,.10);
  --nb-section:clamp(72px, 6vw + 48px, 148px);
  --nb-cta-radius:2px;
  --nb-cta-transform:uppercase;
  --nb-cta-tracking:1.5px;
}

/* ============================ BASE ============================ */
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;
  font-family:var(--nb-font-body);
  color:var(--nb-body);
  background:var(--nb-bg);
  font-size:var(--nb-body-size);
  line-height:var(--nb-leading);
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
h1,h2,h3,h4{
  font-family:var(--nb-font-display);
  font-weight:var(--nb-display-weight);
  letter-spacing:var(--nb-display-tracking);
  font-style:var(--nb-display-style);
  color:var(--nb-blue);
  line-height:1.12;
  margin:0;
  text-wrap:balance;
}
h1{font-size:var(--nb-h1)}
h2{font-size:var(--nb-h2)}
h3{font-size:var(--nb-h3);line-height:1.25}
p{margin:0 0 1em;text-wrap:pretty}
a{color:var(--nb-blue);text-decoration:none}
img{max-width:100%;display:block}
strong{color:var(--nb-ink)}

/* ============================ LAYOUT ============================ */
.nb-wrap{max-width:var(--nb-maxw);margin:0 auto;padding:0 24px}
.nb-wrap.narrow{max-width:var(--nb-maxw-narrow)}
.nb-section{padding:var(--nb-section) 0}
.nb-section.soft{background:var(--nb-bg-soft)}
.nb-section.tint{background:var(--nb-blue-tint)}
.nb-section.deep{background:var(--nb-bg-deep);color:#d6dee8}
.nb-section.deep h1,.nb-section.deep h2,.nb-section.deep h3{color:#fff}

.nb-eyebrow{
  display:inline-block;text-transform:uppercase;letter-spacing:2.5px;
  font-size:.78rem;font-weight:700;color:var(--nb-orange);margin:0 0 .8em;
}
.nb-section.deep .nb-eyebrow{color:#7fb0e6}
.nb-lede{font-size:var(--nb-lede);color:var(--nb-muted);line-height:1.65;max-width:60ch}
.nb-section-head{max-width:62ch;margin:0 0 clamp(28px,3vw,48px)}
.nb-section-head.center{margin-left:auto;margin-right:auto;text-align:center}

/* ============================ BUTTONS ============================ */
.nb-btn{
  display:inline-flex;align-items:center;justify-content:center;gap:.5em;
  font-family:var(--nb-font-body);font-weight:700;font-size:1.02rem;
  text-transform:var(--nb-cta-transform);letter-spacing:var(--nb-cta-tracking);
  padding:15px 34px;border-radius:var(--nb-cta-radius);border:2px solid transparent;
  cursor:pointer;transition:background .15s,color .15s,border-color .15s,transform .15s,box-shadow .15s;
  line-height:1;text-align:center;
}
.nb-btn:active{transform:translateY(1px)}
.nb-btn--primary{background:var(--nb-blue);color:#fff;border-color:var(--nb-blue)}
.nb-btn--primary:hover{background:var(--nb-blue-dark);border-color:var(--nb-blue-dark);box-shadow:var(--nb-shadow-md)}
.nb-btn--ghost{background:transparent;color:var(--nb-blue);border-color:var(--nb-blue)}
.nb-btn--ghost:hover{background:var(--nb-blue);color:#fff}
.nb-btn--ondeep{background:#fff;color:var(--nb-blue);border-color:#fff}
.nb-btn--ondeep:hover{background:var(--nb-blue-tint)}
.nb-btn--lg{padding:18px 42px;font-size:1.1rem}
.nb-btn-row{display:flex;flex-wrap:wrap;gap:14px;align-items:center}
.nb-btn-row.center{justify-content:center}
.nb-reassure{color:var(--nb-faint);font-size:.95rem;margin:.2em 0 0}

/* ============================ CARDS ============================ */
.nb-card{
  background:var(--nb-bg);border:var(--nb-card-border);border-radius:var(--nb-radius);
  box-shadow:var(--nb-card-shadow);padding:28px;
}
.nb-grid{display:grid;gap:var(--nb-gap)}
.nb-grid.cols-2{grid-template-columns:repeat(2,1fr)}
.nb-grid.cols-3{grid-template-columns:repeat(3,1fr)}
.nb-grid.cols-4{grid-template-columns:repeat(4,1fr)}

/* ---- Step cards (how-it-works) ---- */
.nb-steps{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
.nb-step{background:var(--nb-bg-soft);border:var(--nb-card-border);border-radius:var(--nb-radius);padding:26px}
.nb-section.deep .nb-step{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.12)}
.nb-step .num{
  display:inline-flex;width:40px;height:40px;align-items:center;justify-content:center;
  background:var(--nb-blue);color:#fff;border-radius:50%;font-weight:900;font-size:1.15rem;margin-bottom:14px;
}
.nb-step h3{margin:0 0 6px}
.nb-step p{margin:0;color:var(--nb-muted);font-size:.98rem}

/* ---- Callout / highlight ---- */
.nb-callout{
  background:var(--nb-blue-tint);border-left:4px solid var(--nb-blue);
  padding:18px 22px;border-radius:var(--nb-radius-sm);line-height:1.6;
}
.nb-callout strong{color:var(--nb-blue)}

/* ---- Checklist ---- */
.nb-check{list-style:none;padding:0;margin:0;display:grid;gap:10px}
.nb-check.two{grid-template-columns:1fr 1fr;gap:10px 36px}
.nb-check li{position:relative;padding-left:30px;color:var(--nb-body)}
.nb-check li::before{
  content:"";position:absolute;left:0;top:.18em;width:19px;height:19px;border-radius:50%;
  background:var(--nb-green-tint);
}
.nb-check li::after{
  content:"\2713";position:absolute;left:4px;top:.05em;color:var(--nb-green);font-weight:900;font-size:.86rem;
}

/* ---- Badges / pills ---- */
.nb-badge{
  display:inline-block;background:var(--nb-blue);color:#fff;font-size:.72rem;font-weight:700;
  text-transform:uppercase;letter-spacing:1px;padding:4px 11px;border-radius:3px;
}
.nb-badge.green{background:var(--nb-green)}
.nb-badge.orange{background:var(--nb-orange)}
.nb-badge.grey{background:#8a94a0}
.nb-pill{
  display:inline-flex;align-items:center;gap:7px;background:var(--nb-green-tint);color:var(--nb-green);
  font-weight:700;font-size:.86rem;padding:6px 14px;border-radius:999px;
}

/* ---- Product-card media (generated by products/render-products.py) ----
   Every product image is normalised to ONE square canvas at build time by
   products/normalize-product-images.py, so the cards are identical no matter how
   the product was photographed (Orion is shot portrait, Polaris landscape —
   both accurate, since the frames rotate). Because the intrinsic sizes now
   match, the browser reserves identical space and nothing shifts as images load.

   The box is square to match. object-fit:CONTAIN, never cover — cropping a
   product shot cuts off the frame's edge, which is the one thing the photograph
   exists to show. The orientation modifier is kept as a hook but both variants
   are deliberately identical; sizing is the normaliser's job, not CSS's. */
.nb-media--portrait,
.nb-media--landscape{
  display:flex;align-items:center;justify-content:center;
  /* 4:3, not square — the image area is the card's dominant dimension, so this
     is where a "make the cards smaller" instruction actually lands: 25% less
     height for the same width. The normalised assets are square and `contain`,
     so they simply sit smaller with side margin; nothing crops. */
  aspect-ratio:4/3;background:#fff;padding:8px;
}
.nb-media--portrait img,
.nb-media--landscape img{
  width:100%;height:100%;object-fit:contain;display:block;
}

/* Non-interactive CTA for out-of-stock / coming-soon cards. Rendered as a
   <span>, not a disabled <button>, so it is never focusable or clickable —
   a greyed button that still submits is worse than no button. */
.nb-btn--disabled{
  background:transparent;color:#8a94a0;border-color:var(--nb-line);
  cursor:default;pointer-events:none;
}

/* ---- Alternating image/text story rows (How It Works, and reusable) ----
   The flip is an EXPLICIT modifier rather than :nth-of-type, so inserting or
   reordering a step can't silently invert every row below it. */
.nb-story{
  display:grid;grid-template-columns:1fr 1fr;
  gap:clamp(28px,4vw,56px);align-items:center;
}
.nb-story + .nb-story{margin-top:clamp(48px,6vw,88px)}
.nb-story--flip .nb-story-media{order:2}
.nb-story-media img{
  width:100%;height:auto;display:block;border-radius:var(--nb-radius);
}
.nb-story .num{
  display:inline-flex;align-items:center;justify-content:center;
  width:34px;height:34px;border-radius:999px;background:var(--nb-blue);color:#fff;
  font-weight:800;font-size:.95rem;margin-bottom:14px;
}
@media(max-width:860px){
  .nb-story{grid-template-columns:1fr;gap:24px}
  /* Reset the flip when stacked, or a flipped row puts its image BELOW the text
     while its neighbours put it above — inconsistent reading order on mobile. */
  .nb-story--flip .nb-story-media{order:0}
}

/* ============================ MEDIA PLACEHOLDERS ============================ */
.nb-media{
  position:relative;border-radius:var(--nb-radius);overflow:hidden;background:var(--nb-bg-soft);
  border:var(--nb-card-border);
}
.nb-ph{
  position:relative;display:flex;align-items:center;justify-content:center;
  min-height:300px;color:#8a94a0;
  background:
    repeating-linear-gradient(135deg,#eef1f4 0 14px,#f6f8fa 14px 28px);
}
.nb-ph span{
  font-family:ui-monospace,'SF Mono',Menlo,Consolas,monospace;font-size:.82rem;letter-spacing:.04em;
  background:rgba(255,255,255,.82);padding:7px 13px;border-radius:5px;border:1px solid var(--nb-line);
  color:#5a6571;text-align:center;
}
.nb-ph.tall{min-height:440px}
.nb-ph.wide{aspect-ratio:16/10;min-height:0}
.nb-ph.square{aspect-ratio:1/1;min-height:0}

/* product video tile */
.nb-video{width:100%;border-radius:var(--nb-radius);display:block;background:#000}

/* ============================ HERO ============================ */
.nb-hero--a{display:block}

.nb-hero{padding:clamp(48px,5vw,90px) 0 clamp(40px,4vw,72px)}
.nb-hero .nb-h1-xl{font-size:var(--nb-h1)}

/* hero A: split */
.nb-hero--a .split{display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(28px,4vw,64px);align-items:center}
.nb-hero--a .copy h1{margin-bottom:.28em}

/* hero B: centered */
.nb-hero--b{text-align:center}
.nb-hero--b .copy{max-width:54ch;margin:0 auto}
.nb-hero--b .nb-lede{margin-left:auto;margin-right:auto}
.nb-hero--b .nb-media{margin-top:clamp(28px,4vw,52px)}

/* hero C: full-bleed deep band */
/* ---- FULL-BLEED hero (Tom 2026-07-31), mirroring the ORIGINAL site's top section:
   edge-to-edge animation behind the copy, white diagonal gradient over it so the
   dark type stays readable. Gradient stops copied from the old Divi rule
   (linear-gradient(127deg,#fff 36%,transparent 100%)). Layering uses positive
   z-index on the content rather than negative on the background, so the hero does
   not slide underneath the sticky header. ---- */
.nb-hero--bleed{position:relative;padding:0;overflow:hidden;isolation:isolate}
.nb-hero--bleed::after{display:none}          /* kill the .nb-hero--a splatter here */
.nb-hero--bleed .nb-hero-bg{position:absolute;inset:0}
.nb-hero--bleed .nb-hero-bg img{width:100%;height:100%;object-fit:cover;display:block;border:0;border-radius:0}
.nb-hero--bleed .nb-hero-veil{position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(127deg,#ffffff 36%,rgba(255,255,255,0) 100%)}
.nb-hero--bleed .nb-wrap{position:relative;z-index:1;
  padding-top:clamp(56px,7vw,120px);padding-bottom:clamp(56px,7vw,120px)}
.nb-hero--bleed .copy{max-width:58ch}
/* Tighten the hero -> next-section gap by 30% (Tom 2026-07-31). Measured at 1440px:
   72px hero padding-bottom + 81px section padding-top = 153px, cut to ~107px. Both
   sides are scaled by 0.7 rather than pinned to px so the reduction holds at every
   width. Scoped to the section DIRECTLY after the bleed hero — --nb-section is the
   sitewide rhythm token and every other band still uses it unchanged. */
.nb-hero--bleed .nb-wrap{padding-bottom:clamp(39px,4.9vw,84px)}
.nb-hero--bleed + .nb-section{padding-top:calc(var(--nb-section) * .7)}
/* Narrow screens: the gradient is diagonal, so on a 1fr layout the copy can drift over
   the uncovered corner. Go to a top-down wash with more coverage instead of hiding the
   animation entirely. */
@media(max-width:820px){
  .nb-hero--bleed .nb-hero-veil{
    background:linear-gradient(180deg,rgba(255,255,255,.96) 55%,rgba(255,255,255,.72) 100%)}
  .nb-hero--bleed .copy{max-width:none}
}

.nb-hero--c{background:var(--nb-bg-deep);color:#cdd8e4;padding:0}
.nb-hero--c .inner{position:relative;display:grid;grid-template-columns:1.1fr .9fr;gap:48px;align-items:center;
  padding:clamp(56px,6vw,110px) 0}
.nb-hero--c h1{color:#fff}
.nb-hero--c .nb-lede{color:#aebccb}
.nb-hero--c .nb-eyebrow{color:#7fb0e6}
.nb-hero--c .nb-media{border-color:rgba(255,255,255,.14);background:rgba(255,255,255,.03)}
.nb-hero--c .nb-ph{background:repeating-linear-gradient(135deg,#15314f 0 14px,#1b3a5c 14px 28px);color:#9fb4ca}
.nb-hero--c .nb-ph span{background:rgba(15,34,56,.7);border-color:rgba(255,255,255,.16);color:#bcccdc}

/* ============================ COMPARE (Mini vs Full / Orion vs Polaris) ============================ */
/* auto-fit, NOT a hardcoded 3 — the card count is data now (products.json), so
   pinning the column count would break the day a fourth frame ships or Rigel is
   held back. Three cards give three columns, two give two, and it wraps on
   narrow screens without a media query. min() keeps a single card from
   overflowing a phone viewport at the 270px floor. */
.nb-compare{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,270px),1fr));gap:20px}
.nb-pricecard{
  background:var(--nb-bg);border:var(--nb-card-border);border-radius:var(--nb-radius);
  box-shadow:var(--nb-card-shadow);padding:clamp(15px,1.7vw,22px);display:flex;flex-direction:column;
}
.nb-pricecard.featured{border:2px solid var(--nb-blue);box-shadow:var(--nb-shadow-md)}
/* Scaled with clamp() rather than reduced outright: at two-up the card is still
   as generous as it was, and it only tightens as the column narrows toward
   three-up. A flat size drop would have cost the two-card pages for nothing. */
.nb-pricecard h3{font-size:clamp(1.05rem,1.2vw,1.2rem);margin:0 0 2px}
.nb-pricecard .cap{color:var(--nb-muted);font-size:clamp(.8rem,.85vw,.84rem);margin:0 0 10px}
.nb-pricecard .price{font-size:clamp(1.45rem,1.95vw,1.95rem);font-weight:900;color:var(--nb-ink);font-family:var(--nb-font-body);line-height:1}
.nb-pricecard .price small{font-size:.95rem;color:var(--nb-faint);font-weight:400}
.nb-pricecard .nb-btn{margin-top:auto}
.nb-pricecard ul{margin:12px 0 16px;padding:0;list-style:none;display:grid;gap:7px}
.nb-pricecard ul li{position:relative;padding-left:22px;font-size:.86rem;color:var(--nb-body)}

/* ---- Technical details (generated; /frames/ and /meural/ only) ----
   A <details open> rather than a plain block: open by default because someone on
   the product page is explicitly looking for specs and should not have to hunt,
   but collapsible so a long list doesn't push the Buy button off-screen once a
   visitor has read it. Kept visually quieter than the sales bullets so the two
   lists don't compete. */
.nb-specs{
  margin:2px 0 18px;border-top:1px solid var(--nb-line);padding-top:12px;
}
.nb-specs summary{
  cursor:pointer;list-style:none;font-weight:700;font-size:.78rem;
  text-transform:uppercase;letter-spacing:.06em;color:var(--nb-muted);
  display:flex;align-items:center;gap:6px;
}
.nb-specs summary::-webkit-details-marker{display:none}
.nb-specs summary::after{
  content:"";width:7px;height:7px;border-right:2px solid currentColor;
  border-bottom:2px solid currentColor;transform:rotate(45deg);margin-left:auto;
  transition:transform .15s ease;
}
.nb-specs[open] summary::after{transform:rotate(-135deg)}
/* list-style:none is REQUIRED here, not cosmetic: the li carries a ::before
   checkmark, so without it the browser's own disc renders too and every line
   gets TWO markers. It went unnoticed while .nb-specs was only ever used INSIDE
   .nb-pricecard, which kills list-style itself (line 393) and was masking this.
   The first standalone use (the 4K Mini page, 2026-08-10) exposed it. No-op in
   the pricecard case. */
.nb-specs ul{margin:12px 0 2px;padding-left:0;list-style:none}
.nb-specs ul li{font-size:.82rem;color:var(--nb-muted);padding-left:20px}
.nb-specs ul li::before{content:"\2713";color:var(--nb-blue);font-weight:900}
.nb-pricecard ul li::before{content:"\2713";position:absolute;left:0;color:var(--nb-green);font-weight:900}

/* ============================ FAQ ============================ */
.nb-faq{max-width:var(--nb-maxw-narrow);margin:0 auto;display:grid;gap:0}
.nb-faq details{border-bottom:1px solid var(--nb-line);padding:6px 0}
.nb-faq summary{
  cursor:pointer;list-style:none;padding:18px 40px 18px 2px;font-weight:700;color:var(--nb-ink);
  font-size:1.08rem;position:relative;
}
.nb-faq summary::-webkit-details-marker{display:none}
.nb-faq summary::after{
  content:"+";position:absolute;right:6px;top:50%;transform:translateY(-50%);
  color:var(--nb-blue);font-size:1.5rem;font-weight:400;transition:transform .2s;
}
.nb-faq details[open] summary::after{transform:translateY(-50%) rotate(45deg)}
.nb-faq .ans{padding:0 40px 20px 2px;color:var(--nb-muted);margin:0}

/* ============================ TRUST BAND ============================ */
.nb-trust{display:grid;grid-template-columns:repeat(3,1fr);gap:24px;text-align:center}
.nb-trust .item h3{font-size:1.15rem;margin:0 0 4px}
.nb-trust .item p{color:var(--nb-muted);font-size:.97rem;margin:0}
.nb-trust .ic{
  width:46px;height:46px;margin:0 auto 14px;border-radius:50%;background:var(--nb-blue-tint);
  display:flex;align-items:center;justify-content:center;color:var(--nb-blue);
}

/* ============================ RESPONSIVE ============================ */
@media(max-width:900px){
  .nb-hero--a .split,.nb-hero--c .inner{grid-template-columns:1fr;gap:32px}
  .nb-grid.cols-3,.nb-grid.cols-4,.nb-steps,.nb-trust{grid-template-columns:1fr 1fr}
  /* .nb-compare deliberately NOT overridden here. It was `1fr` when the grid was
     a hardcoded two columns and needed forcing to stack. It is now auto-fit, so
     it already reflows on its own — and this rule would make it WORSE, dropping
     to a single column at 900px where two still fit comfortably. */
}
@media(max-width:620px){
  .nb-grid.cols-2,.nb-grid.cols-3,.nb-grid.cols-4,.nb-steps,.nb-trust,.nb-check.two{grid-template-columns:1fr}
}

/* reduced motion */
@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}

/* ===== chrome ===== */
/* ============================================================================
   NIMBUS CHROME — site header, navigation, footer.
   Modeled on the live nimbusframe theme but de-Woo'd:
   no cart counter, no "Shop Now"; account/billing point to nimbusframe.net.
   ============================================================================ */

/* ---- Utility bar ---- */
.nbk-util{background:var(--nb-blue);color:#cfe0f2;font-size:.86rem}
.nbk-util .inner{
  max-width:var(--nb-maxw);margin:0 auto;padding:7px 24px;
  display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
}
.nbk-util a{color:#fff}
.nbk-util a:hover{color:#cfe0f2}
.nbk-util .left{display:flex;gap:20px;align-items:center;flex-wrap:wrap}
.nbk-util .right{display:flex;gap:20px;align-items:center}
.nbk-util .sep{opacity:.4}

/* ---- Header ---- */
.nbk-head{position:sticky;top:0;z-index:50;background:rgba(255,255,255,.96);backdrop-filter:saturate(140%) blur(8px);
  border-bottom:1px solid var(--nb-line)}
.nbk-head .inner{
  max-width:var(--nb-maxw);margin:0 auto;padding:14px 24px;
  display:flex;align-items:center;justify-content:space-between;gap:24px;
}
.nbk-logo{display:flex;align-items:center;gap:10px;flex:0 0 auto}
.nbk-logo img{height:42px;width:auto}
.nbk-logo .wordmark{font-family:var(--nb-font-display);font-weight:var(--nb-display-weight);
  color:var(--nb-blue);font-size:1.5rem;letter-spacing:-.01em}
.nbk-logo .wordmark small{display:block;font-family:var(--nb-font-body);font-weight:400;
  font-size:.6rem;letter-spacing:3px;text-transform:uppercase;color:var(--nb-faint)}

.nbk-nav{display:flex;align-items:center;gap:26px;flex-wrap:wrap}
.nbk-nav a{color:var(--nb-ink);font-weight:700;font-size:.96rem}
.nbk-nav a:hover{color:var(--nb-blue)}
.nbk-nav a.active{color:var(--nb-blue);position:relative}
.nbk-nav a.active::after{content:"";position:absolute;left:0;right:0;bottom:-6px;height:2px;background:var(--nb-blue)}
.nbk-head .nb-btn{padding:11px 22px;font-size:.9rem}
/* The .nbk-nav a rule above (0,1,1) out-specifies .nb-btn--primary (0,1,0) and was
   forcing --nb-ink onto the nav CTA — dark navy text on a dark navy button, near
   invisible (Tom 2026-07-31). Restore the button's own colours inside the nav. */
.nbk-nav a.nb-btn--primary{color:#fff}
.nbk-nav a.nb-btn--primary:hover{color:#fff}
.nbk-nav a.nb-btn--ghost{color:var(--nb-blue)}
.nbk-nav a.nb-btn--ghost:hover{color:#fff}

.nbk-burger{display:none;background:none;border:0;cursor:pointer;padding:8px;color:var(--nb-ink)}
.nbk-burger svg{width:26px;height:26px}

@media(max-width:1040px){
  .nbk-nav{gap:18px}
  .nbk-nav a{font-size:.9rem}
}
@media(max-width:880px){
  .nbk-nav{
    display:none;position:absolute;top:100%;left:0;right:0;background:#fff;border-bottom:1px solid var(--nb-line);
    flex-direction:column;align-items:stretch;gap:0;padding:8px 0;box-shadow:var(--nb-shadow-lg)
  }
  .nbk-nav.open{display:flex}
  .nbk-nav a{padding:13px 24px;border-bottom:1px solid var(--nb-line-soft)}
  .nbk-nav a.active::after{display:none}
  .nbk-nav .nb-btn{margin:12px 24px}
  .nbk-burger{display:inline-flex}
  .nbk-head .inner{position:relative}
}

/* ---- Footer ---- */
.nbk-foot{background:var(--nb-bg-deep);color:#9fb0c2;padding:clamp(48px,5vw,72px) 0 28px;font-size:.95rem}
.nbk-foot a{color:#c7d4e2}
.nbk-foot a:hover{color:#fff}
.nbk-foot .cols{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:36px}
.nbk-foot h4{color:#fff;font-size:.82rem;text-transform:uppercase;letter-spacing:1.6px;margin:0 0 14px;
  font-family:var(--nb-font-body);font-weight:700}
.nbk-foot ul{list-style:none;padding:0;margin:0;display:grid;gap:9px}
/* The monogram is a NAVY square with white negative-space marks (Tom 2026-07-31,
   reverting to the older mark). On the white header that reads perfectly; on
   --nb-bg-deep it is navy-on-navy and all but disappears — rendered and compared
   before choosing. So the footer sets it on a white chip, which is also how it
   reads in the header. Do NOT "simplify" this to a bare img on the dark footer. */
.nbk-foot .brandcol img{height:40px;margin-bottom:14px;
  background:#fff;border-radius:8px;padding:6px;box-sizing:content-box}
.nbk-foot .brandcol .wordmark{font-family:var(--nb-font-display);color:#fff;font-size:1.4rem;font-weight:var(--nb-display-weight)}
.nbk-foot .brandcol p{color:#8ea0b3;max-width:30ch}
.nbk-foot .social{display:flex;gap:12px;margin-top:8px}
.nbk-foot .social a{width:38px;height:38px;border-radius:50%;background:rgba(255,255,255,.08);
  display:flex;align-items:center;justify-content:center}
.nbk-foot .social a:hover{background:var(--nb-blue)}
.nbk-foot .social svg{width:18px;height:18px;fill:#cdd8e4}
.nbk-foot .social a:hover svg{fill:#fff}
.nbk-foot .bottom{
  margin-top:40px;padding-top:22px;border-top:1px solid rgba(255,255,255,.1);
  display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;color:#6f8295;font-size:.86rem;
}
.nbk-foot .bottom .badge30{display:flex;align-items:center;gap:10px;color:#9fb0c2}
.nbk-foot .bottom .badge30 .ring{width:40px;height:40px;border-radius:50%;border:2px solid var(--nb-green);
  color:#7fd3a3;display:flex;align-items:center;justify-content:center;font-weight:900;font-size:.62rem;text-align:center;line-height:1}
@media(max-width:820px){.nbk-foot .cols{grid-template-columns:1fr 1fr}}
@media(max-width:520px){.nbk-foot .cols{grid-template-columns:1fr}}

/* ============================================================
   CART — sitewide mini-cart (header button + slide-in drawer).
   Commerce, Option A (client-side localStorage cart). Built from the
   nimbus design tokens so it reads as one system with the rest of the site.
   Markup + behaviour: claude-design-output/_cart.html.
   ============================================================ */

/* header cart button — grouped on the right with the nav; count badge hides at 0 */
.nbk-logo{margin-right:auto}                 /* pull the nav + cart to the right edge */
.nbk-cart{order:1;position:relative;display:inline-flex;align-items:center;justify-content:center;
  width:44px;height:44px;flex:0 0 auto;border:0;background:transparent;color:var(--nb-ink);
  border-radius:var(--nb-radius-sm);cursor:pointer;-webkit-appearance:none;appearance:none;
  transition:background .15s,color .15s}
.nbk-cart:hover{background:var(--nb-blue-tint);color:var(--nb-blue)}
.nbk-cart:focus-visible{outline:2px solid var(--nb-blue);outline-offset:2px}
.nbk-cart svg{width:23px;height:23px;stroke:currentColor;fill:none;stroke-width:1.8;
  stroke-linecap:round;stroke-linejoin:round}
.nbk-cart-count{position:absolute;top:3px;right:2px;min-width:18px;height:18px;padding:0 5px;
  display:none;align-items:center;justify-content:center;border-radius:9px;
  background:var(--nb-blue);color:#fff;font:700 11px/1 var(--nb-font-body);
  box-shadow:0 0 0 2px var(--nb-bg)}
.nbk-cart:not([data-count="0"]) .nbk-cart-count{display:inline-flex}
@keyframes nbk-bump{0%{transform:scale(1)}40%{transform:scale(1.35)}100%{transform:scale(1)}}
.nbk-cart-count.bump{animation:nbk-bump .35s ease}
.nbk-burger{order:2}

/* buttons on product cards that add to the cart — reset the <button> so nb-btn styling
   lands identically to the old <a class="nb-btn"> it replaced */
.nbk-add{-webkit-appearance:none;appearance:none;border:0;font:inherit;cursor:pointer}

/* scrim behind the drawer */
.nbk-cart-scrim{position:fixed;inset:0;z-index:90;background:rgba(15,34,56,.42);
  opacity:0;pointer-events:none;transition:opacity .28s ease}
body.nbk-cart-open .nbk-cart-scrim{opacity:1;pointer-events:auto}

/* the drawer */
.nbk-cart-panel{position:fixed;top:0;right:0;z-index:100;height:100%;width:min(410px,100%);
  display:flex;flex-direction:column;background:var(--nb-bg);box-shadow:var(--nb-shadow-lg);
  transform:translateX(100%);transition:transform .32s cubic-bezier(.4,0,.2,1);will-change:transform}
body.nbk-cart-open .nbk-cart-panel{transform:translateX(0)}

.nbk-cart-head{display:flex;align-items:center;justify-content:space-between;
  padding:20px 22px;border-bottom:1px solid var(--nb-line)}
.nbk-cart-head h2{margin:0;font-family:var(--nb-font-display);font-weight:var(--nb-display-weight);
  letter-spacing:var(--nb-display-tracking);font-size:1.15rem;color:var(--nb-ink)}
.nbk-cart-close{width:36px;height:36px;border:0;background:transparent;color:var(--nb-muted);
  border-radius:var(--nb-radius-sm);cursor:pointer;font-size:24px;line-height:1;
  display:flex;align-items:center;justify-content:center;transition:background .15s,color .15s}
.nbk-cart-close:hover{background:var(--nb-bg-soft);color:var(--nb-ink)}

.nbk-cart-body{flex:1 1 auto;overflow-y:auto;padding:4px 22px}
.nbk-cart-empty{padding:64px 10px;text-align:center;color:var(--nb-muted);font-size:.98rem}
.nbk-cart-empty svg{width:46px;height:46px;stroke:var(--nb-faint);fill:none;stroke-width:1.4;
  stroke-linecap:round;stroke-linejoin:round;margin-bottom:14px}
.nbk-cart-empty p{margin:0}

/* a cart line */
.nbk-ci{display:grid;grid-template-columns:64px 1fr auto;gap:14px;align-items:start;
  padding:16px 0;border-bottom:1px solid var(--nb-line-soft)}
.nbk-ci-thumb{width:64px;height:64px;border-radius:var(--nb-radius-sm);overflow:hidden;
  background:var(--nb-bg-soft);display:flex;align-items:center;justify-content:center}
.nbk-ci-thumb img{width:100%;height:100%;object-fit:cover}
.nbk-ci-name{margin:0 0 4px;font-weight:700;font-size:.98rem;color:var(--nb-ink);line-height:1.3}
.nbk-ci-price{font-size:.88rem;color:var(--nb-muted)}
.nbk-ci-right{display:flex;flex-direction:column;align-items:flex-end;gap:10px}
.nbk-ci-line{font-weight:700;color:var(--nb-ink);font-size:.98rem}
.nbk-qty{display:inline-flex;align-items:center;border:1px solid var(--nb-line);border-radius:var(--nb-radius-sm)}
.nbk-qty button{width:28px;height:28px;border:0;background:transparent;color:var(--nb-blue);
  font-size:16px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}
.nbk-qty button:hover{background:var(--nb-blue-tint)}
.nbk-qty span{min-width:26px;text-align:center;font-weight:700;font-size:.9rem;color:var(--nb-ink)}
.nbk-ci-remove{margin-top:6px;border:0;background:transparent;color:var(--nb-faint);font-size:.8rem;
  cursor:pointer;padding:0;text-decoration:underline;text-underline-offset:2px}
.nbk-ci-remove:hover{color:var(--nb-orange)}

/* drawer footer: subtotal + CTA */
.nbk-cart-foot{border-top:1px solid var(--nb-line);padding:18px 22px 22px;background:var(--nb-bg)}
.nbk-cart-foot[hidden]{display:none}
.nbk-cart-sub{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:12px}
.nbk-cart-sub .l{color:var(--nb-body);font-size:.98rem}
.nbk-cart-sub .v{font-family:var(--nb-font-display);font-weight:var(--nb-display-weight);
  font-size:1.35rem;color:var(--nb-ink)}
.nbk-cart-note{font-size:.78rem;color:var(--nb-muted);margin:0 0 14px;line-height:1.5}
.nbk-cart-go{display:block;width:100%;text-align:center;padding:14px 20px;border:0;cursor:pointer;
  background:var(--nb-blue);color:#fff;border-radius:var(--nb-cta-radius);
  font:700 .95rem/1 var(--nb-font-body);text-transform:var(--nb-cta-transform);
  letter-spacing:var(--nb-cta-tracking);transition:background .15s}
.nbk-cart-go:hover{background:var(--nb-blue-dark)}
.nbk-cart-keep{display:block;width:100%;text-align:center;margin-top:10px;padding:8px;
  background:transparent;border:0;color:var(--nb-blue);cursor:pointer;font-size:.9rem;
  text-decoration:underline;text-underline-offset:2px}

@media(prefers-reduced-motion:reduce){
  .nbk-cart-panel,.nbk-cart-scrim,.nbk-cart-count{transition:none;animation:none}
}

/* editorial placeholder — a spot where Tom/DeeAnn drop in brand voice. Deliberately
   LOUD (amber dashed) so a draft can never ship unnoticed. Grep "nb-voice-todo" or
   "VOICE:" to find every one. Remove the class once the copy is final. */
.nb-voice-todo{display:block;margin:.7em 0;padding:11px 15px;
  border:1.5px dashed var(--nb-orange);border-radius:var(--nb-radius-sm);
  background:var(--nb-orange-tint);color:#8a4a1e;font-size:.9rem;line-height:1.5;text-align:left}
.nb-voice-todo b{color:var(--nb-orange);text-transform:uppercase;letter-spacing:.4px;font-size:.82em}
.nb-voice-todo em{color:#6b7480;font-style:italic}

/* ============================================================
   SHARED CART CONTROLS — owned by wordpress-team, consumed by billing's
   BuyCart.aspx so the checkout page matches the marketing site by construction
   (design-cohesion contract, 2026-08-11). Built from the nimbus tokens. Markup
   contract lives in the message to billing-team; keep class names stable.
   ============================================================ */

/* (a) TIER SELECTOR — selectable "plan cards" (radio group).
   <fieldset class="nb-tier-select">
     <label class="nb-tier"><input type="radio" name="tier" value="starter">
       <span class="nb-tier-card"><span class="nb-tier-name">Starter</span>
         <span class="nb-tier-price">$40<small>/yr</small></span>
         <span class="nb-tier-desc">100 photos</span></span></label> … */
.nb-tier-select{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;border:0;padding:0;margin:0}
.nb-tier{position:relative;display:block;cursor:pointer}
.nb-tier input{position:absolute;opacity:0;width:0;height:0}
.nb-tier-card{display:flex;flex-direction:column;gap:2px;height:100%;padding:16px 16px 18px;
  border:1.5px solid var(--nb-line);border-radius:var(--nb-radius);background:var(--nb-bg);
  transition:border-color .15s,box-shadow .15s;position:relative}
.nb-tier:hover .nb-tier-card{border-color:var(--nb-blue-tint)}
.nb-tier input:focus-visible+.nb-tier-card{outline:2px solid var(--nb-blue);outline-offset:2px}
.nb-tier input:checked+.nb-tier-card{border-color:var(--nb-blue);box-shadow:0 0 0 1px var(--nb-blue)}
.nb-tier-card::after{content:"";position:absolute;top:12px;right:12px;width:18px;height:18px;border-radius:50%;
  border:1.5px solid var(--nb-line);background:var(--nb-bg);transition:background .15s,border-color .15s}
.nb-tier input:checked+.nb-tier-card::after{border-color:var(--nb-blue);
  background:var(--nb-blue) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E") center/12px no-repeat}
.nb-tier-name{font-weight:700;color:var(--nb-ink);font-size:.95rem;padding-right:24px}
.nb-tier-price{font-family:var(--nb-font-display);font-weight:var(--nb-display-weight);font-size:1.5rem;color:var(--nb-ink)}
.nb-tier-price small{font-size:.5em;color:var(--nb-faint);font-weight:400}
.nb-tier-desc{font-size:.82rem;color:var(--nb-muted)}

/* (b) PERIOD TOGGLE — annual/monthly segmented control.
   <div class="nb-seg" role="radiogroup" aria-label="Billing period">
     <label class="nb-seg-opt"><input type="radio" name="period" value="annual" checked><span>Annual</span></label>
     <label class="nb-seg-opt"><input type="radio" name="period" value="monthly"><span>Monthly</span></label></div> */
.nb-seg{display:inline-flex;padding:3px;gap:3px;background:var(--nb-bg-soft);border:1px solid var(--nb-line);
  border-radius:999px}
.nb-seg-opt{position:relative;cursor:pointer}
.nb-seg-opt input{position:absolute;opacity:0;width:0;height:0}
.nb-seg-opt span{display:block;padding:8px 18px;border-radius:999px;font-weight:700;font-size:.88rem;
  color:var(--nb-muted);transition:background .15s,color .15s;white-space:nowrap}
.nb-seg-opt input:checked+span{background:var(--nb-blue);color:#fff}
.nb-seg-opt input:focus-visible+span{outline:2px solid var(--nb-blue);outline-offset:2px}

/* (c) SELECT FIELD — ship-region and any other dropdown.
   <label class="nb-field"><span class="nb-field-label">Ship to</span>
     <select class="nb-select"><option>United States</option>…</select></label> */
.nb-field{display:block}
.nb-field-label{display:block;font-weight:700;font-size:.82rem;color:var(--nb-ink);margin-bottom:6px}
.nb-select{-webkit-appearance:none;appearance:none;width:100%;padding:11px 40px 11px 14px;font:inherit;
  font-size:.95rem;color:var(--nb-ink);background:var(--nb-bg);border:1.5px solid var(--nb-line);
  border-radius:var(--nb-radius-sm);cursor:pointer;line-height:1.3;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236b7480' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;background-size:18px}
.nb-select:hover{border-color:var(--nb-muted)}
.nb-select:focus-visible{outline:0;border-color:var(--nb-blue);box-shadow:0 0 0 3px var(--nb-blue-tint)}


/* ---- static-site additions (no Divi scoping needed) ---- */
.nb-shot{display:block;width:100%;border-radius:12px;object-fit:cover;
  box-shadow:0 14px 36px rgba(10,37,69,.20);background:var(--nb-bg-soft)}
.nb-shot.tall{height:440px}
.nb-shot.wide{aspect-ratio:16/10}
.nb-shot.square{aspect-ratio:1/1}
/* studio frame shots on white: show the whole frame, don't cover-crop it */
.nb-shot.nb-shot--contain{object-fit:contain;background:#fff}
/* ghost (outline) buttons on DARK sections/hero: the default blue text+border was
   near-invisible on the navy background — looked like an unreadable blue-on-blue
   button (Tom 2026-06-23). Give them a white outline + white text, with an inverted
   white-fill hover. Scoped to dark contexts so light-section ghosts stay blue. */
.nb-section.deep .nb-btn--ghost,.nb-hero--c .nb-btn--ghost{
  color:#fff;border-color:rgba(255,255,255,.65)}
.nb-section.deep .nb-btn--ghost:hover,.nb-hero--c .nb-btn--ghost:hover{
  background:#fff;color:var(--nb-blue);border-color:#fff}
@media(max-width:700px){.nb-shot.tall{height:320px}}
.nbk-splotch-div{text-align:center;line-height:0;margin:6px 0 -10px}
.nbk-splotch-div img{display:inline-block;width:42%;max-width:240px;opacity:.5;margin:0 auto}
.nb-section-head.center h2{position:relative;padding-bottom:20px}
.nb-section-head.center h2::after{content:"";position:absolute;left:50%;bottom:0;transform:translateX(-50%);
  width:132px;height:14px;opacity:.55;pointer-events:none;
  background:url(/wp-content/uploads/2021/09/Paint-sploch-3.png) no-repeat center/contain}
.nb-section.deep .nb-section-head.center h2::after{opacity:.8}

/* ---- painterly paint-splatter accents (restored from the original Divi site;
   Tom 2026-06-23 — "my wife likes those spatters"). Brand-blue watercolor blob
   (Paint-sploch-1) + droplet band (Paint-sploch-3), faint and BEHIND content so
   text stays legible. Light sections only — dark `deep` sections would swallow
   the blue paint. overflow:hidden clips the off-edge blobs so they never add a
   horizontal scrollbar; .nb-wrap is lifted above the splatter layer. ---- */
.nb-hero,.nb-section{position:relative;overflow:hidden}
.nb-hero>.nb-wrap,.nb-section>.nb-wrap{position:relative;z-index:1}
/* hero: big soft blob, top-right */
.nb-hero--a::after{content:"";position:absolute;pointer-events:none;z-index:0;
  top:-90px;right:-90px;width:min(48vw,540px);height:min(60vw,690px);opacity:.18;
  background:url(/wp-content/uploads/2021/09/Paint-sploch-1.png) no-repeat top right/contain;
  transform:rotate(6deg)}
/* alternating blob accents on the light marketing sections (one asset, flipped/
   rotated for organic variety) */
.nb-section:not(.deep)::before{content:"";position:absolute;pointer-events:none;z-index:0;
  width:min(36vw,420px);height:min(46vw,540px);opacity:.12;
  background:url(/wp-content/uploads/2021/09/Paint-sploch-1.png) no-repeat center/contain}
.nb-section:not(.deep):nth-of-type(odd)::before{top:-80px;left:-100px;transform:rotate(-14deg) scaleX(-1)}
.nb-section:not(.deep):nth-of-type(even)::before{bottom:-90px;right:-90px;transform:rotate(12deg)}
/* droplet band as a soft top-edge accent on tinted/soft sections */
.nb-section.soft::after,.nb-section.tint::after{content:"";position:absolute;pointer-events:none;z-index:0;
  top:0;left:0;right:0;height:120px;opacity:.55;
  background:url(/wp-content/uploads/2021/09/Paint-sploch-3.png) no-repeat center top/120% auto}
