/*
Theme Name: Aether Laboratories
Theme URI: https://aetherlaboratories.com
Author: Aether Laboratories
Description: Sterile-instrument design system for the Aether Laboratories research-peptide storefront. Hairline borders, corner registration marks, document-reference stamp convention, royal-blue accent.
Version: 1.0.0
Requires PHP: 7.4
Text Domain: aether-labs
*/

/* ---------- fonts ---------- */
/* Archivo ships as a variable font: one file covers the full 400-900 weight axis. */
@font-face{
  font-family:'Archivo';font-style:normal;font-weight:400 900;font-display:swap;
  src:url('fonts/archivo-variable.woff2') format('woff2');
}
@font-face{
  font-family:'Plex Mono';font-style:normal;font-weight:400;font-display:swap;
  src:url('fonts/plexmono-400.woff2') format('woff2');
}
@font-face{
  font-family:'Plex Mono';font-style:normal;font-weight:500;font-display:swap;
  src:url('fonts/plexmono-500.woff2') format('woff2');
}
@font-face{
  font-family:'Plex Mono';font-style:normal;font-weight:600;font-display:swap;
  src:url('fonts/plexmono-600.woff2') format('woff2');
}

/* Deliberately single-theme: an exact clinical-white spec, not adapted to system dark mode. */
:root{
  --white:#FFFFFF;
  --ink:#1A1A1A;
  --line:#64748B;
  --line-faint:#D7DBE1;
  --blue:#0043F0;
  --hair:0.5px;
  --edge:56px;
  --maxw:1560px;
}

*{box-sizing:border-box;}
html,body{margin:0;padding:0;}
/* WooCommerce's own quantity-input template (woocommerce_quantity_input())
   renders a "<label class='screen-reader-text'>Product Name quantity</label>"
   right before every qty field -- meant to be invisible, read only by screen
   readers. That only works because WooCommerce's default stylesheet defines
   this class; this theme deliberately dequeues that stylesheet (see
   aether_dequeue_wc_styles in functions.php) and never defined its own
   copy, so the label rendered as plain visible text jammed into the
   qty-stepper on every buy-box. This is WordPress core's own canonical
   definition, not a guess. */
.screen-reader-text{
  border:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;
  overflow:hidden;padding:0;position:absolute !important;width:1px;word-wrap:normal !important;
}
body{
  background:#FAF9F6;
  color:var(--ink);
  font-family:'Archivo',-apple-system,sans-serif;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
::selection{background:var(--blue);color:var(--white);}
a{color:inherit;text-decoration:none;}
button{font-family:inherit;}
h1,h2,h3,p{margin:0;}
.mono{font-family:'Plex Mono',ui-monospace,monospace;}
a:focus-visible,button:focus-visible{outline:2px solid var(--blue);outline-offset:3px;}
img{max-width:100%;display:block;}

.page-frame{
  max-width:var(--maxw);margin:0 auto;position:relative;
  border-left:var(--hair) solid var(--ink);
  border-right:var(--hair) solid var(--ink);
}
.reg{position:absolute;width:9px;height:9px;pointer-events:none;z-index:5;}
.reg.tl{top:-1px;left:-1px;border-top:1px solid var(--ink);border-left:1px solid var(--ink);}
.reg.tr{top:-1px;right:-1px;border-top:1px solid var(--ink);border-right:1px solid var(--ink);}
.reg.bl{bottom:-1px;left:-1px;border-bottom:1px solid var(--ink);border-left:1px solid var(--ink);}
.reg.br{bottom:-1px;right:-1px;border-bottom:1px solid var(--ink);border-right:1px solid var(--ink);}

/* ---------- ticker ---------- */
.ticker-bar{
  border-bottom:var(--hair) solid var(--ink);
  overflow:hidden;position:relative;background:var(--white);
}
.ticker-bar::before,.ticker-bar::after{content:"";position:absolute;top:0;bottom:0;width:64px;z-index:2;pointer-events:none;}
.ticker-bar::before{left:0;background:linear-gradient(90deg,var(--white),transparent);}
.ticker-bar::after{right:0;background:linear-gradient(270deg,var(--white),transparent);}
.ticker-track{
  display:flex;white-space:nowrap;width:max-content;animation:ticker-scroll 82s linear infinite;
  /* Hints the browser to promote this to its own compositor layer up front,
     so the transform-only animation doesn't get dropped/stutter on weaker
     mobile GPUs -- harmless on desktop, a real mitigation for animations
     that read as "frozen" on constrained mobile hardware. */
  will-change:transform;
}
.ticker-seg{display:flex;align-items:center;}
.ticker-item{
  font-family:'Plex Mono',monospace;
  font-size:9px;font-weight:500;letter-spacing:0.15em;text-transform:uppercase;
  color:var(--ink);white-space:nowrap;padding:11px 46px;
}
.ticker-item .br{color:var(--line);}
@keyframes ticker-scroll{from{transform:translateX(0);}to{transform:translateX(-50%);}}
@media (prefers-reduced-motion: reduce){.ticker-track{animation:none;}}

/* ---------- instrument header ---------- */
.instrument-header{border-bottom:var(--hair) solid var(--ink);}
.header-row{display:flex;align-items:stretch;}
.header-row--top{border-bottom:var(--hair) solid var(--ink);}
.brand-cell{
  display:flex;align-items:center;gap:10px;padding:16px var(--edge);
  font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;
  letter-spacing:0.08em;text-transform:uppercase;color:var(--ink);
}
.brand-mark{width:28px;height:28px;flex:none;}
.utility-cell{display:flex;align-items:stretch;margin-left:auto;}
.utility-cell a{
  display:flex;align-items:center;padding:16px 20px;
  font-family:'Plex Mono',monospace;font-size:11px;font-weight:500;
  letter-spacing:0.08em;text-transform:uppercase;color:var(--line);
  border-left:var(--hair) solid var(--line-faint);
  transition:color .15s;
}
.utility-cell a:hover,.utility-cell a[aria-current="page"]{color:var(--blue);}
.utility-cell a:last-child{padding-right:var(--edge);}

.core-nav{display:flex;align-items:stretch;width:100%;}
.core-nav a{
  display:flex;align-items:center;padding:15px 26px;
  font-family:'Plex Mono',monospace;font-size:11px;font-weight:500;
  letter-spacing:0.08em;text-transform:uppercase;color:var(--ink);
  border-left:var(--hair) solid var(--ink);
  transition:color .15s,background .15s;
}
.core-nav a:first-child{border-left:none;padding-left:var(--edge);}
.core-nav a:hover,.core-nav a[aria-current="page"]{color:var(--blue);}

/* Mobile nav-collapse toggle: invisible/inert at desktop widths (the two
   header rows render exactly as they always have -- see the max-width:980px
   block below for the actual collapse behavior, gated under .js so a
   no-JS mobile visitor still gets every link statically visible). */
.nav-toggle{display:none;}

/* ---------- buttons ---------- */
.btn{
  font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;
  letter-spacing:0.08em;text-transform:uppercase;
  padding:16px 24px;border:1px solid var(--ink);
  background:none;color:var(--ink);cursor:pointer;
  transition:border-color .15s,color .15s;
  display:inline-block;
}
.btn:hover{border-color:var(--blue);color:var(--blue);}
.btn-primary{background:var(--ink);color:var(--white);}
.btn-primary:hover{background:var(--blue);border-color:var(--blue);color:var(--white);}

/* ---------- document-reference stamp (every interior page) ---------- */
.stamp{max-width:960px;margin:0 auto;text-align:center;}
.stamp-tag{font-family:'Plex Mono',monospace;font-size:clamp(16px,2.2vw,22px);font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink);}
.stamp-tag .bracket{color:var(--line);}
.stamp-rule{width:100%;height:0;border-top:var(--hair) solid var(--ink);margin:26px 0;}
/* Draws each stamp rule in left-to-right on first paint/scroll-into-view,
   gated on the "js" class (see header.php) so a no-JS visitor just gets the
   static line -- never a permanently invisible one. */
.js .stamp-rule{transform-origin:left;transform:scaleX(0);transition:transform .7s cubic-bezier(.4,0,.2,1);}
.js .stamp-rule.is-revealed{transform:scaleX(1);}
@media (prefers-reduced-motion: reduce){
  .js .stamp-rule{transform:none !important;transition:none !important;}
}
.stamp-sub{font-family:'Plex Mono',monospace;font-size:clamp(28px,4vw,44px);font-weight:600;letter-spacing:0.02em;text-transform:uppercase;color:var(--blue);line-height:1.25;}
.stamp-sub .sep{color:var(--ink);margin:0 2px;}
.stamp-lede{max-width:64ch;margin:24px auto 0;font-size:14.5px;line-height:1.65;color:var(--line);}

/* Sitewide compacted title-page spacing standard */
.page-section{padding:clamp(32px,5vw,64px) var(--edge) clamp(64px,10vw,160px);}

/* ---------- generic detail-section / steps (used by several tool pages) ---------- */
.detail-section{max-width:920px;margin:clamp(28px,4vw,48px) auto 0;}
.detail-section h2{font-family:'Archivo',sans-serif;font-size:22px;font-weight:800;text-transform:uppercase;letter-spacing:-0.01em;color:var(--ink);margin-bottom:16px;}
.detail-section .lede{font-size:14.5px;line-height:1.75;color:var(--line);}
.detail-section .lede a{color:var(--blue);}
.detail-section .lede a:hover{text-decoration:underline;}
.steps{border-top:var(--hair) solid var(--ink);margin-top:28px;}
.step{display:flex;gap:24px;padding:22px 4px;border-bottom:var(--hair) solid var(--ink);}
.step .n{font-family:'Plex Mono',monospace;font-size:13px;font-weight:600;color:var(--blue);flex:none;width:28px;font-variant-numeric:tabular-nums;}
.step p{font-size:14px;line-height:1.7;color:var(--line);}
.step p b{color:var(--ink);font-weight:600;}

/* ---------- track order ---------- */
.track-panel{max-width:760px;margin:clamp(28px,4vw,48px) auto 0;border:var(--hair) solid var(--ink);}
.track-head{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:24px var(--edge);border-bottom:var(--hair) solid var(--ink);flex-wrap:wrap;}
.track-title{font-family:'Plex Mono',monospace;font-size:13px;font-weight:600;letter-spacing:0.09em;text-transform:uppercase;color:var(--ink);}
.track-badge{font-family:'Plex Mono',monospace;font-size:9.5px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;background:var(--white);color:var(--ink);border:1px solid var(--ink);padding:4px 8px;}
.track-body{padding:36px var(--edge) 40px;}
.track-field label{display:block;font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--line);margin-bottom:10px;}
.track-row{display:flex;gap:16px;flex-wrap:wrap;}
.track-field{flex:1;min-width:220px;}
.track-field input{width:100%;background:none;border:1px solid var(--ink);padding:14px 14px;font-size:15px;font-family:'Plex Mono',monospace;color:var(--ink);}
.track-field input::placeholder{color:var(--line-faint);}
.btn-track{
  flex:none;font-family:'Plex Mono',monospace;font-size:12px;font-weight:600;
  letter-spacing:0.08em;text-transform:uppercase;
  background:var(--white);border:1px solid var(--ink);color:var(--ink);
  padding:0 28px;cursor:pointer;transition:background .15s,border-color .15s,color .15s;
}
.btn-track:hover{background:var(--blue);border-color:var(--blue);color:var(--white);}
.track-hint{margin-top:14px;font-family:'Plex Mono',monospace;font-size:10px;color:var(--line);letter-spacing:0.03em;text-transform:uppercase;}
.track-result{display:none;margin-top:40px;padding-top:36px;border-top:var(--hair) solid var(--ink);}
.track-result.is-visible{display:block;}
.track-result-head{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin-bottom:32px;flex-wrap:wrap;}
.track-result-head h2{font-family:'Archivo',sans-serif;font-size:18px;font-weight:800;text-transform:uppercase;letter-spacing:-0.01em;color:var(--ink);}
.track-result-head .ref{font-family:'Plex Mono',monospace;font-size:11px;color:var(--line);}
.track-result-head .ref b{color:var(--ink);}
.timeline{display:flex;justify-content:space-between;position:relative;padding:0 4px;}
.timeline::before{content:"";position:absolute;top:5px;left:16px;right:16px;height:var(--hair);background:var(--line-faint);}
/* Real, non-fake progress bar -- width is set inline per-order from the
   actual order status (see aether_track_stage() / page-track-order.php),
   not animated toward an arbitrary value. The transition just makes that
   real jump from 0 read as a fill-in rather than an instant cut. */
.timeline-progress{position:absolute;top:5px;left:16px;height:var(--hair);width:0;background:var(--blue);z-index:1;transition:width 1.1s cubic-bezier(.4,0,.2,1) .15s;}
.timeline .step{position:relative;flex:1;text-align:center;}
.timeline .dot{width:11px;height:11px;background:var(--white);border:1.5px solid var(--line-faint);margin:0 auto 14px;position:relative;z-index:2;}
.timeline .step.done .dot{background:var(--blue);border-color:var(--blue);transform:scale(0);animation:aetherDotIn .3s cubic-bezier(.34,1.56,.64,1) forwards;}
.timeline .step:nth-child(1).done .dot{animation-delay:.1s;}
.timeline .step:nth-child(2).done .dot{animation-delay:.4s;}
.timeline .step:nth-child(3).done .dot{animation-delay:.7s;}
.timeline .step:nth-child(4).done .dot{animation-delay:1s;}
.timeline .step.current .dot{background:var(--white);border-color:var(--blue);border-width:2.5px;}
.timeline .step.current .dot::after{content:"";position:absolute;inset:-6px;border:1.5px solid var(--blue);pointer-events:none;animation:aetherDotPulse 1.8s ease-out infinite;}
@keyframes aetherDotIn{to{transform:scale(1);}}
@keyframes aetherDotPulse{0%{opacity:.65;transform:scale(.55);}100%{opacity:0;transform:scale(2);}}
.timeline .step-label{font-family:'Plex Mono',monospace;font-size:9.5px;font-weight:600;letter-spacing:0.05em;text-transform:uppercase;color:var(--line);opacity:0;animation:aetherFadeUp .4s ease forwards .3s;}
.timeline .step.done .step-label,.timeline .step.current .step-label{color:var(--ink);}
.timeline .step-date{margin-top:5px;font-family:'Plex Mono',monospace;font-size:9px;color:var(--line);opacity:0;animation:aetherFadeUp .4s ease forwards .35s;}
@keyframes aetherFadeUp{from{opacity:0;transform:translateY(4px);}to{opacity:1;transform:translateY(0);}}
@media (prefers-reduced-motion: reduce){
  .timeline-progress{transition:none;}
  .timeline .step.done .dot{animation:none;transform:scale(1);}
  .timeline .step.current .dot::after{animation:none;display:none;}
  .timeline .step-label,.timeline .step-date{animation:none;opacity:1;}
}
.track-note{max-width:760px;margin:24px auto 0;border:var(--hair) solid var(--ink);padding:20px var(--edge);}
.track-note p{font-size:12.5px;line-height:1.7;color:var(--line);}
.track-note p a{color:var(--blue);}
.track-faq{max-width:760px;margin:clamp(48px,7vw,72px) auto 0;border-top:var(--hair) solid var(--ink);}
.track-faq .qa{padding:22px 4px;border-bottom:var(--hair) solid var(--ink);}
.track-faq h3{font-family:'Plex Mono',monospace;font-size:11.5px;font-weight:600;letter-spacing:0.06em;text-transform:uppercase;color:var(--ink);margin-bottom:8px;}
.track-faq p{font-size:13.5px;line-height:1.65;color:var(--line);}
.track-faq p a{color:var(--blue);}
.reward-code-box{margin-top:40px;padding-top:36px;border-top:var(--hair) solid var(--ink);text-align:center;}
.reward-code-label{font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--line);margin-bottom:14px;}
.reward-code{font-family:'Plex Mono',monospace;font-size:clamp(24px,4vw,32px);font-weight:600;letter-spacing:0.12em;color:var(--ink);border:var(--hair) solid var(--ink);padding:16px 24px;display:inline-block;margin-bottom:14px;}
.reward-code-meta{font-family:'Plex Mono',monospace;font-size:10px;color:var(--line);letter-spacing:0.03em;text-transform:uppercase;}

/* ---------- contact page ---------- */
.contact-grid{max-width:1180px;margin:clamp(28px,4vw,48px) auto 0;display:grid;grid-template-columns:1.1fr 0.9fr;gap:0;border:var(--hair) solid var(--ink);}
.panel{position:relative;padding:36px var(--edge) 40px;}
.panel-form{border-right:var(--hair) solid var(--ink);}
.panel-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:30px;}
.panel-title{font-family:'Plex Mono',monospace;font-size:13px;font-weight:600;letter-spacing:0.09em;text-transform:uppercase;color:var(--ink);}
.panel-tag{font-family:'Plex Mono',monospace;font-size:9.5px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;background:var(--blue);color:var(--white);padding:5px 9px;white-space:nowrap;flex:none;}
.field{margin-bottom:22px;}
.field label{display:block;font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--line);margin-bottom:8px;}
.field input,.field select,.field textarea{width:100%;background:none;border:var(--hair) solid var(--ink);padding:12px 14px;font-size:14px;color:var(--ink);font-family:'Archivo',sans-serif;}
.field textarea{resize:vertical;min-height:220px;line-height:1.6;}
.field-row{display:grid;grid-template-columns:1fr 1fr;gap:16px;}
.form-submit{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:30px;flex-wrap:wrap;}
.form-note{font-family:'Plex Mono',monospace;font-size:9.5px;color:var(--line);letter-spacing:0.04em;}
.form-confirm{display:none;border:var(--hair) solid var(--ink);padding:22px;margin-top:6px;font-family:'Plex Mono',monospace;font-size:12px;letter-spacing:0.04em;color:var(--ink);}
.form-confirm b{color:var(--blue);}
form.is-sent .field,form.is-sent .form-submit{display:none;}
form.is-sent .form-confirm{display:block;}
/* scoped to the Technical Node Data panel -- different layout than the
   shared .node-list/.node-row used on the legal pages (stacked label/value
   here vs. side-by-side there), so it can't reuse the base rule as-is */
.panel-data .node-list{border-top:var(--hair) solid var(--ink);margin-top:4px;}
.panel-data .node-row{padding:22px 0;border-bottom:var(--hair) solid var(--ink);display:block;}
.panel-data .node-row .k{font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--line);margin-bottom:8px;}
.panel-data .node-row .v{font-size:15px;color:var(--ink);text-align:left;}
.panel-data .node-row .v.mono{font-family:'Plex Mono',monospace;font-size:13.5px;}
.panel-data .node-row a.v{color:var(--ink);}
.panel-data .node-row a.v:hover{text-decoration:underline;}
.gateway-notice{margin-top:32px;padding-top:24px;border-top:var(--hair) solid var(--ink);}
.gateway-notice .g-title{font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--ink);display:flex;align-items:center;gap:10px;margin-bottom:14px;}
.gateway-notice .g-title::before{content:"";width:5px;height:5px;background:var(--blue);flex:none;}
.gateway-notice p{font-size:13px;line-height:1.75;color:var(--line);max-width:86ch;}
.gateway-notice p+p{margin-top:12px;}

/* ---------- Portal Access gate (page-my-account.php, logged-out view) ----------
   Reuses the Contact page's .contact-grid/.panel/.gateway-notice pattern
   (see page-my-account.php's own note), but this page is now the mandatory
   front door for the entire site -- every visitor lands here before seeing
   anything else -- so the two panels get their own scoped rules rather than
   touching the shared base classes Contact also depends on. Grid rows
   stretch both panels to equal height by default; without this, the
   shorter Login panel's Access Notice sat right under the form with a dead
   empty gap below it while Register (now longer with the research-field
   dropdown) ran flush to the edge. Flexing each panel into a column and
   pinning its trailing block to the bottom with margin-top:auto turns that
   gap into an intentional-looking anchored footer on both sides. */
.portal-grid .panel{display:flex;flex-direction:column;}
.portal-grid .gateway-notice,
.portal-grid .panel-data .node-list{margin-top:auto;}
@media (max-width:980px){
  .portal-grid .panel-form{border-right:none;border-bottom:var(--hair) solid var(--ink);}
}

/* ---------- research protocols article grid ---------- */
.article-grid{
  max-width:1180px;margin:clamp(28px,4vw,48px) auto 0;
  display:grid;grid-template-columns:repeat(2,1fr);
  border-top:var(--hair) solid var(--ink);border-left:var(--hair) solid var(--ink);
}
.article-card{
  border-right:var(--hair) solid var(--ink);border-bottom:var(--hair) solid var(--ink);
  padding:32px;display:flex;flex-direction:column;
  transition:box-shadow .15s;text-decoration:none;color:inherit;
}
.article-card:hover{box-shadow:inset 0 0 0 1px var(--blue);}
.article-kicker{font-family:'Plex Mono',monospace;font-size:9.5px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--blue);margin-bottom:14px;}
.article-card h2{font-family:'Archivo',sans-serif;font-size:19px;font-weight:800;line-height:1.3;letter-spacing:-0.01em;text-transform:uppercase;color:var(--ink);margin-bottom:12px;}
.article-excerpt{font-size:13.5px;line-height:1.65;color:var(--line);flex:1;margin-bottom:20px;}
.article-meta{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:16px;border-top:var(--hair) solid var(--line-faint);font-family:'Plex Mono',monospace;font-size:9.5px;letter-spacing:0.05em;text-transform:uppercase;color:var(--line);}
.article-meta .read{color:var(--blue);}
.article-card:hover .article-meta .read{text-decoration:underline;}

@media (max-width:980px){
  .contact-grid{grid-template-columns:1fr;}
  .field-row{grid-template-columns:1fr;}
  .article-grid{grid-template-columns:1fr;}
  .track-row{flex-direction:column;}
  .btn-track{padding:14px;}
  .timeline{flex-direction:column;gap:18px;align-items:flex-start;}
  .timeline::before{display:none;}
  .timeline .step{display:flex;align-items:center;gap:12px;text-align:left;}
  .timeline .dot{margin:0;}
}

/* ---------- shared prose system (legal pages + articles) ---------- */
.policy-sections{max-width:920px;margin:clamp(28px,4vw,48px) auto 0;border-top:var(--hair) solid var(--ink);}
.policy-item{display:flex;align-items:flex-start;gap:28px;padding:30px 4px;border-bottom:var(--hair) solid var(--ink);}
.policy-item .num{font-family:'Plex Mono',monospace;font-size:22px;font-weight:600;letter-spacing:0.02em;color:var(--blue);flex:none;width:40px;line-height:1.2;font-variant-numeric:tabular-nums;}
.policy-item .body{flex:1;}
.policy-item .body h2{font-family:'Archivo',sans-serif;font-size:21px;font-weight:800;line-height:1.25;letter-spacing:-0.01em;text-transform:uppercase;color:var(--ink);margin:0 0 10px;}
.policy-item .body p{font-size:14.5px;line-height:1.65;color:var(--line);}
.policy-item .body p+p{margin-top:12px;}
.policy-item .body h3{font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink);margin:18px 0 10px;}
.bullet-list{margin-top:12px;}
.bullet-item{display:flex;gap:14px;padding:6px 4px;}
.bullet-dot{flex:none;width:6px;height:6px;background:var(--ink);border-radius:50%;margin-top:8px;}
.bullet-body{flex:1;font-size:14.5px;line-height:1.65;color:var(--line);}
.bullet-body b{color:var(--ink);font-weight:600;}
.bullet-body h3{font-family:'Plex Mono',monospace;font-size:12px;font-weight:600;letter-spacing:0.09em;text-transform:uppercase;color:var(--ink);margin:0 0 8px;}
.bullet-body p{margin:0;}
.page-about .policy-item .body p{padding-left:18px;}
.page-about .bullet-body p{padding-left:18px;}
.node-list{max-width:920px;margin:clamp(40px,6vw,64px) auto 0;border-top:var(--hair) solid var(--ink);}
.node-row{display:flex;align-items:baseline;justify-content:space-between;gap:24px;padding:16px 4px;border-bottom:var(--hair) solid var(--ink);}
.node-row .k{font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--line);flex:none;}
.node-row .v{font-size:14.5px;color:var(--ink);text-align:right;}
.node-row a.v{color:var(--ink);}
.node-row a.v:hover{text-decoration:underline;}
.notice{max-width:1180px;margin:clamp(40px,6vw,56px) auto 0;border:var(--hair) solid var(--ink);padding:24px var(--edge);}
.notice--narrow{max-width:920px;}
.notice .n-title{font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--ink);display:flex;align-items:center;gap:10px;margin-bottom:12px;}
.notice .n-title::before{content:"";width:5px;height:5px;background:var(--blue);flex:none;}
.notice p{font-size:13px;line-height:1.75;color:var(--line);}
.notice p a{color:var(--blue);}
.crosslink{max-width:920px;margin:clamp(48px,7vw,72px) auto 0;border-top:var(--hair) solid var(--ink);padding-top:24px;display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;}
.crosslink span{font-family:'Plex Mono',monospace;font-size:10px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--line);}
.crosslink a{font-family:'Plex Mono',monospace;font-size:12px;font-weight:600;letter-spacing:0.04em;text-transform:uppercase;color:var(--blue);transition:opacity .15s;}
.crosslink a:hover{opacity:0.7;}

/* ---------- compound index / shop archive (real WC products, custom template) ---------- */
/* auto-fit instead of a hardcoded repeat(3,1fr): with a fixed 3-column grid,
   taking a product off the catalog (down to 2) left a phantom third column
   of empty space inside the bordered box, and the remaining cards sat in
   whatever slot they landed in instead of sharing the full width. auto-fit
   collapses tracks with nothing in them and lets the real cards expand to
   fill the row, so this self-adjusts whenever the catalog count changes
   instead of needing a manual edit here every time. */
.catalog-grid{
  max-width:1360px;margin:clamp(28px,4vw,48px) auto 0;
  display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));
  border:var(--hair) solid var(--ink);
}
.product-card{
  padding:28px 28px 32px;border-left:var(--hair) solid var(--ink);
  display:flex;flex-direction:column;
  cursor:pointer;transition:box-shadow .15s;text-decoration:none;color:inherit;
}
.product-card:hover{box-shadow:inset 0 0 0 1.5px var(--blue);}
.product-card:first-child{border-left:none;}
.product-card .product-photo{margin-bottom:24px;}
.product-card .product-photo img{
  width:100%;height:auto;aspect-ratio:1/1;object-fit:cover;display:block;
  /* WP prints width/height HTML attrs on every generated <img>; browsers treat those
     as a low-priority but still "specified" height, which disables aspect-ratio
     unless we explicitly re-declare height:auto here to free it back up. */
}
.product-kicker{font-family:'Plex Mono',monospace;font-size:9.5px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--line);margin-bottom:8px;}
.product-name{font-family:'Archivo',sans-serif;font-size:22px;font-weight:800;letter-spacing:-0.01em;text-transform:uppercase;color:var(--ink);margin-bottom:10px;}
.product-blurb{font-size:13px;line-height:1.6;color:var(--line);margin-bottom:20px;flex:1;}
.product-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:18px;border-top:var(--hair) solid var(--ink);}
.product-price{font-family:'Plex Mono',monospace;font-size:15px;font-weight:600;color:var(--ink);}
.product-price span{font-size:10.5px;font-weight:500;color:var(--line);margin-left:4px;}
.product-link{font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--blue);}
.product-card:hover .product-link{text-decoration:underline;}
@media (max-width:980px){
  .catalog-grid{grid-template-columns:1fr;}
  .product-card{border-left:none;border-top:var(--hair) solid var(--ink);}
  .product-card:first-child{border-top:none;}
}

/* ---------- single product (Compound Record) ---------- */
.detail-grid{
  max-width:1180px;margin:clamp(28px,4vw,48px) auto 0;
  display:grid;grid-template-columns:0.9fr 1.1fr;gap:0;
  border:var(--hair) solid var(--ink);
}
.gallery{padding:32px;border-right:var(--hair) solid var(--ink);}
.gallery-main{position:relative;aspect-ratio:1/1;width:100%;border:var(--hair) solid var(--ink);overflow:hidden;}
.gallery-main img{width:100%;height:100%;object-fit:cover;display:block;}
.gallery-caption{margin-top:14px;font-family:'Plex Mono',monospace;font-size:10.5px;color:var(--line);letter-spacing:0.04em;text-align:center;}
.gallery-thumbs{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-top:14px;}
.gallery-thumb{
  aspect-ratio:1/1;border:var(--hair) solid var(--ink);background:none;cursor:pointer;
  font-family:'Plex Mono',monospace;font-size:10px;font-weight:600;color:var(--line);
  display:flex;align-items:center;justify-content:center;letter-spacing:0.04em;
  transition:border-color .15s,color .15s;padding:0;
}
.gallery-thumb:hover{color:var(--ink);}
.gallery-thumb[aria-pressed="true"]{border-color:var(--blue);color:var(--blue);}

.buy-box{padding:32px var(--edge) 36px;}
.buy-kicker{font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--line);margin-bottom:12px;}
.buy-title{font-family:'Archivo',sans-serif;font-size:clamp(28px,3vw,36px);font-weight:800;letter-spacing:-0.01em;text-transform:uppercase;color:var(--ink);line-height:1.1;margin-bottom:16px;}
.buy-blurb{font-size:14px;line-height:1.7;color:var(--line);margin-bottom:24px;max-width:56ch;}
.buy-price{font-family:'Plex Mono',monospace;font-size:26px;font-weight:600;color:var(--ink);padding-top:20px;border-top:var(--hair) solid var(--ink);margin-bottom:10px;}
.buy-price span{font-size:11px;font-weight:500;color:var(--line);margin-left:8px;}
.bulk-note{
  display:flex;align-items:flex-start;gap:11px;
  margin:0 0 24px;padding:13px 15px;
  border:1px solid var(--blue);background:rgba(0,67,240,0.06);
}
.bulk-note svg{
  flex:none;width:16px;height:16px;margin-top:2px;
  stroke:var(--blue);fill:none;stroke-width:1.8;stroke-linecap:round;
}
.bulk-note p{margin:0;font-family:'Plex Mono',monospace;font-size:11px;letter-spacing:0.03em;line-height:1.7;color:var(--ink);text-transform:uppercase;}
.bulk-note b{color:var(--blue);font-weight:600;}
.bulk-note .sep{color:var(--line-faint);}
.buy-row{display:flex;align-items:stretch;gap:16px;flex-wrap:wrap;}
.qty-stepper{display:flex;align-items:stretch;border:1px solid var(--ink);flex:none;}
.qty-stepper button{width:40px;background:none;border:none;color:var(--ink);font-size:16px;cursor:pointer;font-family:'Plex Mono',monospace;transition:background .15s,color .15s;}
.qty-stepper button:hover{background:var(--ink);color:var(--white);}
.qty-stepper input.qty{
  width:48px;border:none;border-left:1px solid var(--ink);border-right:1px solid var(--ink);
  text-align:center;font-family:'Plex Mono',monospace;font-size:14px;color:var(--ink);
  background:none;height:auto;-moz-appearance:textfield;
}
.qty-stepper input.qty::-webkit-outer-spin-button,.qty-stepper input.qty::-webkit-inner-spin-button{-webkit-appearance:none;margin:0;}
.btn-add{
  flex:1;min-width:200px;
  font-family:'Plex Mono',monospace;font-size:12px;font-weight:600;
  letter-spacing:0.08em;text-transform:uppercase;
  background:var(--blue);border:1px solid var(--blue);color:var(--white);
  cursor:pointer;transition:background .15s,border-color .15s;
}
.btn-add:hover{background:#0032B8;border-color:#0032B8;}
.buy-note{margin-top:14px;font-family:'Plex Mono',monospace;font-size:10px;color:var(--line);letter-spacing:0.04em;}

/* ---------- coming-soon waitlist (buy-box swap while no payment processor exists) ---------- */
.waitlist-box{border:1px solid var(--ink);padding:18px 18px 20px;margin:0 0 22px;}
.waitlist-copy{margin:0 0 16px;font-size:13px;line-height:1.65;color:var(--line);}
.waitlist-row{display:flex;align-items:stretch;gap:12px;flex-wrap:wrap;}
.waitlist-row input[type=email]{
  flex:1;min-width:180px;background:none;border:1px solid var(--ink);
  padding:12px 14px;font-size:14px;color:var(--ink);font-family:'Archivo',sans-serif;
}
.waitlist-row .btn-add{flex:1;min-width:140px;}

/* ---------- sitewide FAQ list (shares markup/pattern with .track-faq) ---------- */
.faq-list{max-width:760px;margin:clamp(28px,4vw,48px) auto 0;border-top:var(--hair) solid var(--ink);}
.faq-list .qa{padding:22px 4px;border-bottom:var(--hair) solid var(--ink);}
.faq-list h3{font-family:'Plex Mono',monospace;font-size:11.5px;font-weight:600;letter-spacing:0.06em;text-transform:uppercase;color:var(--ink);margin-bottom:8px;}
.faq-list p{font-size:13.5px;line-height:1.65;color:var(--line);}
.faq-list p a{color:var(--blue);}

.trust-strip{display:flex;flex-wrap:wrap;margin-top:20px;padding-top:16px;border-top:var(--hair) solid var(--ink);}
.trust-item{display:flex;align-items:center;gap:8px;padding:2px 16px 2px 0;margin-right:16px;border-right:var(--hair) solid var(--ink);}
.trust-item:last-child{border-right:none;margin-right:0;padding-right:0;}
.trust-item svg{flex:none;width:15px;height:15px;stroke:var(--ink);fill:none;stroke-width:1.4;}
.trust-item span{font-family:'Plex Mono',monospace;font-size:9px;font-weight:600;letter-spacing:0.07em;text-transform:uppercase;color:var(--ink);}
.checkout-trust{max-width:960px;margin:0 auto;}
.trust-strip--checkout{max-width:none;margin:0;justify-content:center;border-top:none;padding-top:0;}
.trust-strip--portal{max-width:640px;margin:28px auto 0;justify-content:center;border-top:none;}

/* Was font-weight:500 / color:var(--line) with only a plain 5px square as
   any kind of marker -- next to body copy that's barely distinguishable as
   a heading at all. Bumped weight/color for real contrast against the lede
   text below it, sized the marker up and made it blue (the site's one
   accent color, used the same way on the research-item/gateway-notice
   dots elsewhere) instead of plain ink, and added a hairline rule under it
   so each section reads as a clear break, not just another line of text. */
.product-detail .kicker{font-family:'Plex Mono',monospace;font-size:12px;font-weight:700;letter-spacing:0.14em;text-transform:uppercase;color:var(--ink);display:flex;align-items:center;gap:10px;margin-bottom:20px;padding-bottom:14px;border-bottom:var(--hair) solid var(--ink);}
.product-detail .kicker::before{content:"";width:7px;height:7px;background:var(--blue);flex:none;}
/* Matches .detail-grid/.coa-block above it exactly: same 1180px max-width,
   but no side padding of its own (was var(--edge), ~56px each side) -- that
   inset made this text column render noticeably narrower than the buy-box
   row and the Lab Results table sitting right above it, which both run
   close to the same 1180px boundary. */
.product-detail .detail-section{max-width:1180px;margin:clamp(28px,4vw,48px) auto 0;padding:0;}
.product-detail .detail-section .lede{font-size:14.5px;line-height:1.75;color:var(--line);}

/* Technical Specifications is the one section where the table sits right
   under the kicker with no lede paragraph between them -- now that the
   kicker draws its own border-bottom (see .product-detail .kicker above),
   this table's own border-top just repeated it ~28px further down,
   showing as two hairlines with a dead gap between them under this
   section specifically. */
/* Every other section's kicker is followed only by its own margin-bottom:20px
   before the next element starts (.lede has no margin-top of its own) --
   this table's extra margin-top:28px stacked on top of that, so "Technical
   Specifications" alone had a visibly bigger kicker-to-content gap than
   every other section on the page. */
.product-detail .spec-table{width:100%;border-collapse:collapse;}
.product-detail .spec-table tr{border-bottom:var(--hair) solid var(--ink);}
.product-detail .spec-table td{padding:14px 4px;font-size:13.5px;vertical-align:top;}
.product-detail .spec-table td:first-child{width:240px;font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:0.06em;text-transform:uppercase;color:var(--line);}
.product-detail .spec-table td:last-child{color:var(--ink);font-family:'Plex Mono',monospace;font-size:13px;overflow-wrap:anywhere;}
/* BPC-157's IUPAC Name value is a ~190-character single token (non-breaking
   hyphens throughout, same convention used for short compound names like
   "BPC-157" so they don't split mid-name -- but at full IUPAC length that
   convention backfires: nothing else could break it, so the table forced
   itself past the viewport width on mobile). overflow-wrap:anywhere is the
   one CSS property that still breaks a token when there's truly no other
   opportunity to, which protects every future long field value here too,
   not just this one. */

.product-detail .research-list{border-top:var(--hair) solid var(--ink);margin-top:28px;}
.product-detail .research-item{padding:20px 4px;border-bottom:var(--hair) solid var(--ink);display:flex;gap:16px;}
.product-detail .research-item>div{flex:1;}
.product-detail .research-item .dot{flex:none;width:6px;height:6px;background:var(--blue);border-radius:50%;margin-top:8px;}
.product-detail .research-item h3{font-family:'Plex Mono',monospace;font-size:12px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink);margin-bottom:6px;}
.product-detail .research-item p{font-size:13.5px;line-height:1.65;color:var(--line);}

.product-detail .storage-list{border-top:var(--hair) solid var(--ink);margin-top:28px;}
.product-detail .storage-item{padding:20px 4px;border-bottom:var(--hair) solid var(--ink);}
.product-detail .storage-item h3{font-family:'Plex Mono',monospace;font-size:11.5px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink);margin-bottom:6px;}
.product-detail .storage-item p{font-size:13.5px;line-height:1.7;color:var(--line);}
.product-detail .storage-item.disclaimer p{color:var(--ink);}

.product-detail .refs-list{border-top:var(--hair) solid var(--ink);margin-top:28px;}
.product-detail .refs-item{padding:16px 4px;border-bottom:var(--hair) solid var(--ink);display:flex;gap:16px;}
.product-detail .refs-item .n{font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;color:var(--line);flex:none;width:20px;font-variant-numeric:tabular-nums;}
.product-detail .refs-item p{font-size:12.5px;line-height:1.65;color:var(--line);}
.product-detail .refs-item p b{color:var(--ink);font-weight:600;}

/* Data-sheet row reveal -- spec table rows, research/storage/refs list items
   fade + rise in as they scroll into view, staggered by reveal.js so the
   page reads like a printer/plotter populating rows rather than a static
   card fading in all at once. table rows get opacity-only (no transform on
   <tr> -- inconsistent clipping/repaint behavior across browsers); the
   div-based list items get the fuller fade+rise. */
.js .product-detail .spec-table tr{opacity:0;transition:opacity .5s ease;}
.js .product-detail .spec-table tr.is-revealed{opacity:1;}
.js .product-detail .research-item,
.js .product-detail .storage-item,
.js .product-detail .refs-item{
  opacity:0;transform:translateY(10px);
  transition:opacity .5s ease,transform .5s cubic-bezier(.2,.7,.3,1);
}
.js .product-detail .research-item.is-revealed,
.js .product-detail .storage-item.is-revealed,
.js .product-detail .refs-item.is-revealed{opacity:1;transform:none;}
@media (prefers-reduced-motion: reduce){
  .js .product-detail .spec-table tr,
  .js .product-detail .research-item,
  .js .product-detail .storage-item,
  .js .product-detail .refs-item{opacity:1 !important;transform:none !important;transition:none !important;}
}

@media (max-width:980px){
  .detail-grid{grid-template-columns:1fr;}
  .gallery{border-right:none;border-bottom:var(--hair) solid var(--ink);}
  .product-detail .spec-table td:first-child{width:170px;}
}

/* ---------- cart page (custom template, real WC cart data) ---------- */
.cart-section{padding:clamp(32px,5vw,64px) var(--edge) clamp(48px,7vw,88px);}
.cart-layout{max-width:1180px;margin:clamp(28px,4vw,48px) auto 0;display:grid;grid-template-columns:1.6fr 1fr;gap:48px;align-items:start;}

.cart-items{border-top:var(--hair) solid var(--ink);}
.cart-row{display:flex;align-items:center;gap:20px;padding:24px 4px;border-bottom:var(--hair) solid var(--ink);}
.cart-row-image{
  flex:none;width:72px;aspect-ratio:1/1;border:var(--hair) solid var(--ink);overflow:hidden;display:block;
}
.cart-row-image img{width:100%;height:100%;object-fit:cover;display:block;}
.cart-row .info{flex:1;min-width:0;}
.cart-row .info a{font-family:'Archivo',sans-serif;font-size:17px;font-weight:800;text-transform:uppercase;letter-spacing:-0.01em;color:var(--ink);}
.cart-row .info a:hover{color:var(--blue);}
.cart-row .unit{font-family:'Plex Mono',monospace;font-size:11.5px;color:var(--line);margin-top:6px;}
.cart-row .bulk-badge{font-family:'Plex Mono',monospace;font-size:10px;font-weight:600;letter-spacing:0.04em;text-transform:uppercase;color:var(--blue);margin-top:6px;}
.cart-row .info .remove{font-family:'Plex Mono',monospace;font-size:10px;font-weight:600;letter-spacing:0.06em;text-transform:uppercase;color:var(--line);background:none;border:none;cursor:pointer;margin-top:10px;padding:0;transition:color .15s;text-decoration:none;display:inline-block;text-transform:uppercase;}
.cart-row .info .remove:hover{color:var(--blue);}
.cart-row .line-total{font-family:'Plex Mono',monospace;font-size:15px;font-weight:600;color:var(--ink);flex:none;width:78px;text-align:right;}

.cart-empty{border-top:var(--hair) solid var(--ink);padding:56px 4px;text-align:center;}
.cart-empty p{font-size:14.5px;color:var(--line);line-height:1.7;margin-bottom:20px;}
.cart-empty a{display:inline-block;font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;padding:16px 24px;border:1px solid var(--ink);color:var(--ink);transition:border-color .15s,color .15s;}
.cart-empty a:hover{border-color:var(--blue);color:var(--blue);}

.summary{border:var(--hair) solid var(--ink);padding:28px var(--edge) 30px;position:sticky;top:24px;}
.summary h2{font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--ink);margin-bottom:20px;}
.summary-row{display:flex;align-items:baseline;justify-content:space-between;gap:16px;padding:12px 0;border-bottom:var(--hair) solid var(--line-faint);}
.summary-row .k{font-family:'Plex Mono',monospace;font-size:11.5px;color:var(--line);}
.summary-row .v{font-family:'Plex Mono',monospace;font-size:13px;color:var(--ink);}
.summary-row.total{border-bottom:none;padding-top:18px;}
.summary-row.total .k{font-size:12.5px;font-weight:600;color:var(--ink);letter-spacing:0.04em;text-transform:uppercase;}
.summary-row.total .v{font-size:20px;font-weight:600;}
.btn-checkout{
  display:block;width:100%;margin-top:20px;text-align:center;
  font-family:'Plex Mono',monospace;font-size:12px;font-weight:600;
  letter-spacing:0.08em;text-transform:uppercase;
  background:var(--blue);border:1px solid var(--blue);color:var(--white);
  padding:16px;cursor:pointer;transition:background .15s,border-color .15s;text-decoration:none;
}
.btn-checkout:hover{background:#0032B8;border-color:#0032B8;}
.summary-note{margin-top:14px;font-family:'Plex Mono',monospace;font-size:10px;color:var(--line);letter-spacing:0.03em;line-height:1.6;}
.continue-shopping{display:block;text-align:center;margin-top:18px;font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:500;letter-spacing:0.06em;text-transform:uppercase;color:var(--line);transition:color .15s;}
.continue-shopping:hover{color:var(--blue);}
@media (max-width:980px){
  .cart-layout{grid-template-columns:1fr;}
  .summary{position:static;}
  .cart-row{flex-wrap:wrap;}
  .cart-row .line-total{width:auto;margin-left:auto;}
}

/* ---------- checkout (WooCommerce Blocks -- Cart/Checkout blocks, not the
   classic shortcode) -- re-skinned via WC Blocks' documented component
   classes rather than a full template rebuild, since the block renders its
   form fields, shipping/payment options, and order totals through real
   Store API calls that a from-scratch template would have to reimplement. */
.wp-block-woocommerce-checkout{
  max-width:1180px;margin:clamp(28px,4vw,48px) auto 0 !important;padding:0 var(--edge) 80px;
  font-family:'Archivo',-apple-system,sans-serif;
}
.wc-block-checkout__form{
  border:none;box-shadow:none;background:none;
}
/* This is the rule that actually separates "Contact info" / "Shipping
   address" / "Shipping options" / "Payment" from each other -- without
   !important here, WooCommerce's own wc-block-style (kept loaded for the
   base field/layout structure) was silently winning and zeroing this out,
   which is why every step ran straight into the next with no border or gap
   at all. */
.wc-block-components-checkout-step{
  border:none !important;box-shadow:none !important;background:none !important;
  border-top:var(--hair) solid var(--ink) !important;
  padding:18px 0 !important;margin:0 !important;
}
.wc-block-components-checkout-step:first-child{border-top:none !important;padding-top:0 !important;}
/* Draws each step's top hairline in top-to-bottom instead of the hard cut
   above, via checkout.js's revealSteps(). The real border-top keeps its
   width (no layout shift) but goes transparent under .js; a ::before redraws
   the same line and animates it in. first-child never had a border-top to
   begin with, so it's excluded the same way the real border rule excludes it. */
.js .wc-block-components-checkout-step{position:relative;border-top-color:transparent !important;}
.js .wc-block-components-checkout-step:first-child::before{display:none;}
.js .wc-block-components-checkout-step::before{
  content:"";position:absolute;top:-1px;left:0;right:0;height:1px;
  background:var(--ink);transform:scaleX(0);transform-origin:left;
  transition:transform .6s cubic-bezier(.4,0,.2,1);
}
.js .wc-block-components-checkout-step.is-revealed::before{transform:scaleX(1);}
@media (prefers-reduced-motion: reduce){
  .js .wc-block-components-checkout-step{border-top-color:var(--ink) !important;}
  .js .wc-block-components-checkout-step::before{display:none;}
}
.wc-block-components-checkout-step__title{
  font-family:'Plex Mono',monospace !important;font-size:13px !important;font-weight:600 !important;
  letter-spacing:0.09em;text-transform:uppercase;color:var(--ink) !important;
}
.wc-block-components-checkout-step__description{font-size:13px;color:var(--line);}
.wc-block-components-text-input input,
.wc-block-components-textarea textarea,
.wc-block-components-combobox-control input{
  border:var(--hair) solid var(--ink) !important;border-radius:0 !important;
  background:none !important;box-shadow:none !important;
  font-family:'Archivo',sans-serif !important;font-size:14px !important;color:var(--ink) !important;
}
/* Every box container on checkout (text fields, selects, coupon input,
   shipping option) shares one interaction language: black border at rest,
   blue on hover, blue while actually focused/typing into it -- never blue
   just because a value happens to be selected/checked by default.
   :focus was rendering thick and BLACK, not blue -- the browser/WC default
   focus ring is a box-shadow (and sometimes an outline) layered on top of
   the border, in black, which drowned out border-color:blue underneath it.
   Killing that box-shadow/outline and pushing the actual border to 2px
   blue instead is what actually shows up as "thick and blue." */
.wc-block-components-text-input input:hover,
.wc-block-components-text-input input:focus,
.wc-block-components-textarea textarea:hover,
.wc-block-components-textarea textarea:focus,
.wc-block-components-combobox-control input:hover,
.wc-block-components-combobox-control input:focus{
  border-color:var(--blue) !important;
}
.wc-block-components-text-input input:focus,
.wc-block-components-textarea textarea:focus,
.wc-block-components-combobox-control input:focus{
  border-width:2px !important;box-shadow:none !important;outline:none !important;
}
/* Country/State are a <select> wrapped in its own bordered container div --
   giving BOTH the container and the inner <select> a border stacks two
   hairlines flush against each other, which is why those two fields (and
   nothing else) looked like they had a heavier, darker outline than every
   plain text input. Border lives on the container only; the select itself
   goes borderless so there's exactly one line. */
.wc-blocks-components-select__select,
select.wc-block-components-country-input,
select.wc-block-components-state-input{
  border:none !important;border-radius:0 !important;
  background:none !important;box-shadow:none !important;
  font-family:'Archivo',sans-serif !important;font-size:14px !important;color:var(--ink) !important;
}
.wc-block-components-text-input label{font-family:'Plex Mono',monospace !important;letter-spacing:0.04em;}
.wc-block-components-checkbox svg,
.wc-block-components-radio-control__input{accent-color:var(--blue);}
.wc-block-components-radio-control__option{
  border:var(--hair) solid var(--ink) !important;border-radius:0 !important;background:none !important;
}
/* Being the selected option isn't the same as being interacted with --
   Free Shipping is auto-selected as the only option, so a permanent blue
   border there read as "highlighted for no reason." Selected now looks
   exactly like every other box (black) and only goes blue on hover/focus. */
.wc-block-components-radio-control__option-checked{
  border-color:var(--ink) !important;box-shadow:none !important;
}
.wc-block-components-radio-control__option:hover,
.wc-block-components-radio-control__option:focus-within{
  border-color:var(--blue) !important;
}
/* Payment methods render through the accordion flavor of this same
   component (shipping doesn't, since shipping options never expand to show
   a description) -- it carries the plain __option classes above but also
   its own -accordion-option class, and with only one gateway configured
   right now it's both auto-selected AND permanently "expanded," so it needs
   the same checked-isn't-interacted black-not-blue treatment explicitly. */
.wc-block-components-radio-control-accordion-option{
  border:var(--hair) solid var(--ink) !important;border-radius:0 !important;background:none !important;
}
.wc-block-components-radio-control-accordion-option:hover,
.wc-block-components-radio-control-accordion-option:focus-within{
  border-color:var(--blue) !important;
}
.wc-block-components-radio-control__label{
  font-family:'Plex Mono',monospace !important;font-size:12px !important;font-weight:600 !important;
  letter-spacing:0.06em;text-transform:uppercase;color:var(--ink) !important;
}
/* The gateway description (our own settings text, not WC chrome) was
   inheriting the default block-library paragraph -- Archivo body text at
   full size flush against the option's bottom border with no top gap,
   which is the "spacing is off" -- it needs its own inset and to visually
   read as secondary/explanatory rather than as another label. */
.wc-block-components-radio-control-accordion-content{
  padding:10px 16px 14px 40px !important;margin:0 !important;
  border:none !important;background:none !important;box-shadow:none !important;
}
.wc-block-components-radio-control-accordion-content p{
  font-family:'Plex Mono',monospace !important;font-size:11.5px !important;line-height:1.6 !important;
  color:var(--line) !important;margin:0 !important;
}
.wc-block-components-totals-item__value,
.wc-block-components-totals-item__label{font-family:'Plex Mono',monospace !important;color:var(--ink) !important;}
.wc-block-components-totals-footer-item .wc-block-components-totals-item__value{font-weight:600 !important;}
/* The total row's wrapper ships its own translucent gray border (rgba
   ink/0.2, not our solid --ink hairline) plus extra top padding on top of
   the row's own -- together that read as a stray faint line and a much
   bigger gap above Total than the Subtotal/Shipping gap above it. */
.wc-block-components-totals-wrapper{
  border-top:1px solid var(--ink) !important;
  padding:0 !important;
}
/* Order summary card: several horizontal rules stack close together here
   (card border, title underline, coupon row, totals wrapper) -- at var(--hair)
   (0.5px) each one individually antialiases into a faint gray line on a
   standard-density display instead of solid black, and stacked this close
   together they visually merge into what reads as a soft gray box behind
   the whole card. A full 1px renders crisp on any display, so this card
   uses it everywhere instead of the sitewide hairline. */
.wc-block-components-order-summary{border:none !important;box-shadow:none !important;border-radius:0 !important;padding:0 !important;background:none !important;}
/* Main/sidebar columns are a plain 65/35 flex split with no override hook of
   their own -- widening the sidebar 20% (35% -> 42%) so the product's short
   description isn't clipped mid-sentence. */
.wc-block-checkout__sidebar{width:42% !important;}
.wc-block-checkout__main{width:58% !important;}
/* No breakpoint existed for this split anywhere in the file, so the fixed
   42/58 widths applied unconditionally down to phone widths instead of
   stacking like every other multi-column layout on the site (contact-grid,
   detail-grid, cart-layout, account-dashboard all collapse at 980px). */
@media (max-width:980px){
  .wc-block-checkout__sidebar,
  .wc-block-checkout__main{width:100% !important;}
}
/* Subtotal/Shipping/Total and the coupon row live in a SIBLING container to
   .wc-block-components-order-summary (its own padding never reached them),
   so they were rendering flush against the sidebar's outer edge while the
   product card above them looked properly inset. Padding the shared outer
   block gives every row in the card -- title, product, coupon, totals -- the
   same consistent inset instead of just the top section. */
.wp-block-woocommerce-checkout-order-summary-block{padding:24px !important;}
.wc-block-components-panel__button{
  font-family:'Plex Mono',monospace !important;text-transform:uppercase;letter-spacing:0.06em;color:var(--ink) !important;
  padding:12px 0 !important;margin:0 !important;font-size:11px !important;
}
/* Coupon input + its "Apply" button -- the button was falling back to core
   Gutenberg's default "wp-element-button" styling (dark slate-gray fill,
   Archivo body text, no letter-spacing), a leftover from wp-block-library
   that reads as a stray gray box against the rest of the hairline/blue
   system. Match it to every other primary action button on the site. */
/* Input and button were drifting out of vertical alignment -- flex
   "stretch" was letting each compute its own height from its own
   padding/border/line-height instead of the two actually matching, so the
   button's bottom edge sat below the input's. Both get the exact same
   explicit height + border-box now, which is the only way to guarantee
   their edges land on the same pixel regardless of internal padding. */
.wc-block-components-totals-coupon__form{align-items:flex-start !important;}
.wc-block-components-totals-coupon__input,
.wc-block-components-totals-coupon__input input,
.wc-block-components-totals-coupon__button{
  height:48px !important;box-sizing:border-box !important;align-self:flex-start !important;margin-top:0 !important;
}
.wc-block-components-totals-coupon__input input{
  border:var(--hair) solid var(--ink) !important;border-radius:0 !important;
  background:none !important;box-shadow:none !important;
  font-family:'Archivo',sans-serif !important;font-size:14px !important;color:var(--ink) !important;
}
.wc-block-components-totals-coupon__input input:hover,
.wc-block-components-totals-coupon__input input:focus{border-color:var(--blue) !important;}
.wc-block-components-totals-coupon__input input:focus{
  border-width:2px !important;box-shadow:none !important;outline:none !important;
}
.wc-block-components-totals-coupon__input label{font-family:'Plex Mono',monospace !important;letter-spacing:0.04em;}
.wc-block-components-totals-coupon__button{
  font-family:'Plex Mono',monospace !important;font-size:11px !important;font-weight:600 !important;
  letter-spacing:0.08em !important;text-transform:uppercase !important;
  background:var(--blue) !important;border:1px solid var(--blue) !important;color:var(--white) !important;
  border-radius:0 !important;box-shadow:none !important;
}
.wc-block-components-totals-coupon__button:hover{background:#0032B8 !important;border-color:#0032B8 !important;}
.wc-block-components-totals-coupon__button:disabled{background:var(--line-faint) !important;border-color:var(--line-faint) !important;color:var(--line) !important;}
.wc-block-components-checkout-place-order-button,
.wc-block-components-checkout-return-to-cart-button{
  font-family:'Plex Mono',monospace !important;font-size:12px !important;font-weight:600 !important;
  letter-spacing:0.08em;text-transform:uppercase;border-radius:0 !important;box-shadow:none !important;
}
.wc-block-components-checkout-place-order-button{
  background:var(--blue) !important;border:1px solid var(--blue) !important;color:var(--white) !important;
}
.wc-block-components-checkout-place-order-button:hover{background:#0032B8 !important;border-color:#0032B8 !important;}
.wc-block-components-button:not(.wc-block-components-checkout-place-order-button){border-radius:0 !important;}

/* uppercase pass -- structural labels/headings/buttons only, never raw user
   input values or the native country/state <select> option lists */
.wp-block-woocommerce-checkout .wc-block-components-checkout-step__title,
.wp-block-woocommerce-checkout .wc-block-components-checkout-order-summary__title-text,
.wp-block-woocommerce-checkout .wc-block-components-product-name,
.wp-block-woocommerce-checkout .wc-block-components-radio-control__label,
.wp-block-woocommerce-checkout .wc-block-components-checkbox__label,
.wp-block-woocommerce-checkout .wc-block-components-panel__button,
.wp-block-woocommerce-checkout .wc-block-components-totals-item__label,
.wp-block-woocommerce-checkout .wc-block-components-totals-item__value,
.wp-block-woocommerce-checkout label{
  text-transform:uppercase !important;
  letter-spacing:0.03em;
}
.wp-block-woocommerce-checkout .wc-block-components-product-name{
  font-family:'Archivo',sans-serif !important;font-weight:800 !important;letter-spacing:-0.01em;
}
/* Full-sentence checkbox labels (terms agreement) read as shouting in caps --
   every other page on the site reserves uppercase for short UI labels only,
   never body prose, so this one label needs to opt back out of the pass above. */
.wp-block-woocommerce-checkout-terms-block .wc-block-components-checkbox__label{
  text-transform:none !important;letter-spacing:normal;font-size:12.5px;
}
/* WC Blocks' own notice banners (payment/shipping errors, "no payment
   methods available") ship as rounded, tinted alert pills -- jarring against
   the site's hairline-border, sharp-corner, ink/blue-only palette. Restyle
   to the same .notice treatment used everywhere else on the site. */
.wc-block-components-notice-banner{
  background:none !important;border:var(--hair) solid var(--ink) !important;border-radius:0 !important;
  padding:20px 24px !important;box-shadow:none !important;
}
.wc-block-components-notice-banner.is-error{border-color:var(--ink) !important;}
.wc-block-components-notice-banner .wc-block-components-notice-banner__content{
  font-family:'Archivo',sans-serif !important;font-size:13px !important;line-height:1.65;color:var(--ink) !important;
}
.wc-block-components-notice-banner svg{fill:var(--blue) !important;}

/* Remaining default-WC rounded corners found in a full sweep of the block --
   address review card, country/state select wrapper, checkbox input, and
   the order-summary block's own outer radius. Radio inputs and the small
   quantity-count badge stay circular; that reads as normal UI, not a clash. */
.wc-block-components-address-card,
.wc-blocks-components-select__container,
.wc-blocks-components-select__select,
.wc-block-components-checkbox__input,
.wp-block-woocommerce-checkout-order-summary-block{
  border-radius:0 !important;
}
.wc-blocks-components-select__container{border:var(--hair) solid var(--ink) !important;box-shadow:none !important;}
.wc-blocks-components-select__container:hover,
.wc-blocks-components-select__container:focus-within{border-color:var(--blue) !important;}
.wc-blocks-components-select__container:focus-within{
  border-width:2px !important;box-shadow:none !important;outline:none !important;
}
.wc-block-components-address-card{border:var(--hair) solid var(--ink) !important;padding:16px !important;}

/* spacing pass -- every value here needs !important, no exceptions: WC's own
   wc-block-style (kept loaded for base layout/field structure) silently wins
   ties without it, which is exactly what zeroed out the step border/padding
   above and made the whole page read as one run-together block. */
.wc-block-components-checkout-step__heading{margin-bottom:6px !important;}
.wc-block-components-text-input,
.wc-block-components-select,
.wc-block-components-country-input,
.wc-block-components-state-input{margin-bottom:12px !important;}
.wc-block-components-address-form .wc-block-components-address-form__city,
.wc-block-components-address-form .wc-block-components-address-form__state,
.wc-block-components-address-form .wc-block-components-address-form__postcode{margin-bottom:0 !important;}
.wc-block-components-order-summary-item{padding:16px 0 !important;border-bottom:1px solid var(--ink) !important;}
/* WC Blocks lays this row out as a plain flex row (image | name+price+desc |
   line-total, the last one pinned via margin-left:auto) with no responsive
   handling of its own. That's fine while the description is short, but this
   site's product descriptions run several lines, so on a narrow sidebar
   (phones, and the desktop sidebar is already only 42% wide) the description
   wraps tall while the price+"Save" badge stay pinned at the top-right,
   leaving a large dead gap of empty space below them. Below 600px, drop the
   price column onto its own full-width row under the description instead of
   beside it -- verified against a live mobile checkout render before adding
   this, not guessed from the CSS alone. */
@media (max-width:600px){
  .wc-block-components-order-summary-item{flex-wrap:wrap;}
  .wc-block-components-order-summary-item__total-price{
    flex-basis:100% !important;
    margin-left:0 !important;
    margin-top:8px !important;
    padding-left:60px !important;
    text-align:left !important;
  }
  .wc-block-components-order-summary-item__total-price .wc-block-cart-item__total-price-and-sale-badge-wrapper{
    flex-direction:row !important;
    align-items:center !important;
  }

  /* WooCommerce Blocks renders the order summary TWICE on mobile, both by
     its own design, not this theme's: a sticky collapsible toggle pinned
     to the top of the page (.wc-block-checkout__sidebar, active whenever
     the ancestor layout carries WC's own "is-mobile" class) showing just
     the running total, and a second, always-expanded "Fill" copy of the
     exact same cart items + coupon + totals portalled into the main
     column right before the Place Order button
     (.checkout-order-summary-block-fill-wrapper). Two live copies of the
     same content -- including two independently-functioning "Add coupon"
     forms -- reads as broken, not helpful, and it means a shopper has to
     scroll straight past a collapsed teaser before ever seeing real
     numbers. The Fill already is exactly what's wanted: fully expanded,
     sitting at the bottom near the actual checkout action -- so it's kept
     and just stripped of the light 20%-opacity border WC Blocks puts on
     it by default (mismatched with this theme's borderless hairline-row
     look), while the redundant sticky toggle up top is hidden outright.
     Forcing WC Blocks' internal collapse state open via CSS instead would
     mean fighting its React state for a result the Fill already gives for
     free, and would break the moment WooCommerce changes that internal
     markup. */
  .is-mobile .wc-block-checkout__sidebar{display:none !important;}
  .checkout-order-summary-block-fill{border:none !important;}

  /* .wp-block-woocommerce-checkout-order-summary-block's own 24px padding
     (added elsewhere in this file for the *desktop* sidebar card, where it
     also happens to apply here since the Fill wrapper carries that same
     class) was insetting every row -- product card, coupon toggle,
     Subtotal/Shipping/Taxes/Total -- 24px in from each edge, leaving the
     kept Fill copy visibly narrower than the email/name fields and the
     Place Order button below it (301px vs 253px, measured live). Zeroed
     out on the Fill specifically, via its own unique class, so the
     desktop sidebar's inset card look is untouched. */
  .checkout-order-summary-block-fill-wrapper{padding:0 !important;}
}
/* Coupon row was indented 16px further right than every other row in this
   card (Subtotal/Shipping/Total all sit flush left) -- WC's own coupon
   panel wrapper carries a hardcoded 16px left padding nothing else here has,
   which is what threw "Add coupon" out of line with the rows below it. */
.wc-block-components-totals-coupon{padding-left:0 !important;padding-right:0 !important;}
/* The coupon form is a flex row where the Apply button was set to grow
   (flex:1), stretching it to roughly a third of the row -- same width
   whether it says "Apply" or something much longer. Pin it to its own
   content width and let the input claim the freed-up space instead. */
.wc-block-components-totals-coupon__form{gap:8px !important;}
.wc-block-components-totals-coupon__button{flex:none !important;padding:0 18px !important;}
.wc-block-components-totals-item{padding:12px 0 !important;margin:0 !important;}
.wc-block-components-checkout-order-summary__title{padding-bottom:16px !important;margin-bottom:8px !important;border-bottom:1px solid var(--ink) !important;}
/* WC gives the title text a 16px left margin meant to space it away from a
   preceding sibling in its default layout -- here it's the first element in
   the row, so that margin just pushed "Order Summary" 16px right of every
   row below it (Add coupon / Subtotal / Total all sit flush left). */
.wc-block-components-checkout-order-summary__title-text{margin-left:0 !important;}

/* ---------- portal access / login + register (real WooCommerce auth,
   restyled) -- login and register share the same field/button treatment,
   so both forms use these rules together. ---------- */
.woocommerce-form-login .form-row,
.woocommerce-form-register .form-row{margin-bottom:22px;clear:both;}
.woocommerce-form-login label,
.woocommerce-form-register label{display:block;font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--line);margin-bottom:8px;}
.woocommerce-form-login input[type="text"],
.woocommerce-form-login input[type="password"],
.woocommerce-form-login input[type="email"],
.woocommerce-form-register input[type="text"],
.woocommerce-form-register input[type="password"],
.woocommerce-form-register input[type="email"],
.woocommerce-form-register select{
  width:100%;background:none;border:var(--hair) solid var(--ink);padding:12px 14px;
  font-size:14px;color:var(--ink);font-family:'Archivo',sans-serif;
}
/* WooCommerce's real login-form markup puts the "remember me" checkbox and
   the submit button inside the SAME <p class="form-row"> -- without WC's own
   (dequeued) stylesheet's float rules that paragraph's children just flow
   inline by default, jamming the checkbox and a width:100% button onto one
   broken line. Forcing both to their own block row fixes it. */
.woocommerce-form-login .woocommerce-form-login__rememberme{
  display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--line);
  font-weight:400;letter-spacing:normal;text-transform:none;margin-bottom:18px;
}
.woocommerce-form-login .woocommerce-form-login__submit,
.woocommerce-form-register .woocommerce-form-register__submit{
  display:block;font-family:'Plex Mono',monospace;font-size:12px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;
  background:var(--blue);border:1px solid var(--blue);color:var(--white);padding:14px 24px;cursor:pointer;width:100%;
}
.woocommerce-form-login .woocommerce-form-login__submit:hover,
.woocommerce-form-register .woocommerce-form-register__submit:hover{background:#0032B8;border-color:#0032B8;}
/* WooCommerce's own password-strength-meter.js injects this markup directly
   next to #reg_password on keyup -- it ships with zero styling of its own
   once WC's stylesheet is dequeued, which is why "Weak - Please enter a
   stronger password..." was rendering as bare, unspaced browser-default text. */
.woocommerce-password-strength{
  margin:10px 0 0;padding:10px 14px;border:var(--hair) solid var(--ink);
  font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.06em;text-transform:uppercase;
  color:var(--ink);
}
.woocommerce-password-strength.strong,
.woocommerce-password-strength.good{color:var(--blue);border-color:var(--blue);}
.woocommerce-password-hint{
  display:block;margin-top:8px;font-family:'Archivo',sans-serif;font-size:12px;line-height:1.6;
  color:var(--line);letter-spacing:normal;text-transform:none;
}
.woocommerce-form-login .lost_password{margin-top:16px;text-align:center;font-family:'Plex Mono',monospace;font-size:10.5px;letter-spacing:0.04em;}
.woocommerce-form-login .lost_password a{color:var(--blue);}
.panel-data .node-list{margin-top:28px;padding-top:8px;border-top:var(--hair) solid var(--ink);}

/* WooCommerce prints these as a bare div containing a message string and an
   inline "wc-forward" action link/button as plain siblings -- with WC's own
   stylesheet dequeued there's nothing separating text from button, so they
   ran together edge-to-edge. Flex + gap gives them proper breathing room
   regardless of which one (text or button) comes first in the markup. */
.woocommerce-error,.woocommerce-message,.woocommerce-info{
  display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
  border:var(--hair) solid var(--ink);padding:18px 20px;font-size:13px;line-height:1.65;color:var(--ink);list-style:none;margin:0 0 20px;
}
.woocommerce-error .button,.woocommerce-message .button,.woocommerce-info .button{flex:none;}
.woocommerce-error a:not(.button),.woocommerce-message a:not(.button),.woocommerce-info a:not(.button){color:var(--blue);}

/* ---------- account dashboard (logged-in [woocommerce_my_account] output --
   real WooCommerce classic templates: nav sidebar + content, used for the
   dashboard landing view and every sub-page: Orders, Addresses, Account
   details). This was previously left at WooCommerce's bare defaults, which
   is why it read as a totally different, unstyled site. ---------- */
.account-dashboard .woocommerce{
  display:grid;grid-template-columns:260px 1fr;gap:0;
  max-width:1180px;margin:clamp(28px,4vw,48px) auto 0;
  border:var(--hair) solid var(--ink);
}
/* Gravatar/"change avatar" block: no personal photos appear anywhere else
   on the site, and the default identicon clashes hard with the brand. */
.account-dashboard .woocommerce-account-gravatar{display:none;}
.account-dashboard .woocommerce-MyAccount-navigation{
  border-right:var(--hair) solid var(--ink);padding:12px 0;
}
.account-dashboard .woocommerce-MyAccount-navigation ul{list-style:none;margin:0;padding:0;}
.account-dashboard .woocommerce-MyAccount-navigation-link{border-bottom:var(--hair) solid var(--line-faint);}
.account-dashboard .woocommerce-MyAccount-navigation-link:last-child{border-bottom:none;}
.account-dashboard .woocommerce-MyAccount-navigation-link a{
  display:block;padding:14px 28px;
  font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;
  color:var(--ink);text-decoration:none;transition:color .15s;
}
.account-dashboard .woocommerce-MyAccount-navigation-link a:hover{color:var(--blue);}
.account-dashboard .woocommerce-MyAccount-navigation-link.is-active a{color:var(--blue);}
.account-dashboard .woocommerce-MyAccount-content{padding:36px var(--edge) 40px;}
.account-dashboard .woocommerce-MyAccount-content p{font-size:14px;line-height:1.7;color:var(--line);margin-bottom:14px;}
.account-dashboard .woocommerce-MyAccount-content a{color:var(--blue);}
.account-dashboard .woocommerce-MyAccount-content strong{color:var(--ink);font-weight:600;}

/* Overview tab -- scoped via the account-overview-active body class (added
   only when no WC account endpoint is active, i.e. the base /my-account/
   view) rather than a template file, since a theme override at
   woocommerce/myaccount/dashboard.php never got picked up live on this host
   even after direct confirmation the file itself resolved and read back
   correctly -- something between file and include was stuck on the old
   content with no CLI-reachable way to reset it. WC's own "Hello X" /
   "From your account..." paragraphs read as short instrument-panel labels
   in caps here, matching the stamp/kicker convention used everywhere else,
   instead of default WC sentence-case prose. */
.account-overview-active .woocommerce-MyAccount-content > p{
  text-transform:uppercase;font-size:12.5px !important;letter-spacing:0.02em;
}
.account-overview-active .node-list{margin-top:8px;}
.account-overview-active .node-list .v{text-transform:uppercase;}
.account-overview__actions{margin-top:clamp(28px,4vw,40px);}
.account-overview__actions-title{
  font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;
  color:var(--ink);margin-bottom:16px !important;padding-bottom:12px;border-bottom:var(--hair) solid var(--ink);
}
.account-overview__actions-grid{display:grid;grid-template-columns:1fr 1fr;gap:0;border:var(--hair) solid var(--ink);}
.account-overview__action{
  display:block;padding:18px 20px;
  font-family:'Plex Mono',monospace;font-size:11.5px;font-weight:600;letter-spacing:0.05em;text-transform:uppercase;
  color:var(--ink) !important;border-bottom:var(--hair) solid var(--line-faint);
  transition:color .15s,background .15s;
}
.account-overview__action:nth-child(odd){border-right:var(--hair) solid var(--line-faint);}
.account-overview__action:hover{color:var(--blue) !important;}
@media (max-width:980px){
  .account-overview__actions-grid{grid-template-columns:1fr;}
  .account-overview__action:nth-child(odd){border-right:none;}
}

/* orders table + address cards (Orders / Addresses sub-pages) */
.account-dashboard table.woocommerce-orders-table,
.account-dashboard table.shop_table{width:100%;border-collapse:collapse;margin-top:4px;}
.account-dashboard table.woocommerce-orders-table thead th,
.account-dashboard table.shop_table thead th{
  text-align:left;font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;
  letter-spacing:0.08em;text-transform:uppercase;color:var(--line);
  padding:12px 10px;border-bottom:var(--hair) solid var(--ink);
}
.account-dashboard table.woocommerce-orders-table td,
.account-dashboard table.shop_table td{padding:14px 10px;font-size:13.5px;color:var(--ink);border-bottom:var(--hair) solid var(--line-faint);}
.account-dashboard .woocommerce-orders-table__cell-order-status{text-transform:uppercase;font-family:'Plex Mono',monospace;font-size:11px;}
.account-dashboard .woocommerce-button,
.account-dashboard a.button{
  display:inline-block;font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.06em;text-transform:uppercase;
  padding:10px 16px;border:1px solid var(--ink);color:var(--ink);text-decoration:none;transition:border-color .15s,color .15s;
}
.account-dashboard .woocommerce-button:hover,
.account-dashboard a.button:hover{border-color:var(--blue);color:var(--blue);}
.account-dashboard .woocommerce-Addresses{display:grid;grid-template-columns:1fr 1fr;gap:24px;}
.account-dashboard .woocommerce-Address-title{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px;}
.account-dashboard .woocommerce-Address-title h2,
.account-dashboard .woocommerce-Address-title h3{font-family:'Plex Mono',monospace;font-size:12px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink);}
.account-dashboard .woocommerce-Address-title a.edit{
  font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.06em;text-transform:uppercase;
  color:var(--blue) !important;
}
.account-dashboard address{font-style:normal;font-size:13.5px;line-height:1.7;color:var(--line);}

/* Account details / Edit address forms -- classic WC form-row markup */
.account-dashboard .woocommerce-form-row,
.account-dashboard .form-row{margin-bottom:18px;}
.account-dashboard .woocommerce-form-row label,
.account-dashboard .form-row label{
  display:block;font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;
  color:var(--line);margin-bottom:8px;
}
.account-dashboard input.input-text,
.account-dashboard select{
  width:100%;background:none;border:var(--hair) solid var(--ink);padding:12px 14px;
  font-size:14px;color:var(--ink);font-family:'Archivo',sans-serif;
}
.account-dashboard fieldset{border:var(--hair) solid var(--ink);padding:20px;margin-bottom:18px;}
.account-dashboard legend{font-family:'Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;padding:0 8px;}
@media (max-width:980px){
  .account-dashboard .woocommerce{grid-template-columns:1fr;}
  .account-dashboard .woocommerce-MyAccount-navigation{border-right:none;border-bottom:var(--hair) solid var(--ink);}
  .account-dashboard .woocommerce-Addresses{grid-template-columns:1fr;}
}

/* ---------- age / RUO gate -- blocks the whole site on first visit until
   both boxes are checked; remembered via localStorage so returning visitors
   who already agreed aren't asked again. Not dismissable by clicking the
   backdrop or pressing Escape -- this is a legal confirmation, not a casual
   dialog, so only the Enter/Exit buttons resolve it. ---------- */
.age-gate{
  position:fixed;inset:0;z-index:1000;
  background:rgba(26,26,26,0.85);
  display:flex;align-items:center;justify-content:center;
  padding:24px;
}
.age-gate[hidden]{display:none !important;}
.age-gate-modal{
  background:var(--white);border:var(--hair) solid var(--ink);
  max-width:560px;width:100%;padding:40px var(--edge) 36px;
}
.age-gate-modal .stamp-tag{font-size:11px;}
.age-gate-modal .stamp-rule{margin:16px 0 20px;}
.age-gate-title{
  font-family:'Archivo',sans-serif;font-size:24px;font-weight:800;text-transform:uppercase;
  letter-spacing:-0.01em;color:var(--ink);margin-bottom:14px;
}
.age-gate-lede{font-size:13.5px;line-height:1.7;color:var(--line);margin-bottom:24px;}
.age-gate-checks{border-top:var(--hair) solid var(--ink);margin-bottom:28px;}
.age-gate-check{
  display:flex;align-items:flex-start;gap:14px;padding:18px 0;
  border-bottom:var(--hair) solid var(--ink);cursor:pointer;
}
.age-gate-check input{
  margin:3px 0 0;flex:none;width:16px;height:16px;accent-color:var(--blue);cursor:pointer;
  outline:none;
}
/* The browser's native checkbox hover/focus ring renders in its own default
   blue (varies by OS/browser), not our --blue -- accent-color only controls
   the checked-state fill, not that ring, so it was showing two different
   blues side by side. Forcing the ring explicitly is the only way to make
   hover/focus match the checked color exactly. */
.age-gate-check input:hover,
.age-gate-check input:focus-visible{
  outline:2px solid var(--blue);outline-offset:2px;
}
.age-gate-check span{font-size:13px;line-height:1.6;color:var(--ink);}
.age-gate-actions{display:flex;justify-content:flex-end;}
.btn-enter{
  font-family:'Plex Mono',monospace;font-size:12px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;
  background:var(--blue);border:1px solid var(--blue);color:var(--white);
  padding:14px 32px;cursor:pointer;transition:background .15s,border-color .15s;
}
.btn-enter:hover:not(:disabled){background:#0032B8;border-color:#0032B8;}
.btn-enter:disabled{background:var(--line-faint);border-color:var(--line-faint);color:var(--line);cursor:not-allowed;}

/* Cart page stays reachable for everyone; only the Proceed to Checkout
   button itself is locked here for a visitor without an eligible account
   (see the aether-checkout-locked body class and its wp_footer script in
   functions.php). .wc-block-cart__submit-button is WooCommerce Blocks'
   own compiled class name for that link, not markup this theme renders. */
body.aether-checkout-locked .wc-block-cart__submit-button{
  pointer-events:none;opacity:.45;cursor:not-allowed;
}
.aether-checkout-note{
  font-family:'Plex Mono',monospace;font-size:11px;font-weight:500;letter-spacing:0.04em;
  color:var(--line);text-align:center;margin-top:14px;
}
.aether-checkout-note a{color:var(--blue);text-decoration:underline;}

/* ---------- footer ---------- */
footer{border-top:var(--hair) solid var(--ink);border-bottom:var(--hair) solid var(--ink);}
.foot-row{display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap;padding:18px var(--edge);}
.foot-row span{font-family:'Plex Mono',monospace;font-size:9.5px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--line);}
.footer-main{padding:56px var(--edge) 40px;border-bottom:var(--hair) solid var(--ink);}
.footer-grid{display:grid;grid-template-columns:1.3fr 1fr 1fr 1fr;gap:40px;max-width:var(--maxw);margin:0 auto;}
.footer-brand{display:flex;align-items:center;gap:10px;margin-bottom:16px;}
.footer-brand img{width:28px;height:28px;flex:none;}
.footer-brand span{font-family:'Plex Mono',monospace;font-size:12px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink);}
.footer-disclaimer{font-size:12px;line-height:1.7;color:var(--line);max-width:46ch;text-transform:uppercase;}
.footer-col h3{font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--ink);margin:0 0 16px;padding-bottom:10px;border-bottom:var(--hair) solid var(--ink);}
.footer-col ul,.footer-col .footer-nav-list{display:flex;flex-direction:column;gap:11px;list-style:none;margin:0;padding:0;}
.footer-col a,.footer-col p{font-family:'Plex Mono',monospace;font-size:11.5px;letter-spacing:0.04em;color:var(--line);margin:0;text-transform:uppercase;}
.footer-col a{transition:color .15s;}
.footer-col a:hover,.footer-col a[aria-current="page"]{color:var(--blue);}
.foot-row .foot-links{display:flex;gap:22px;flex-wrap:wrap;}
.foot-row a{font-family:'Plex Mono',monospace;font-size:9.5px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--line);transition:color .15s;}
.foot-row a:hover{color:var(--blue);}

/* ---------- Certificate of Analysis archive (Lab Results) ---------- */
/* Was max-width:960px -- narrower than the 1180px used on the per-product
   snippet below, which is why the standalone archive page's table cells
   (Net Content, Endotoxin, Heavy Metals headers/values) were wrapping onto
   two lines while the product-page version rendered clean on one. Matched
   to 1180px so both contexts render identically. */
.coa-block{max-width:1180px;margin:clamp(56px,7vw,80px) auto 0;}
/* The per-product snippet under the buy-box (single-product.php) reuses
   this same .coa-block/.coa-table markup so a real COA update on the Lab
   Results page automatically flows through here too. Matching
   .detail-grid's own max-width exactly (not removing the cap outright --
   that stretched it past 1180px on wide viewports instead) lines the two
   boxes up. */
.product-lab-results .coa-block{max-width:1180px;margin-top:clamp(40px,6vw,56px);}
/* This link sits as a sibling of .coa-block, not inside it, so without its
   own matching width+centering it was spanning the full unconstrained
   .page-section width instead of the table's 1180px box above it -- on a
   wide viewport that right-aligned it well past the table's actual right
   edge, reading as a disconnected, misplaced element. */
/* Matches the small-mono uppercase arrow-link treatment used everywhere else
   on the site for this kind of meta link (.coa-head .coa-meta, .article-meta
   .read) -- it had no font rules of its own, so it was just inheriting the
   body's default paragraph font/size, which read as noticeably larger and
   the wrong typeface next to everything around it. */
.product-lab-results .lab-results-archive-link{
  max-width:1180px;margin:12px auto 0;text-align:right;
  font-family:'Plex Mono',monospace;font-size:10.5px;letter-spacing:0.06em;text-transform:uppercase;
}
.product-lab-results .lab-results-archive-link a{color:var(--blue);}
.coa-head{display:flex;align-items:baseline;justify-content:space-between;gap:16px;padding-bottom:16px;border-bottom:var(--hair) solid var(--ink);margin-bottom:4px;flex-wrap:wrap;}
.coa-title-row{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;}
.coa-head h2{font-family:'Archivo',sans-serif;font-size:22px;font-weight:800;text-transform:uppercase;letter-spacing:-0.01em;color:var(--ink);}
/* CAS number now sits directly beside the compound name instead of over on
   the far right -- same font-size/treatment it always had as part of
   .coa-meta, just relocated. */
.coa-cas{font-family:'Plex Mono',monospace;font-size:10.5px;letter-spacing:0.06em;text-transform:uppercase;color:var(--line);}
.coa-verify-note{font-family:'Plex Mono',monospace;font-size:10px;letter-spacing:0.05em;text-transform:uppercase;color:var(--line);margin-left:auto;text-align:right;}
/* "View Compound Record" moved out of the header entirely, down to below
   the table near View Certificate's column -- it's about the table's data,
   not the title, so it reads better as a closing reference than a header
   element competing with the CAS number for the same row. */
.coa-compound-link{margin-top:14px;text-align:right;font-family:'Plex Mono',monospace;font-size:10.5px;letter-spacing:0.06em;text-transform:uppercase;}
.coa-compound-link a{color:var(--blue);}
.coa-compound-link a:hover{text-decoration:underline;}
.coa-verify{display:inline-flex;align-items:center;gap:5px;color:inherit;}
.coa-verify:hover{color:var(--blue);}
.coa-verify svg{flex:none;width:10px;height:10px;stroke:currentColor;fill:none;stroke-width:2;}
.coa-table{width:100%;border-collapse:collapse;}
.coa-table th{
  text-align:left;font-family:'Plex Mono',monospace;font-size:9.5px;font-weight:600;
  letter-spacing:0.08em;text-transform:uppercase;color:var(--line);
  padding:14px 10px 10px 4px;border-bottom:var(--hair) solid var(--ink);
}
.coa-table td{
  padding:16px 10px 16px 4px;font-size:13px;color:var(--ink);
  border-bottom:var(--hair) solid var(--line-faint);vertical-align:middle;
}
.coa-table td.mono,.coa-table th.mono{font-family:'Plex Mono',monospace;}
.coa-table tr:last-child td{border-bottom:var(--hair) solid var(--ink);}
.js .coa-table tbody tr{opacity:0;transition:opacity .5s ease;}
.js .coa-table tbody tr.is-revealed{opacity:1;}
@media (prefers-reduced-motion: reduce){
  .js .coa-table tbody tr{opacity:1 !important;transition:none !important;}
}
.status-tag{
  display:inline-flex;align-items:center;gap:6px;
  font-family:'Plex Mono',monospace;font-size:9.5px;font-weight:600;
  letter-spacing:0.06em;text-transform:uppercase;
}
.status-tag::before{content:"";width:6px;height:6px;flex:none;}
.status-tag.verified{color:var(--ink);}
.status-tag.verified::before{background:var(--blue);}
.status-tag.pending{color:var(--line);}
.status-tag.pending::before{background:var(--line-faint);border:var(--hair) solid var(--line);}
/* One-shot confirmation pop on the verified dot when its row reveals -- same
   idiom as the homepage hero's QC hotspot dot, just a single pop instead of
   an infinite pulse. .pending intentionally stays static: nothing to confirm yet. */
.js .status-tag.verified.is-revealed::before{animation:status-confirm .5s cubic-bezier(.34,1.56,.64,1);}
@keyframes status-confirm{
  0%{transform:scale(0);}
  60%{transform:scale(1.4);}
  100%{transform:scale(1);}
}
@media (prefers-reduced-motion: reduce){
  .js .status-tag.verified.is-revealed::before{animation:none;}
}
.coa-action{
  font-family:'Plex Mono',monospace;font-size:10px;font-weight:600;
  letter-spacing:0.05em;text-transform:uppercase;
  padding:8px 12px;border:var(--hair) solid var(--line-faint);color:var(--line);
  display:inline-block;cursor:not-allowed;
}
/* Once a certificate actually exists this is a real link, not a disabled
   placeholder -- swap the muted/not-allowed styling for the same
   black-at-rest, blue-on-hover language used everywhere else on the site. */
.coa-action.is-ready{
  border-color:var(--ink);color:var(--ink);cursor:pointer;
}
.coa-action.is-ready:hover{border-color:var(--blue);color:var(--blue);}

@media (max-width:980px){
  .coa-table{display:block;overflow-x:auto;}
  :root{--edge:22px;}

  /* Closed by default, Cart stays on the same line as the brand mark (only
     link visible in .utility-cell, so it's narrow enough to sit beside
     brand-cell in this row's normal flex-wrap:wrap flow -- no
     flex-direction:column here, unlike the old version of this rule).
     Opening the menu forces .utility-cell to width:100%, which can no
     longer fit next to brand-cell and so wraps onto its own full-width
     line below it -- taking the now-revealed Track Order/About Us/Contact
     Us/Portal Access links (and Cart, last in source order) with it, laid
     out edge-to-edge same as the core-nav panel below instead of squeezed
     into a narrow column. */
  .header-row--top{flex-wrap:wrap;}
  .utility-cell{flex-wrap:wrap;margin-left:auto;}

  /* Collapsed by default on any JS-capable mobile browser: every utility
     link except Cart hides until the toggle opens it. A no-JS visitor never
     gets the .js class (see header.php), so this whole block simply never
     applies there and every link stays statically visible -- same
     progressive-enhancement contract the rest of the site already uses for
     .stamp-rule etc. */
  .js .utility-cell a{
    display:none;width:100%;
    border-left:none;border-top:var(--hair) solid var(--ink);padding-left:var(--edge);
  }
  .js .utility-cell a.cart-link{
    display:flex;width:auto;margin-left:auto;border-top:none;padding-right:var(--edge);
  }
  .js .nav-open .utility-cell{width:100%;}
  .js .nav-open .utility-cell a{display:flex;}

  .js .nav-toggle{
    display:flex;align-items:center;justify-content:center;gap:9px;
    width:100%;padding:14px var(--edge);
    font-family:'Plex Mono',monospace;font-size:10.5px;font-weight:600;
    letter-spacing:0.14em;text-transform:uppercase;color:var(--ink);
    background:var(--white);border:none;border-bottom:var(--hair) solid var(--ink);
    cursor:pointer;transition:color .15s;
  }
  .js .nav-toggle:hover{color:var(--blue);}
  .nav-toggle-caret{width:15px;height:15px;flex:none;transition:transform .35s cubic-bezier(.4,0,.2,1);}
  .js .nav-open .nav-toggle-caret{transform:rotate(180deg);}

  /* Grid-row collapse: animates the panel's real (auto) height instead of
     guessing a max-height, and only ever applies once .js is present --
     without it .header-row--core stays a normal flex row, fully visible. */
  .js .header-row--core{
    display:grid;grid-template-rows:0fr;
    transition:grid-template-rows .4s cubic-bezier(.4,0,.2,1);
  }
  .js .header-row--core .core-nav{overflow:hidden;min-height:0;}
  .js .nav-open .header-row--core{grid-template-rows:1fr;}

  /* Each link needs an explicit full width here -- flex-wrap alone only
     wraps once a row's combined intrinsic widths overflow, so short items
     like "Lab Results" were sharing a line with "Compound Index" instead of
     stacking one-per-row like the utility links above them do. */
  .core-nav{flex-wrap:wrap;}
  .core-nav a{width:100%;border-left:none;border-top:var(--hair) solid var(--ink);padding-left:var(--edge);}
  .core-nav a:first-child{border-top:none;}

  .foot-row{flex-direction:column;align-items:flex-start;gap:8px;}
  .footer-grid{grid-template-columns:1fr 1fr;gap:32px 24px;}
  .policy-item{flex-direction:column;gap:10px;}
}
@media (max-width:980px) and (prefers-reduced-motion: reduce){
  .js .header-row--core{transition:none;}
  .nav-toggle-caret{transition:none;}
}

/* ---------- Affiliate Dashboard (wc-affiliate plugin, light DOM) ---------- */
/* This view (unlike the login/register screen) turned out NOT to render
   inside a Shadow DOM at all -- confirmed from the actual outerHTML, not
   guessed -- so normal CSS reaches it directly. The plugin's purple/lavender
   palette is driven by five real CSS custom properties (Tailwind v4 theme
   tokens); overriding those once retints every semantic-token utility class
   sitewide in this view (sidebar active state, buttons, badges) in one shot
   instead of fighting each utility individually. Some buttons use a
   hardcoded literal hex instead of the token though, so those are matched
   separately below via attribute-contains selectors.

   Everything in this section is wrapped in @layer utilities, matching
   Tailwind's own layer name exactly -- confirmed via DevTools that every
   rule here was losing to Tailwind's compiled utilities (e.g.
   .bg-\[\#8523F5\]{background-color:#8523F5!important}) despite higher
   selector specificity and !important on both sides. That's cascade
   layers, not specificity: for !important declarations, ANY named layer
   beats unlayered styles outright, before specificity is ever compared.
   Declaring the exact same layer name merges these rules into Tailwind's
   own bucket instead of losing to it, so normal specificity math (which
   these selectors do win) decides the outcome like it should have all
   along. */
@layer utilities {
body.affiliate-dashboard-active{
  --color-wca-body:#1A1A1A;
  --color-wca-box:#F4F4F1;
  --color-wca-primary:#0043F0;
  --color-wca-stroke:#D7DBE1;
  --color-wca-title:#1A1A1A;
}
/* Broad catch-all, not just .font-inter -- most of this UI's text sits in
   plain div/span/p tags with a Tailwind color/size utility and no font
   utility at all, inheriting Inter from a page-level default my narrower
   first pass never reached. Safe as a bare * selector here specifically
   because it's scoped to a body class that only applies on this one
   endpoint, unlike a sitewide * rule would be. */
body.affiliate-dashboard-active *{
  font-family:'Plex Mono',ui-monospace,monospace!important;
}
body.affiliate-dashboard-active h1,
body.affiliate-dashboard-active h2,
body.affiliate-dashboard-active h3{
  font-family:'Plex Mono',ui-monospace,monospace!important;font-weight:600!important;
  letter-spacing:0.04em;text-transform:uppercase;font-size:13px!important;
  color:#1A1A1A!important;
}
body.affiliate-dashboard-active [class*="text-[#2C3033]"],
body.affiliate-dashboard-active [class*="text-gray-400"],
body.affiliate-dashboard-active [class*="text-gray-500"]{
  color:#64748B!important;
}
body.affiliate-dashboard-active .rounded-xl,
body.affiliate-dashboard-active .rounded-lg,
body.affiliate-dashboard-active [class*="rounded-"]{
  border-radius:0!important;
}
body.affiliate-dashboard-active .shadow-sm,
body.affiliate-dashboard-active [class*="shadow-"]{
  box-shadow:none!important;
}
/* Buttons/badges that bake the purple in as a literal hex utility instead
   of the wca-primary token -- caught by substring match on the class
   attribute since the exact utility name varies (bg-, hover:bg-, border-,
   etc. all compile to a different literal class for the same color). */
body.affiliate-dashboard-active [class*="8523F5" i],
body.affiliate-dashboard-active [class*="7a1de0" i],
body.affiliate-dashboard-active [class*="741cf0" i],
body.affiliate-dashboard-active [class*="551999" i],
body.affiliate-dashboard-active [class*="B32FFF" i]{
  background-color:#0043F0!important;border-color:#0043F0!important;color:#FFFFFF!important;
}
body.affiliate-dashboard-active svg path[fill="#3C3C42"]{
  fill:#1A1A1A!important;
}

/* Sidebar -- confirmed exact markup this time (not guessed). It uses
   literal bracket-notation hex classes (bg-[#8523F5], text-[#2C3033], etc),
   not the wca-primary/wca-stroke tokens the CSS-variable override above
   catches, which is exactly why the sidebar stayed purple/untouched while
   other parts of the page may have picked up the variable-driven retint. */
body.affiliate-dashboard-active [class*="w-[230px]"]{
  border-radius:0!important;
  background-color:#FFFFFF!important;
  border-right:0.5px solid #D7DBE1!important;
}
body.affiliate-dashboard-active [class*="rounded-full"]{
  border-radius:9999px!important; /* avatar stays circular, only the sidebar's own corners get squared off above */
}
body.affiliate-dashboard-active [class*="text-[#04121D]"],
body.affiliate-dashboard-active [class*="text-[#2C3033]"]{
  color:#1A1A1A!important;
}
body.affiliate-dashboard-active [class*="text-[#75717C]"]{
  color:#64748B!important;
}
/* Nav links: bg-[#8523F5] on the active item, hover:bg-[#8523F5] on the
   rest -- both compile to a class containing this exact literal string. */
body.affiliate-dashboard-active a[class*="bg-[#8523F5]"],
body.affiliate-dashboard-active a[class*="hover:bg-[#8523F5]"]:hover{
  background-color:#0043F0!important;
}
body.affiliate-dashboard-active a[href][class*="rounded-lg"]{
  border-radius:0!important;
}

/* Layout: the plugin ships its own 230px sidebar on top of the one
   Portal Access already provides, inside a column that was only ever
   sized for one -- that's the actual source of the squeeze/overflow, not
   a color or font problem. Letting the whole dashboard scroll
   horizontally within its own box (instead of forcing the entire page
   layout wider) contains it without touching plugin internals I can't see
   the full structure of yet. */
body.affiliate-dashboard-active .woocommerce-MyAccount-content{
  overflow-x:auto;
}
} /* end @layer utilities */

/* ---------- Affiliate Dashboard v2 (SliceWP, plain server-rendered HTML) ---------- */
/* Switched off wc-affiliate after its Shadow-DOM/Tailwind/React frontend
   proved impossible to reliably verify without a live browser -- every fix
   was individually correct and still didn't resolve the actual visible
   result, repeatedly. SliceWP renders as plain PHP templates with normal,
   readable class names (slicewp-card, slicewp-nav-tab, etc.), no shadow
   boundary, minimal !important, no cascade layers -- confirmed directly
   from its own compiled CSS and real page output, not guessed. This entire
   block is normal light-DOM CSS, verifiable with a plain curl fetch the
   same way as every other page on this site. No @layer, no attachShadow
   patch, no attribute-substring hacks needed here. */
body.affiliate-dashboard-active .slicewp-card,
body.affiliate-dashboard-active .slicewp-list-table-wrapper,
body.affiliate-dashboard-active table.slicewp-list-table{
  border-radius:0!important;
  box-shadow:none!important;
  border:0.5px solid var(--line-faint,#D7DBE1);
}
body.affiliate-dashboard-active .slicewp-card-header{
  font-family:'Plex Mono',ui-monospace,monospace;
  font-size:11px;font-weight:600;letter-spacing:0.06em;text-transform:uppercase;
  color:var(--line,#64748B);
  border-bottom:0.5px solid var(--line-faint,#D7DBE1);
}
body.affiliate-dashboard-active .slicewp-card-title{
  font-family:'Plex Mono',ui-monospace,monospace;
  font-size:11px;font-weight:600;letter-spacing:0.06em;text-transform:uppercase;
  color:var(--line,#64748B);
}
body.affiliate-dashboard-active .slicewp-kpi-value{
  font-family:'Plex Mono',ui-monospace,monospace;
  color:var(--ink,#1A1A1A);font-weight:600;
}
body.affiliate-dashboard-active .slicewp-card-footer{
  background:none!important;
  border-top:0.5px solid var(--line-faint,#D7DBE1)!important;
}

/* Nav tabs (Dashboard / Affiliate Links / Commissions / Visits / etc.) --
   ink at rest, blue active/hover instead of the plugin's default gray. */
body.affiliate-dashboard-active .slicewp-nav-tab-wrapper .slicewp-nav-tab a{
  font-family:'Plex Mono',ui-monospace,monospace;
  font-size:11px;font-weight:600;letter-spacing:0.06em;text-transform:uppercase;
  color:var(--line,#64748B);
}
body.affiliate-dashboard-active .slicewp-nav-tab-wrapper .slicewp-nav-tab a:hover,
body.affiliate-dashboard-active .slicewp-nav-tab-wrapper .slicewp-nav-tab a:focus,
body.affiliate-dashboard-active .slicewp-nav-tab-wrapper .slicewp-nav-tab.slicewp-active a{
  border-bottom-color:var(--blue,#0043F0)!important;
  color:var(--ink,#1A1A1A)!important;
}

/* Buttons -- ink at rest, blue on hover, matching every other button on
   the site instead of the plugin's own unstyled/default look. */
body.affiliate-dashboard-active .slicewp-button-primary,
body.affiliate-dashboard-active a.slicewp-button-primary,
body.affiliate-dashboard-active button.slicewp-button-primary{
  font-family:'Plex Mono',ui-monospace,monospace!important;
  font-size:11px!important;font-weight:600!important;letter-spacing:0.06em;text-transform:uppercase;
  background:var(--ink,#1A1A1A)!important;color:#fff!important;
  border:none!important;border-radius:0!important;
  padding:10px 18px!important;
}
body.affiliate-dashboard-active .slicewp-button-primary:hover{
  background:var(--blue,#0043F0)!important;
}

/* Status pills (paid/unpaid/pending commission states, affiliate status). */
body.affiliate-dashboard-active .slicewp-status-pill{
  font-family:'Plex Mono',ui-monospace,monospace;
  font-size:9.5px;font-weight:600;letter-spacing:0.06em;text-transform:uppercase;
  border-radius:0!important;
  background:var(--line-faint,#D7DBE1)!important;color:var(--ink,#1A1A1A)!important;
}

/* Date picker / filter controls -- hairline instead of the default rounded
   pale-blue box, matching every other input/select on the site. */
body.affiliate-dashboard-active .slicewp-date-picker-wrapper .slicewp-date-picker-input,
body.affiliate-dashboard-active .slicewp-chart-time-unit-selector{
  border:0.5px solid var(--ink,#1A1A1A)!important;
  border-radius:0!important;box-shadow:none!important;
  color:var(--ink,#1A1A1A)!important;
  font-family:'Archivo',-apple-system,sans-serif!important;
}
body.affiliate-dashboard-active .slicewp-date-picker-wrapper .slicewp-date-picker-input:hover{
  border-color:var(--blue,#0043F0)!important;
}

/* Breathing room between the chart legend (e.g. "Earnings") and the
   adjacent Daily/Weekly time-unit dropdown -- they were rendering flush
   against each other with no gap. */
body.affiliate-dashboard-active .slicewp-chart-legend{
  margin-right:20px;
}
body.affiliate-dashboard-active .slicewp-chart-time-unit-selector{
  margin-left:12px;
}
