/*
 * Shared public marketing shell for home and Docs.
 * Color and type roles come from branding.css and the style guide's
 * Public marketing family section.
 */

/* Kill the topnav padding-top and container gutters so the hero runs edge to
   edge, same pattern as home.css for the live homepage. !important: base.html's
   wrapper carries Bootstrap's .py-3, which sets padding with !important.
   Shared by home, Docs and the legacy Varial X access page. */
:is(.home-concept-page, .varial-x-page) .content {
  padding-top: 0;
}
:is(.home-concept-page, .varial-x-page) .content > .container-fluid {
  padding: 0 !important;
  max-width: none;
}

.hc-page{
  --hc-accent: var(--varial-marketing-energy, #0D756C);
  --hc-font-serif: var(--varial-marketing-serif, Georgia, serif);
  --hc-bg: var(--varial-marketing-page, #F7F9F6);
  --hc-bg-subtle: var(--varial-marketing-neutral, #EDEFEA);
  --hc-surface: var(--varial-white);
  background: var(--hc-bg);
}

.hc-page h1, .hc-page h2, .hc-page h3{ margin:0; text-wrap:balance; }
.hc-page p{ margin:0; }
.hc-page a{ text-decoration:none; }
.hc-page :is(a, button, input, textarea):focus-visible{
  outline:3px solid var(--varial-marketing-energy, #0F745B);
  outline-offset:3px;
}
.hc-page section{ padding-inline: clamp(1.5rem, 9vw, 9rem); }
.hc-wrap{ max-width:68rem; margin-inline:auto; }
/* Demo section is the one element deliberately allowed to run wider than the
   rest of the page's reading column, so the video screen reads as the visual
   anchor of the page. */
.hc-wrap-wide{ max-width:88rem; margin-inline:auto; }

.hc-nav-links .hc-btn-ghost,
.hc-hero-actions .hc-btn-ghost{
  color:var(--hc-accent); background:transparent;
  border:1.5px solid var(--hc-accent);
  padding:0.4rem 0.9rem; border-radius:0.375rem; font-weight:600;
  transition:background-color .15s ease, color .15s ease;
}
.hc-nav-links .hc-btn-ghost:hover,
.hc-hero-actions .hc-btn-ghost:hover{ background:var(--varial-marketing-energy-pale); }
.hc-nav-links .hc-btn-solid,
.hc-hero-actions .hc-btn-solid{
  /* !important on color only: this exact rule already wins on specificity
     over Bootstrap's plain `a{color:...}`, confirmed by the background/
     padding/radius from this same block rendering correctly, but the text
     colour alone keeps resolving to the Bootstrap link blue anyway. Matches
     the justified !important precedent in branding.css (search "only
     `!important` can beat them") for the same class of stubborn override. */
  color:var(--varial-white) !important; background:var(--hc-accent);
  padding:0.4rem 0.9rem; border-radius:0.375rem; font-weight:600;
  transition:filter .15s ease;
}
.hc-nav-links .hc-btn-solid:hover,
.hc-hero-actions .hc-btn-solid:hover{ filter:brightness(1.08); }

/* ---------- wave divider (between hero and .hc-why) ---------- */
/* A static row of icons offset per-icon along a sine curve, echoing the
   Varial logo's own wave mark, rather than an animated bob or a scrolling
   marquee — no motion to fight the rest of the page's plain, factual tone.
   Colours match the real fuel-type colours from the bidding simulator's
   chart legend (bidding-hub.css .bidding-axis-key--*) so this reads as "the
   real building blocks", not arbitrary decoration. */
/* No explicit background: the page's base --hc-bg (pale sage) would show
   through here otherwise, since this sits between two sections that both
   force pure white — same white keeps it one continuous band with the hero
   above and .hc-why below rather than a visible sage stripe. Full-bleed
   (no .hc-wrap) with the icon set repeated 3x in the template so the row
   still reads as a dense strip rather than 8 icons stretched thin across
   the viewport; nth-child selectors use mod-8 so the colour/offset pattern
   repeats with it regardless of how many copies are in the markup. */
.hc-wave-divider{
  background:var(--hc-surface);
  padding-top:clamp(1.5rem, 4vw, 2.5rem);
  padding-bottom:clamp(2.5rem, 6vw, 4.5rem);
  padding-inline: clamp(1.5rem, 9vw, 9rem);
}
/* nowrap + space-between rather than a fixed gap: the gap itself shrinks or
   grows to fit whatever width the viewport actually has, so the row always
   stays on one line instead of a fixed gap overflowing into a wrapped
   second row on narrower (but still desktop-width) screens. */
.hc-wave-icons{
  display:flex; justify-content:space-between; align-items:center; flex-wrap:nowrap;
}
.hc-wave-icon{ display:flex; font-size:clamp(1.25rem, 2.6vw, 1.75rem); }
.hc-wave-icon:nth-child(8n+1){ color:#22C55E; transform:translateY(0); }       /* solar — VRE green */
.hc-wave-icon:nth-child(8n+2){ color:#38BDF8; transform:translateY(-0.9rem); } /* wind — light blue */
.hc-wave-icon:nth-child(8n+3){ color:#8B5CF6; transform:translateY(-1.4rem); } /* battery — storage purple */
.hc-wave-icon:nth-child(8n+4){ color:#F97316; transform:translateY(-0.9rem); } /* gas — gas orange */
.hc-wave-icon:nth-child(8n+5){ color:#1C1917; transform:translateY(0); }       /* coal */
.hc-wave-icon:nth-child(8n+6){ color:#EF4444; transform:translateY(0.9rem); }  /* demand — demand-line red */
.hc-wave-icon:nth-child(8n+7){ color:var(--hc-accent); transform:translateY(1.4rem); }
.hc-wave-icon:nth-child(8n+8){ color:var(--varial-primary); transform:translateY(0.9rem); }
@media (max-width:640px){
  /* 24 icons (the 8-icon set repeated 3x for desktop density) can't fit one
     line at mobile widths, and wrapping into rows flattened every per-icon
     transform (a same-specificity nth-child(n) override), which lost the
     wave and read as an unstyled icon grid. Drop back to a single copy of
     the 8-icon set and shrink it instead, so the wave still fits on one line. */
  .hc-wave-divider{ padding-inline: clamp(1.25rem, 6vw, 2rem); }
  .hc-wave-icons{ flex-wrap:nowrap; justify-content:space-between; padding-block:0.5rem; }
  .hc-wave-icon{ font-size:1rem; }
  .hc-wave-icon:nth-child(n+9){ display:none; }
}

/* ---------- hero ---------- */
.hc-hero{
  background:var(--hc-surface);
  min-height:92vh;
  display:flex; align-items:center;
}
.hc-hero > section{ width:100%; }
.hc-hero-body{
  padding-block: clamp(3rem, 9vw, 6.5rem) clamp(3.5rem, 10vw, 7.5rem);
  display:flex; flex-direction:column; align-items:center; text-align:center;
  gap:1.5rem;
  /* Keep the hero headline and actions centred while allowing the
     headline to break naturally at desktop and mobile widths. */
  max-width:74rem; margin-inline:auto;
}
.hc-hero-logo{ display:block; }
.hc-hero h1{
  color:var(--varial-primary);
  font-family:var(--hc-font-serif);
  font-weight:600;
  font-size: clamp(2.25rem, 6vw, 4.25rem);
  line-height:1.08;
  letter-spacing:-0.015em;
}
/* The italic phrase uses the real italic serif face loaded by the home page. */
.hc-hero h1 em, .hc-close-band h2 em{ font-style:italic; }
.hc-hero-tagline-group{ display:flex; flex-direction:column; gap:0.25rem; }
.hc-hero-scope{
  font-family:var(--varial-font-family); font-size:1.375rem; font-weight:400;
  color:var(--varial-gray-800);
}
.hc-hero-credential{
  font-family:var(--varial-font-family); font-size:1.375rem; font-weight:400;
  color:var(--varial-gray-800);
}
.hc-hero-credential .hc-typed{ color:var(--hc-accent); font-weight:700; }
/* Width is fixed to the widest phrase (set in JS, home_concept.js) so the
   box never resizes between words, keeping "Built to be" from shifting.
   text-align:left for a normal typewriter reveal (fills left-to-right,
   trailing gap on the right while typing). display:inline-block so the
   JS-set width takes effect (width has no effect on inline). */
.hc-hero-credential .hc-typed{ display:inline-block; text-align:left; white-space:nowrap; }
.hc-hero-credential .hc-typed::after{
  content:"";
  display:inline-block; width:2px; height:1em; margin-left:2px;
  background:currentColor; vertical-align:-0.15em;
  animation: hc-caret-blink 1s step-end infinite;
}
@keyframes hc-caret-blink{ 50%{ opacity:0; } }
.hc-hero-cta{ display:flex; flex-direction:column; gap:0.75rem; align-items:center; }
.hc-hero-actions{ display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:0.75rem; }
.hc-hero-signup{
  display:flex; align-items:stretch;
  border:1px solid var(--varial-border);
  border-radius:0.625rem;
  background:var(--hc-surface);
  box-shadow:0 10px 24px rgba(13, 27, 46, 0.08);
  overflow:hidden;
}
.hc-hero-signup-input{
  flex:1 1 auto; min-width:14rem; border:none; outline:none;
  padding:0 1.1rem; font-size:1rem; font-family:var(--varial-font-family);
  color:var(--varial-gray-800); background:none;
}
.hc-hero-signup-input::placeholder{ color:var(--varial-gray-400); }
.hc-hero-signup .hc-btn-accent{ border-radius:0; box-shadow:none; }
.hc-hero-signup .hc-btn-accent:hover{ transform:none; }
.hc-hero-login-link{
  font-size:0.875rem; color:var(--varial-gray-400); text-decoration:none;
}
.hc-hero-login-link:hover{ color:var(--varial-primary); text-decoration:underline; }
.hc-btn{
  /* Not --varial-font-heading: that resolves to Space Grotesk, the same
     generic display-font pairing this page moved headings off of (see the
     AI-tell audit). Base body font instead, same as the nav links. */
  font-family:var(--varial-font-family); font-weight:700; font-size:1rem;
  padding:0.85rem 1.5rem; border-radius:0.625rem; border:none;
  display:inline-flex; align-items:center; gap:0.5rem;
  transition:transform .12s ease, box-shadow .12s ease;
  cursor:pointer;
}
.hc-btn:hover{ transform:translateY(-2px); }
/* Filled, saturated brand colours on every CTA rather than one dominant
   accent plus outlines: "popping" was the explicit ask, using colours the
   brand already has (or close variants of them) rather than new ones. */
.hc-btn-amber{
  background:var(--varial-amber); color:var(--varial-nav);
  box-shadow:0 4px 0 0 var(--varial-amber-dark), 0 10px 24px rgba(245, 158, 11, 0.35);
}
.hc-btn-blue{
  background:var(--varial-primary); color:var(--varial-white);
  box-shadow:0 4px 0 0 var(--varial-primary-dark), 0 10px 24px rgba(37, 99, 235, 0.35);
}
.hc-btn-green{
  background:var(--varial-green); color:var(--varial-white);
  box-shadow:0 4px 0 0 var(--varial-green-dark), 0 10px 24px rgba(22, 163, 74, 0.35);
}
.hc-btn-purple{
  background:var(--varial-purple); color:var(--varial-white);
  box-shadow:0 4px 0 0 color-mix(in srgb, var(--varial-purple) 72%, black),
    0 10px 24px color-mix(in srgb, var(--varial-purple) 35%, transparent);
}
.hc-btn-accent{
  background:var(--hc-accent); color:var(--varial-white);
  box-shadow:0 4px 0 0 var(--varial-marketing-energy-hover), 0 10px 24px rgba(13, 117, 108, 0.3);
}


/* ---------- why ---------- */
/* Antigravity-style: plain white, a point on one side and its product
   screenshot in a bordered card on the other, one row per point, sides
   alternating for rhythm rather than stacking both shots on the same side.
   Sits on the hero's own white rather than starting the white -> pale sage ->
   darker sage -> white rhythm at .hc-steps below early. */
.hc-why{
  background:var(--hc-surface);
  padding-block: clamp(2rem, 5vw, 3rem) clamp(4rem, 9vw, 6rem);
}
.hc-why-head{
  max-width:80rem;
  margin:0 auto clamp(2.5rem, 6vw, 4rem);
  padding-top:clamp(1rem, 3vw, 2rem);
  text-align:center;
}
.hc-why-head h2{
  color:var(--varial-gray-900);
  font-family:var(--hc-font-serif);
  font-size:clamp(1.75rem, 3.2vw, 2.5rem);
  font-weight:600;
  letter-spacing:-0.01em;
}
.hc-why-head p{
  max-width:42rem;
  margin:0.7rem auto 0;
  color:var(--varial-gray-500);
  font-size:clamp(1rem, 1.6vw, 1.125rem);
  line-height:1.5;
}
.hc-why-row{
  display:grid; grid-template-columns:minmax(0, 1fr) minmax(0, 1fr); gap:clamp(3rem, 7vw, 6rem);
  align-items:center;
  min-height:clamp(30rem, 62vh, 42rem);
  max-width:80rem; margin:0 auto;
}
.hc-why-row + .hc-why-row{ margin-top:clamp(2rem, 5vw, 4rem); }
.hc-why-row--reverse .hc-why-text{ order:2; }
.hc-why-row--reverse .hc-why-shot{ order:1; }
.hc-why-text h3{
  font-family:var(--hc-font-serif);
  font-size:clamp(1.375rem, 2.4vw, 1.75rem); font-weight:600; letter-spacing:-0.005em;
  margin-bottom:0.75rem;
}
.hc-why-text p{
  font-size:1rem; line-height:1.65;
  color:var(--varial-gray-400);
}
.hc-why-cta{ margin-top:1.5rem; }
/* The source screenshots are short and wide (2880x1296), so at natural
   aspect ratio inside an 80vh row they render small no matter the column
   width. Crop them into a taller fixed box instead via object-fit:cover,
   anchored right: both screenshots have an internal staff-only nav sidebar
   down their left edge (not meant for a public page), so cropping from the
   right conveniently excludes it rather than needing separately-cropped
   source images. */
.hc-why-shot{
  min-width:0;
  height:clamp(24rem, 58vh, 38rem);
  border-radius:1rem;
  border:1px solid var(--varial-border);
  box-shadow:0 24px 60px rgba(13, 27, 46, 0.14);
  overflow:hidden;
}
.hc-why-shot-img{
  display:block; width:100%; height:100%;
  object-fit:cover; object-position:right top;
}
@media (max-width:820px){
  .hc-why-row{ grid-template-columns:1fr; }
  .hc-why-row--reverse .hc-why-text, .hc-why-row--reverse .hc-why-shot{ order:initial; }
  /* Stacked to one column, left-aligned text (fine in the two-column layout,
     next to the screenshot) reads lopsided on a full-width mobile block —
     centre it and its CTA to match the hero and every other stacked section. */
  .hc-why-text{ text-align:center; }
  /* .hc-why-shot's fixed clamp() height + overflow:hidden exists to crop the
     wide static screenshots to a consistent box (see the source-screenshot
     comment above) — for the interactive mocks it instead crops real content
     (e.g. the deal-valuation benchmark box) that can't be trimmed the same
     way. Let these widgets size to their own content instead; overflow:hidden
     stays for the rounded corners, but nothing is left for it to crop. */
  .hc-why-shot--interactive{ height:auto; }
}

/* ---------- "price it" interactive mock (replaces a static screenshot) ---------- */
/* .hc-why-shot's fixed height + border/shadow card treatment is unchanged;
   only the contents swap from a cropped <img> to a live widget. Structure
   now mirrors the real product pattern this is standing in for (Supply/
   Commodity/Demand charts on top, a quick-adjust table underneath) rather
   than two side-by-side mini-charts: one chart with both scenario lines,
   one table row driving it via the same green-down/pink-up pill buttons
   the real Retirements/Commodity/Demand modifier tables use. */
.hc-why-shot--interactive{ background:var(--hc-surface); }
.hc-priceit{
  box-sizing:border-box;
  min-width:0;
  height:100%;
  display:flex; flex-direction:column;
  padding: clamp(1rem, 2.5vw, 1.75rem);
  gap: clamp(0.35rem, 1vw, 0.625rem);
}
.hc-priceit-vars{
  display:grid; grid-template-columns:repeat(3, minmax(0, 1fr)); gap:0.45rem;
}
.hc-priceit-var{
  display:flex; align-items:center; gap:0.35rem; min-width:0;
  background:var(--hc-bg-subtle); border:1px solid var(--varial-border);
  border-radius:0.5rem; padding:0.4rem 0.45rem; cursor:pointer;
  font-family:var(--varial-font-mono); color:var(--varial-gray-500); text-align:left;
  transition:background-color .15s ease, color .15s ease, border-color .15s ease, transform .15s ease, box-shadow .15s ease;
}
.hc-priceit-var-step{
  display:inline-flex; align-items:center; justify-content:center; flex:0 0 auto;
  width:1.15rem; height:1.15rem; border-radius:50%;
  background:var(--hc-accent); color:var(--varial-white); font-size:0.62rem; font-weight:700;
}
.hc-priceit-var-copy{ display:flex; flex-direction:column; min-width:0; gap:0.06rem; }
.hc-priceit-var-copy > span{
  overflow:hidden; color:currentColor; font-size:0.52rem; font-weight:700;
  letter-spacing:0.035em; line-height:1.1; text-overflow:ellipsis; text-transform:uppercase; white-space:nowrap;
}
.hc-priceit-var-copy strong{
  overflow:hidden; color:var(--varial-gray-800); font-size:0.6rem; font-weight:700;
  letter-spacing:0.025em; line-height:1.15; text-overflow:ellipsis; text-transform:uppercase; white-space:nowrap;
}
.hc-priceit-var:hover{ color:var(--varial-gray-900); border-color:var(--hc-accent); transform:translateY(-1px); box-shadow:0 2px 5px rgba(13, 148, 136, 0.13); }
.hc-priceit-var:focus-visible,
.hc-priceit-btn:focus-visible{ outline:2px solid var(--varial-primary); outline-offset:2px; }
.hc-priceit-var.is-active{
  background:var(--hc-accent); border-color:var(--hc-accent); color:var(--varial-white);
}
.hc-priceit-var.is-active .hc-priceit-var-step{ background:rgba(255, 255, 255, 0.2); }
.hc-priceit-var.is-active .hc-priceit-var-copy strong{ color:var(--varial-white); }
.hc-priceit-chart{ width:100%; flex:1; min-height:0; display:block; }
.hc-priceit-gridline{ stroke:var(--varial-border); stroke-width:1; }
.hc-priceit-line{ fill:none; stroke-width:2; stroke-linejoin:round; }
/* Dashed grey history vs. solid coloured forecast — the same convention as
   the real Commodity/Demand charts this mock is standing in for. */
.hc-priceit-line--hist{ stroke:var(--varial-gray-400); stroke-dasharray:4 3; }
.hc-priceit-line--fore[data-scenario="a"]{ stroke:var(--varial-primary); }
.hc-priceit-line--fore[data-scenario="b"]{ stroke:var(--varial-amber-dark); }
.hc-priceit-axis-tick{
  font-family:var(--varial-font-mono); font-size:9px;
  fill:var(--varial-gray-400); text-anchor:middle;
}
.hc-priceit-axis-tick:first-of-type{ text-anchor:start; }
.hc-priceit-axis-tick:last-of-type{ text-anchor:end; }
.hc-priceit-chart-label{
  font-family:var(--varial-font-mono); font-size:0.5625rem; letter-spacing:0.02em;
  color:var(--varial-gray-400); text-align:center;
}

/* Class-based hide, not the [hidden] attribute/`.hidden` IDL property: some
   browsers don't reflect `.hidden = true` to the content attribute on <svg>
   elements the way they do on HTML elements, which left a chart's old,
   already-drawn paths visibly on screen after switching away from it and
   back. Two classes combined outrank the single-class display rules above
   regardless of source order, so this always wins. */
.hc-priceit-chart.hc-mock-hide,
.hc-valueit-chart.hc-mock-hide,
.hc-valueit-empty.hc-mock-hide{ display:none; }

/* Plain hand-styled table (not Bootstrap's .table): a minimal stand-in for
   the real Tabulator-driven Retirements/Commodity/Demand Modifiers grids,
   which need live warehouse data this marketing page doesn't have. */
.hc-priceit-table{
  width:100%; min-width:0; table-layout:fixed; border-collapse:collapse;
  font-family:var(--varial-font-family);
}
.hc-priceit-table th:first-child, .hc-priceit-table td:first-child{ width:28%; }
.hc-priceit-table th, .hc-priceit-table td{
  min-width:0; overflow:hidden;
  border:1px solid var(--varial-border);
  padding:0.3rem 0.25rem;
}
.hc-priceit-th{
  font-family:var(--varial-font-mono); font-size:0.6875rem; font-weight:700;
  letter-spacing:0.03em; text-transform:uppercase; text-align:center;
  background:var(--hc-bg);
}
.hc-priceit-th--a{ color:var(--varial-primary); }
.hc-priceit-th--b{ color:var(--varial-amber-dark); }
.hc-priceit-row-label{ font-size:0.72rem; color:var(--varial-gray-600); overflow-wrap:anywhere; }
/* Green = decrease, pink = increase — the same diverging colour coding as
   the real quick-adjust cells (Retirements' -1Y/-1M vs +1M/+1Y, Commodity/
   Demand Modifiers' -10%/-1% vs +1%/+10%), just two steps instead of four. */
.hc-priceit-adjust{ display:flex; align-items:center; justify-content:center; gap:0.15rem; min-width:0; }
.hc-priceit-btn{
  border:none; border-radius:0.3125rem; cursor:pointer;
  flex:0 1 auto; padding:0.2rem 0.25rem;
  font-family:var(--varial-font-mono); font-size:0.625rem; font-weight:700;
  transition:filter .15s ease, opacity .15s ease;
}
.hc-priceit-btn:hover:not(:disabled){ filter:brightness(0.96); }
.hc-priceit-btn:disabled{ opacity:0.35; cursor:not-allowed; }
.hc-priceit-btn--down{ background:var(--varial-green-light, #DCFCE7); color:var(--varial-green-dark); }
.hc-priceit-btn--up{ background:rgba(220, 38, 38, 0.12); color:var(--varial-danger); }
.hc-priceit-value{
  font-family:var(--varial-font-mono); font-size:0.7rem; font-weight:600;
  color:var(--varial-gray-900); min-width:2.25rem; text-align:center;
}
@media (max-width:520px){
  .hc-priceit-vars{ grid-template-columns:1fr; gap:0.6rem; }
  /* Same padding/gap and text-size bump the Value-it pills get below —
     shared .hc-priceit-var class, so both widgets' buttons stop reading as
     cramped on a real phone at once. */
  .hc-priceit-var{ padding:0.55rem 0.6rem; gap:0.5rem; }
  .hc-priceit-var-step{ width:1.4rem; height:1.4rem; }
  .hc-priceit-var-copy > span{ font-size:0.625rem; }
  .hc-priceit-var-copy strong{ font-size:0.7rem; }
  .hc-priceit-table{ font-size:0.75rem; }
  .hc-priceit-value{ min-width:2.25rem; }
}

/* ---------- deal valuation preview ---------- */
.hc-dealit{
  box-sizing:border-box;
  height:100%;
  display:flex;
  flex-direction:column;
  gap:clamp(0.6rem, 1.4vw, 1rem);
  padding:clamp(1rem, 2.5vw, 1.75rem);
  background:var(--hc-surface);
}
.hc-dealit-topbar,
.hc-dealit-benchmark-head{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:0.75rem;
}
.hc-dealit-topbar strong{
  display:block;
  margin-top:0.15rem;
  color:var(--varial-gray-900);
  font-size:clamp(1rem, 1.6vw, 1.25rem);
}
.hc-dealit-eyebrow,
.hc-dealit-benchmark-head{
  font-family:var(--varial-font-mono);
  font-size:0.625rem;
  font-weight:700;
  letter-spacing:0.04em;
  text-transform:uppercase;
}
.hc-dealit-eyebrow{ color:var(--varial-gray-500); }
.hc-dealit-status{
  flex:0 0 auto;
  border-radius:999px;
  padding:0.25rem 0.55rem;
  color:var(--varial-green-dark);
  background:var(--varial-green-bg-light);
  font-size:0.75rem;
  font-weight:700;
}
.hc-dealit-metrics{
  display:grid;
  grid-template-columns:repeat(3, minmax(0, 1fr));
  gap:0.5rem;
}
.hc-dealit-metrics div{
  min-width:0;
  padding:0.65rem;
  border:1px solid var(--varial-border);
  border-radius:0.5rem;
  background:var(--hc-bg-subtle);
}
.hc-dealit-metrics span{
  display:block;
  color:var(--varial-gray-500);
  font-size:0.625rem;
  line-height:1.3;
}
.hc-dealit-metrics strong{
  display:block;
  margin-top:0.25rem;
  color:var(--varial-gray-900);
  font-size:clamp(0.9rem, 1.5vw, 1.1rem);
}
.hc-dealit-chart{
  padding:0.65rem 0.75rem 0.5rem;
  border:1px solid var(--varial-border);
  border-radius:0.5rem;
}
.hc-dealit-chart-head{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:0.5rem;
  color:var(--varial-gray-500);
  font-family:var(--varial-font-mono);
  font-size:0.625rem;
  font-weight:700;
  letter-spacing:0.04em;
  text-transform:uppercase;
}
.hc-dealit-chart-head > span:last-child{ display:flex; align-items:center; gap:0.25rem; font-size:0.55rem; }
.hc-dealit-key{ display:inline-block; width:0.8rem; border-top:2px solid var(--hc-accent); }
.hc-dealit-key--historic{ border-top-color:var(--varial-gray-500); border-top-style:dashed; }
.hc-dealit-key--sensitivity{ border-top-color:var(--varial-primary); border-top-style:dashed; }
.hc-dealit-chart svg{ display:block; width:100%; height:auto; margin-top:0.3rem; overflow:visible; }
.hc-dealit-chart svg > line{ stroke:var(--varial-border); stroke-width:1; }
.hc-dealit-chart-split{ stroke:var(--varial-gray-400); stroke-dasharray:3 3; }
.hc-dealit-chart-historic,
.hc-dealit-chart-forecast,
.hc-dealit-chart-sensitivity{ fill:none; stroke-linecap:round; stroke-linejoin:round; stroke-width:2.5; }
.hc-dealit-chart-historic{ stroke:var(--varial-gray-500); stroke-dasharray:5 4; }
.hc-dealit-chart-forecast{ stroke:var(--hc-accent); }
.hc-dealit-chart-sensitivity{ stroke:var(--varial-primary); stroke-dasharray:5 4; }
.hc-dealit-chart-point--historic{ fill:var(--varial-white); stroke:var(--varial-gray-500); stroke-width:2; }
.hc-dealit-chart-point--forecast{ fill:var(--hc-accent); stroke:var(--varial-white); stroke-width:1.5; }
.hc-dealit-chart-point--sensitivity{ fill:var(--varial-white); stroke:var(--varial-primary); stroke-width:2; }
.hc-dealit-chart text{
  fill:var(--varial-gray-500);
  font-family:var(--varial-font-mono);
  font-size:8px;
  text-anchor:middle;
}
.hc-dealit-benchmark{
  margin-top:auto;
  padding:0.75rem;
  border:1px solid var(--varial-border);
  border-radius:0.5rem;
}
.hc-dealit-benchmark-head{ color:var(--varial-gray-500); }
.hc-dealit-benchmark-head span:last-child{ color:var(--hc-accent); }
.hc-dealit-bars{
  display:grid;
  grid-template-columns:repeat(4, 1fr);
  align-items:end;
  gap:0.35rem;
  height:3.25rem;
  margin-block:0.5rem;
}
.hc-dealit-bars i{ display:block; border-radius:0.25rem 0.25rem 0 0; background:var(--varial-primary-bg); }
.hc-dealit-bars i:nth-child(1){ height:42%; }
.hc-dealit-bars i:nth-child(2){ height:64%; }
.hc-dealit-bars i:nth-child(3){ height:51%; }
.hc-dealit-bars i:nth-child(4){ height:86%; background:var(--hc-accent); }
.hc-dealit-benchmark p{ color:var(--varial-gray-500); font-size:0.75rem; line-height:1.35; }
@media (max-width:520px){
  /* The metric cards, chart and benchmark box all share one fixed-height
     .hc-why-shot column (clamp(24rem, 58vh, 38rem)) that overflow:hidden
     crops — three roomy cards left too little of that budget for the chart,
     which is the thing worth reading here. Slimmer rows (padding/gap) hand
     that space back to the chart below. */
  .hc-dealit-metrics{ grid-template-columns:1fr; gap:0.3rem; }
  .hc-dealit-metrics div{
    display:flex; align-items:center; justify-content:space-between; gap:0.75rem;
    padding:0.35rem 0.6rem;
  }
  .hc-dealit-metrics strong{ margin:0; }
  .hc-dealit-metrics span{ font-size:0.6875rem; }
}

/* ---------- "value it" interactive mock (replaces a static screenshot) ---------- */
/* Drag (or tap) a position tile from the tray into the portfolio dropzone;
   the chart is one violin per included position plus a combined "Portfolio"
   violin, redrawn from the exact same tile set on every add/remove — the
   same "one state, one chart" rule as the Price-it mock above, just with
   the state being "which tiles are in the dropzone" instead of a table row. */
.hc-valueit{
  height:100%;
  display:flex; flex-direction:column;
  padding: clamp(1rem, 2.5vw, 1.75rem);
  gap: clamp(0.375rem, 1vw, 0.625rem);
}
.hc-valueit-controls{
  display:flex;
  flex-direction:column;
  gap:0.55rem;
  padding-bottom:0.6rem;
  border-bottom:1px solid var(--varial-border);
}
.hc-valueit-control-group{
  min-width:0;
  display:grid;
  grid-template-columns:8.75rem minmax(0, 1fr);
  align-items:center;
  gap:0.6rem;
}
.hc-valueit-control-group + .hc-valueit-control-group{
  padding-top:0.55rem;
  border-top:1px solid var(--varial-border);
}
/* Position names carry more semantic weight than the short price labels.
   Give their choices a full line rather than squeezing four controls beside
   the step label, while retaining the intended Step 1 → Step 2 → review
   reading order. */
.hc-valueit-control-group:nth-child(2){
  grid-template-columns:1fr;
  gap:0.4rem;
}
/* Numbered step labels making the causal order explicit — same numbered-
   badge language as .hc-step-num in the "Three simple steps" section below,
   scaled down for this denser widget. Purely a label row: it doesn't gate
   or hide the row under it, every step is visible and usable at once. */
.hc-valueit-step{
  display:flex; align-items:center; gap:0.4rem;
}
.hc-valueit-step-num{
  display:flex; align-items:center; justify-content:center; flex-shrink:0;
  width:1.125rem; height:1.125rem; border-radius:50%;
  background:var(--hc-accent); color:var(--varial-white);
  font-family:var(--varial-font-mono); font-size:0.625rem; font-weight:700;
}
.hc-valueit-step-label{
  font-family:var(--varial-font-mono); font-size:0.6875rem; font-weight:600;
  letter-spacing:0.03em; text-transform:uppercase; color:var(--varial-gray-500);
}
/* Same pill look as .hc-priceit-var (shared class, no separate style rule
   needed) so both steps read as the same "pick an input" pattern — step 1
   (price) and step 2 (positions) are now the identical multi-select toggle
   interaction, just over a different set of options. Both may have zero,
   some, or all options selected; see home_concept.js for the empty-state
   handling when either is at zero. */
.hc-valueit-price-tabs, .hc-valueit-position-tabs{ display:grid; gap:0.35rem; }
.hc-valueit-price-tabs{ grid-template-columns:repeat(3, minmax(0, 1fr)); }
.hc-valueit-position-tabs{ grid-template-columns:repeat(4, minmax(0, 1fr)); }
.hc-valueit-price-tabs .hc-priceit-var,
.hc-valueit-position-tabs .hc-priceit-var{
  justify-content:center;
  min-width:0;
  min-height:2.15rem;
  padding:0.4rem 0.5rem;
  white-space:nowrap;
}
/* Per-position colour, reused from the wave-divider's fuel-type colours
   above (wind/battery/demand) rather than inventing a new palette; PPA (a
   contract, not a physical asset) gets the page's amber instead. Applied to
   the icon only — unselected/selected state is still carried by is-active,
   same as the price pills. */
.hc-valueit-position-tabs [data-position="wind"] i{ color:#38BDF8; }
.hc-valueit-position-tabs [data-position="bess"] i{ color:#8B5CF6; }
.hc-valueit-position-tabs [data-position="ppa"] i{ color:var(--varial-amber-dark); }
.hc-valueit-position-tabs [data-position="retail"] i{ color:#EF4444; }
.hc-valueit-position-tabs .hc-priceit-var.is-active i{ color:inherit; }

.hc-valueit-results{
  flex:1; min-height:0;
  display:flex; align-items:center; justify-content:center;
}
.hc-valueit-results .hc-valueit-chart{ align-self:stretch; }
.hc-valueit-empty{
  font-family:var(--varial-font-mono); font-size:0.8125rem; line-height:1.5;
  color:var(--varial-gray-400); text-align:center; max-width:20rem;
}
.hc-valueit-chart{ width:100%; flex:1; min-height:0; display:block; }
.hc-valueit-violin{ fill-opacity:0.5; stroke-width:1.5; }
.hc-valueit-violin--portfolio{ fill-opacity:0.28; stroke-width:2; }
.hc-valueit-median{ stroke-width:2; }
.hc-valueit-col-label{
  font-family:var(--varial-font-mono); font-size:9px; text-anchor:middle;
  fill:var(--varial-gray-500);
}
.hc-valueit-col-value{
  font-family:var(--varial-font-mono); font-size:10px; font-weight:700; text-anchor:middle;
  fill:var(--varial-gray-900);
}
.hc-valueit-col-label--portfolio, .hc-valueit-col-value--portfolio{ fill:var(--hc-accent); }
.hc-valueit-disclosure{
  color:var(--varial-gray-500);
  font-size:0.625rem;
  line-height:1.35;
  text-align:center;
}
@media (max-width:520px){
  .hc-valueit-control-group{ grid-template-columns:1fr; gap:0.4rem; }
  .hc-valueit-control-group + .hc-valueit-control-group{
    padding-top:0.55rem;
  }
  .hc-valueit-position-tabs{ grid-template-columns:repeat(2, minmax(0, 1fr)); }
}

@media (max-width:480px){
  .hc-nav-links .hc-btn-solid,
  .hc-nav-links .hc-btn-ghost{ padding:0.4rem 0.6rem; font-size:0.8125rem; }
  .hc-hero-actions{ width:100%; }
  .hc-hero-actions .hc-btn-solid,
  .hc-hero-actions .hc-btn-ghost{ flex:1 1 10rem; justify-content:center; text-align:center; }
}

@media (prefers-reduced-motion:reduce){
  .hc-page .hc-typed::after{ animation:none; }
  .hc-page :is(a, button){ transition:none; }
}

/* ---------- steps ---------- */
/* Same background as .hc-demo below and no divider between them: the two
   read as one continuous band ("Three simple steps" flowing straight into
   "See how easy it is") rather than two slightly-different off-white
   sections stacked with a seam. --hc-bg (paler) rather than --hc-bg-subtle
   (used by .hc-layers below): the page now steps white -> pale sage ->
   darker sage -> white, so this band reads as a middle tone between the
   white hero and the darker-sage "what Varial's platform provides". */
.hc-steps{
  background:var(--hc-bg);
  padding-block: clamp(2.5rem, 6vw, 4rem) clamp(1.25rem, 3vw, 1.75rem);
}
.hc-steps-head{ margin-bottom: clamp(1.25rem, 3vw, 2rem); }
.hc-steps-head h2{
  font-family:var(--hc-font-serif);
  font-size:clamp(1.75rem, 3.2vw, 2.5rem);
  font-weight:600; letter-spacing:-0.01em;
}
.hc-steps-grid{
  display:grid; grid-template-columns:repeat(3, 1fr); gap:0;
  border-top:1px solid var(--varial-border);
  text-align:center;
}
.hc-step{
  padding: 1.5rem 2.25rem;
  border-right:1px solid var(--varial-border);
}
.hc-step:last-child{ border-right:none; }
.hc-step-num{
  font-family:var(--varial-font-mono); font-weight:500; font-size:0.9rem;
  display:block; margin-bottom:1.5rem;
}
.hc-step:nth-child(1) .hc-step-num{ color:var(--hc-accent); }
/* amber-dark, not amber: the lighter amber is low-contrast at this size
   against the sage-gray page background. */
.hc-step:nth-child(2) .hc-step-num{ color:var(--varial-amber-dark); }
.hc-step:nth-child(3) .hc-step-num{ color:var(--varial-green); }
/* Every step's heading is wrapped in .hc-step-head now, even the two
   without a timer badge, so all three columns share identical markup and
   the same computed row height — a bare h3 in one column and a flex-wrapped
   h3 in another rendered at very slightly different heights and threw the
   body text below out of alignment across columns. */
.hc-step-head{ display:flex; align-items:center; justify-content:center; gap:0.625rem; margin-bottom:0.625rem; }
.hc-step-head h3{ margin-bottom:0; }
.hc-step h3{
  font-family:var(--hc-font-serif);
  font-size:1.25rem; font-weight:600; letter-spacing:-0.005em;
}
.hc-step p{ font-size:0.9375rem; color:var(--varial-gray-400); line-height:1.55; }
.hc-step-timer{
  font-family:var(--varial-font-mono); font-weight:500; font-size:0.75rem;
  letter-spacing:0.05em; text-transform:uppercase;
  color:var(--varial-amber-dark);
}

/* ---------- demo video ---------- */
.hc-demo{
  background:var(--hc-bg);
  padding-block: clamp(1.5rem, 3vw, 2rem) clamp(4rem, 9vw, 6rem);
  border-bottom:1px solid var(--varial-border);
}
/* Small label-plus-rules divider, not a heading: with "Three simple steps"
   and this section now reading as one continuous band (no border between
   them, see .hc-steps above), a second full-size h2 here duplicated the
   weight of "Three simple steps" a few hundred pixels above it. Qualified by
   parent for the same specificity reason .hc-demo-head used to need. */
.hc-demo .hc-section-divider{
  display:flex; align-items:center; justify-content:center; gap:1rem;
  font-family:var(--varial-font-mono); font-weight:600; font-size:0.75rem;
  letter-spacing:0.08em; text-transform:uppercase;
  color:var(--varial-gray-400);
  margin-bottom:clamp(1.5rem, 3vw, 2rem);
}
.hc-demo .hc-section-divider::before,
.hc-demo .hc-section-divider::after{
  content:"";
  width:2.5rem; height:1px;
  background:var(--varial-border);
}
/* Price-it / Value-it switch now lives in the browser-chrome bar, alongside
   the mock url, rather than as its own row above the frame — a single
   segmented pill reads as one obvious control instead of a heading-like tab
   pair floating over the demo. */
.hc-demo-frame-tabs{
  display:flex; gap:0.125rem;
  background:var(--hc-bg-subtle);
  border-radius:999px;
  padding:0.1875rem;
}
.hc-demo-tab{
  background:none; border:none; cursor:pointer;
  padding:0.3rem 0.75rem; border-radius:999px;
  font-family:var(--varial-font-mono); font-weight:600; font-size:0.75rem;
  letter-spacing:0.03em; text-transform:uppercase;
  color:var(--varial-gray-400);
  transition:color .15s ease, background-color .15s ease;
}
.hc-demo-tab:hover{ color:var(--varial-gray-900); }
.hc-demo-tab.is-active{ color:var(--varial-white); background:var(--hc-accent); }
/* Height-capped, not just width-capped: aspect-ratio:16/9 at full container
   width made this taller than a typical viewport, pushing the frame (and
   the CTA/close band below it) past the fold. Deriving width from a target
   viewport-height keeps the whole demo section on screen; max-width:100%
   still lets it shrink to fill narrower viewports. */
.hc-demo-frame{
  position:relative;
  aspect-ratio:16/9;
  width:calc(66vh * 16 / 9);
  max-width:100%;
  margin-inline:auto;
  border-radius:1.25rem;
  overflow:hidden;
  background:var(--hc-surface);
  border:1px solid var(--varial-border);
  box-shadow:0 24px 60px rgba(13, 27, 46, 0.14);
}
.hc-demo-frame-bar{
  position:relative; z-index:1;
  display:flex; align-items:center; justify-content:space-between; gap:1rem;
  padding:0.75rem 1rem;
  border-bottom:1px solid var(--varial-border);
}
.hc-demo-frame-url{
  font-family:var(--varial-font-mono); font-size:0.6875rem; color:var(--varial-gray-400);
}
.hc-demo-frame-play{
  position:absolute; inset:0;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:1rem;
}
.hc-demo-play-btn{
  width:4rem; height:4rem; border-radius:50%;
  background:var(--varial-amber);
  display:flex; align-items:center; justify-content:center;
  box-shadow:0 4px 0 0 var(--varial-amber-dark), 0 14px 32px rgba(245, 158, 11, 0.3);
  transition:transform .15s ease;
}
.hc-demo-frame:hover .hc-demo-play-btn{ transform:scale(1.06); }
.hc-demo-frame-label{
  font-family:var(--varial-font-mono); font-size:0.75rem; letter-spacing:0.05em;
  text-transform:uppercase; color:var(--varial-gray-400);
}

/* ---------- "What Varial's platform provides": physical, weather, commercial, earnings, portfolio layers ---------- */
/* Sage, not white: white here would sit directly under the close band below
   (also white), reading as one oversized white block with no section break.
   Darker than .hc-steps/.hc-demo's --hc-bg above (still separated from them
   by .hc-demo's own border-bottom): the page steps white -> pale sage ->
   darker sage -> white, rather than repeating one sage tone twice. */
.hc-layers{
  background:var(--hc-bg-subtle);
  padding-block: clamp(4rem, 9vw, 6rem);
  border-bottom:1px solid var(--varial-border);
}
/* Same heading treatment as .hc-demo above, qualified by parent for the same
   specificity reason: the h2 here also carries the bare .hc-demo-head class,
   which was only ever scoped under .hc-demo and so rendered unstyled. */
.hc-layers .hc-demo-head{
  text-align:center;
  font-family:var(--hc-font-serif);
  font-size:clamp(1.75rem, 3.2vw, 2.5rem);
  font-weight:600; letter-spacing:-0.01em;
  margin-bottom:clamp(1.75rem, 3.5vw, 2.5rem);
}
/* Qualified by parent, same specificity issue as .hc-demo-head above: a bare
   .hc-layers-intro class loses its "margin:0 auto" centering to the global
   ".hc-page p{ margin:0 }" reset (class+type beats class alone), leaving the
   paragraph flush left while the tabs row below it is genuinely centered —
   this was the section's reported misalignment. */
.hc-layers .hc-layers-intro{
  max-width:58rem;
  margin:0 auto clamp(2.5rem, 5vw, 3.5rem);
  font-size:1.0625rem;
  line-height:1.65;
  color:var(--varial-gray-600);
  text-align:center;
}
/* Layer tabs: underline tab-bar treatment, kept as a separate class from
   .hc-demo-tab so home_concept.js's two tab groups don't collide when it
   queries by class. */
.hc-layers-tabs{
  display:flex; justify-content:center; flex-wrap:wrap;
  gap:1.75rem;
  margin-bottom:clamp(2.5rem, 5vw, 3.5rem);
}
.hc-layers-tab{
  background:none; border:none; padding:0 0 0.75rem; cursor:pointer;
  font-family:var(--varial-font-mono); font-weight:600; font-size:0.8125rem;
  letter-spacing:0.05em; text-transform:uppercase;
  color:var(--varial-gray-400);
  border-bottom:2px solid var(--varial-border);
  transition:color .15s ease, border-color .15s ease;
}
.hc-layers-tab:hover{ color:var(--varial-gray-900); border-color:var(--varial-gray-400); }
.hc-layers-tab.is-active{ color:var(--hc-accent); border-color:var(--hc-accent); }
/* Market economics/Forecasts/Earnings/Portfolio/Actions are each a dense
   Plotly panel that needs real width to read; on a phone they're extra tabs
   to thumb through for content that won't render well anyway once opened.
   Only Infrastructure/Weather years stay available on a phone.
   display:none (not just visually hidden) also drops them from the
   ArrowLeft/Right tab cycle in home_concept.js, so keyboard users can't
   land on a tab with no visible affordance. None of them is the default
   active tab, so nothing needs to change on the panel side. */
@media (max-width:767px){
  #tab-commercial, #tab-proof, #tab-earnings, #tab-portfolio, #tab-frontier{ display:none; }
}

/* Proof/earnings/portfolio/frontier panels: each a single frozen, hoverable
   Plotly figure (home_concept.js loadLayerFigure) rather than a static
   screenshot, same card treatment as .hc-weather-chart below so every panel
   type in this tab set reads as one family. */
.hc-layer-chart{
  max-width:64rem; margin:0 auto;
  background:var(--hc-surface);
  border:1px solid var(--varial-border);
  border-radius:1.25rem;
  overflow:hidden;
  box-shadow:0 24px 60px rgba(13, 27, 46, 0.14);
  padding:0.75rem;
}
.hc-layer-chart-plot{ height:380px; }
.hc-layer-chart-artifact{
  display:block;
  width:100%;
  height:auto;
}
/* The source portfolio figure is deliberately close to square (660 x 444).
   At the layers card's wide desktop width it became much taller than every
   adjacent panel, so retain its aspect ratio but cap its rendered width. */
.hc-layer-chart-artifact--portfolio{
  width:min(100%, 40rem);
  margin-inline:auto;
}

/* The outputs panel uses the same outlined chart card as the graph-based
   panels, but makes the model's deliverables scannable rather than asking a
   visitor to infer them from one representative chart. */
.hc-outputs-card{ padding:0; }
.hc-outputs-products{ padding:1rem clamp(1rem, 3vw, 1.75rem) 0; }
.hc-outputs-product{
  display:grid;
  grid-template-columns:7.5rem minmax(0, 1fr);
  gap:1.25rem;
  padding:0 0 1rem;
}
.hc-outputs-product + .hc-outputs-product{
  padding-top:1rem;
  border-top:1px solid var(--varial-border);
}
.hc-outputs-product h3{
  margin:0;
  padding-top:0.15rem;
  color:var(--hc-accent);
  font-family:var(--varial-font-mono);
  font-size:0.75rem;
  font-weight:700;
  letter-spacing:0.05em;
  text-transform:uppercase;
}
.hc-outputs-product:nth-child(2) h3{ color:var(--varial-purple); }
.hc-outputs-list{
  display:grid;
  grid-template-columns:repeat(2, minmax(0, 1fr));
  gap:0.55rem 1.5rem;
  margin:0;
  padding:0;
  list-style:none;
}
.hc-outputs-list li{
  display:flex;
  align-items:flex-start;
  gap:0.6rem;
  color:var(--varial-gray-800);
  font-size:0.9375rem;
  line-height:1.4;
}
/* Keep a single final deliverable aligned as a complete row rather than
   leaving it stranded in half of the two-column list. */
.hc-outputs-list li:last-child:nth-child(odd){ grid-column:1 / -1; }
.hc-outputs-list i{
  flex:0 0 auto;
  margin-top:0.15rem;
  color:var(--varial-green);
}
.hc-outputs-card .hc-outputs-note{
  margin:0 clamp(1rem, 3vw, 1.75rem) 1rem;
  padding:0.7rem 0.9rem;
  border-radius:0.4rem;
  color:var(--varial-gray-600);
  background:var(--hc-bg-subtle);
  font-size:0.875rem;
  line-height:1.5;
}
.hc-earnings-card,
.hc-portfolio-card,
.hc-frontier-card,
.hc-infra-card{ padding:0; }
.hc-analysis-card-title{
  display:flex;
  align-items:baseline;
  gap:0.7rem;
  padding:0.7rem 1rem;
  border-bottom:1px solid var(--varial-border);
}
.hc-analysis-card-title span{
  color:var(--hc-accent);
  font-family:var(--varial-font-mono);
  font-size:0.72rem;
  font-weight:700;
  letter-spacing:0.05em;
  text-transform:uppercase;
}
.hc-analysis-card-title p{
  margin:0;
  color:var(--varial-gray-600);
  font-size:0.85rem;
}
.hc-earnings-card .hc-layer-chart-plot,
.hc-portfolio-card .hc-layer-chart-plot,
.hc-frontier-card .hc-layer-chart-plot{ padding:0.5rem; }
.hc-infra-card .nem-map-card{
  max-width:none;
  min-height:26rem;
  margin:0;
  border:0;
  border-radius:0;
  box-shadow:none;
}
@media (max-width:600px){
  .hc-outputs-product{ grid-template-columns:1fr; gap:0.65rem; }
  .hc-outputs-list{ grid-template-columns:1fr; }
  .hc-analysis-card-title{ align-items:flex-start; flex-direction:column; gap:0.2rem; }
}

/* Weather panel: one live Plotly figure (real frozen weather-year traces, see
   home_concept.js loadWeatherCharts/showWeatherFigure), switched by a pill
   selector embedded in the card's own header bar (same pattern as
   .hc-demo-frame-bar's Price-it/Value-it switch above) rather than sitting
   above the card — keeps this panel's layout (intro paragraph + one card)
   matching "The physics" panel's (intro paragraph + map card), so switching
   between the two tabs doesn't shift the page. Pill classes are kept
   separate from .hc-demo-tab so home_concept.js's tab groups don't collide
   (see the .hc-layers-tabs comment above for the same reasoning). */
.hc-weather-chart{
  max-width:64rem; margin:0 auto;
  background:var(--hc-surface);
  border:1px solid var(--varial-border);
  border-radius:1.25rem;
  overflow:hidden;
  box-shadow:0 24px 60px rgba(13, 27, 46, 0.14);
}
.hc-weather-chart-bar{
  display:flex; align-items:center; justify-content:space-between; gap:1rem;
  padding:0.7rem 1rem;
  border-bottom:1px solid var(--varial-border);
}
.hc-weather-header-copy{
  display:flex;
  align-items:baseline;
  gap:0.7rem;
  min-width:0;
}
.hc-weather-header-copy span{
  flex:0 0 auto;
  color:var(--hc-accent);
  font-family:var(--varial-font-mono);
  font-size:0.72rem;
  font-weight:600;
  letter-spacing:0.05em;
  text-transform:uppercase;
}
.hc-weather-header-copy p{
  margin:0;
  color:var(--varial-gray-600);
  font-size:0.85rem;
}
.hc-weather-pills{ display:flex; gap:0.125rem; }
.hc-weather-pill{
  background:none; border:none; cursor:pointer;
  padding:0.22rem 0.75rem; border-radius:999px;
  font-family:var(--varial-font-mono); font-weight:600; font-size:0.6875rem;
  letter-spacing:0.03em; text-transform:uppercase;
  color:var(--varial-gray-400);
  transition:color .15s ease, background-color .15s ease;
}
.hc-weather-pill:hover{ color:var(--varial-gray-900); }
.hc-weather-pill.is-active{ color:var(--varial-white); background:var(--hc-accent); }
.hc-weather-chart-plot{ height:380px; }
@media (max-width:600px){
  .hc-weather-chart-bar{ align-items:flex-start; flex-direction:column; gap:0.5rem; }
  .hc-weather-header-copy{ align-items:flex-start; flex-direction:column; gap:0.2rem; }
  .hc-weather-pills{ flex-wrap:wrap; }
}

/* Economics panel: a deliberately compact version of the live bidding tool.
   It keeps the model interactive but has its own, explicit layout contract:
   chart and control cards share one fixed workspace height on desktop. This
   avoids inheriting the full-screen wizard geometry, which made Plotly fall
   back to a taller canvas and get clipped by the marketing-card frame. */
.hc-bidding-embed{
  max-width:64rem; margin:0 auto;
  background:var(--hc-surface);
  border:1px solid var(--varial-border);
  border-radius:1.25rem;
  overflow:hidden;
  box-shadow:0 24px 60px rgba(13, 27, 46, 0.14);
}

.hc-bidding-embed > .card{
  display:flex;
  flex-direction:column;
  margin:0;
  border:0;
  border-radius:0;
  background:transparent;
}
.hc-bidding-embed .card > .card-body{ padding:0.625rem; }
.hc-bidding-embed .bidding-chart-toolbar{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:0.5rem;
  min-height:2.1rem;
  margin:0 0 0.35rem;
  padding:0 0.1rem 0.35rem;
  border-bottom:1px solid var(--varial-border);
}
.hc-bidding-embed .bidding-chart-caption{
  display:flex;
  align-items:center;
  flex-wrap:wrap;
  min-width:0;
  gap:0.3rem 0.65rem;
  margin:0;
  padding:0;
  border:0;
  color:var(--varial-gray-600);
}
.hc-bidding-embed .bidding-axis-key{ font-size:0.65rem; }
.hc-bidding-embed .bidding-axis-key::before{ width:0.48rem; height:0.48rem; }
.hc-bidding-embed .bidding-axis-key--demand::before{ width:0.75rem; height:0; }
.hc-bidding-embed .bidding-spot-pill{
  flex:0 0 auto;
  display:inline-flex;
  align-items:baseline;
  gap:0.35rem;
  padding:0.25rem 0.55rem;
  border:1px solid rgba(13, 148, 136, 0.28);
  border-radius:999px;
  background:rgba(13, 148, 136, 0.08);
  color:var(--hc-accent);
  font-family:var(--varial-font-mono);
  font-size:0.62rem;
  font-weight:700;
  letter-spacing:0.03em;
  text-transform:uppercase;
}
.hc-bidding-embed .bidding-spot-pill strong{
  font-size:0.72rem;
  letter-spacing:0;
  text-transform:none;
}
.hc-bidding-embed .bidding-axis-key{ font-weight:600; }
.hc-bidding-embed .bidding-axis-key::before{ width:0.5rem; height:0.5rem; }
.hc-bidding-embed .bidding-axis-key--demand::before,
.hc-bidding-embed .bidding-axis-key--spot::before{ width:0.7rem; height:0; }

/* Bootstrap's general simulator uses a viewport-height row. The homepage has
   a known card height instead: the chart column and both lever cards are all
   given the same bounded canvas, and the chart is allowed to fill only the
   space between its readout and key. */
@media (min-width:992px){
  .hc-bidding-embed .bidding-sim-row{
    display:grid;
    grid-template-columns:minmax(0, 1.75fr) minmax(10.25rem, 0.8fr) minmax(10.25rem, 0.8fr);
    gap:0.625rem;
    height:22.5rem;
    min-height:22.5rem;
    margin:0;
    --bs-gutter-x:0;
    --bs-gutter-y:0;
  }
  .hc-bidding-embed .bidding-sim-row > [class*="col-lg-"]{
    width:auto;
    max-width:none;
    height:100%;
    min-width:0;
    padding:0;
  }
  .hc-bidding-embed .bidding-chart-column{ min-height:0; }
  .hc-bidding-embed .bidding-chart-wrap{
    flex:1 1 0;
    min-height:0;
    height:auto;
  }
  .hc-bidding-embed .bidding-chart-wrap #bidding-hub-chart{ height:100%; }
  .hc-bidding-embed .bidding-lever-card{ height:100% !important; overflow:hidden; }
  .hc-bidding-embed .bidding-lever-card .card-header{ padding:0.35rem 0.5rem !important; font-size:0.68rem; }
  .hc-bidding-embed .bidding-lever-card .card-body{ padding:0.3rem 0.5rem; overflow:hidden; }
  .hc-bidding-embed .bidding-lever-card .small,
  .hc-bidding-embed .bidding-lever-card .form-label{ font-size:0.64rem; }
  .hc-bidding-embed .bidding-lever-card .form-range{ height:0.7rem; margin:0; }
  .hc-bidding-embed .bidding-lever-card .bidding-slider-group{ margin-bottom:0; }
  .hc-bidding-embed .bidding-slider-label-row{ margin-bottom:0; }
  .hc-bidding-embed .bidding-demand-separator{ padding-top:0.2rem; margin-top:0.1rem; }
}

@media (max-width:991.98px){
  .hc-bidding-embed .bidding-chart-wrap{ min-height:16rem; }
}

/* The whole preset bar (scenario buttons + Randomize) removed, not just
   compacted: it was still reading as a distinct "bottom pane" competing with
   the chart/sliders above it. Sliders remain the only, always-visible way to
   drive the chart. The scenario-explainer text can never show once its
   trigger buttons are gone, but display:none stays as a defensive belt and
   suspenders against some other code path revealing it. */
.hc-bidding-embed .bidding-preset-bar{ display:none; }
.hc-bidding-embed .bidding-scenario-explainer{ display:none; }

/* Qualified by parent, same reason as .hc-layers-intro above: this class is
   applied directly to a <p> in the commercial/earnings/weather panels, where
   a bare class loses "margin:0 auto" to ".hc-page p{ margin:0 }". The
   physical-layer usage (a wrapping <div>, not a <p>) was never affected, so
   this only visibly broke the other three panels' intro paragraphs. */
.hc-layers .hc-demo-map-copy{
  max-width:54rem;
  margin:0 auto 1.5rem;
  font-size:1rem;
  line-height:1.6;
  color:var(--varial-gray-600);
  text-align:center;
}
.hc-demo-map-copy p{
  font-size:1rem;
  line-height:1.6;
  color:var(--varial-gray-600);
}
.hc-demo-map-copy p + p{ margin-top:0.75rem; }
.hc-layers .nem-map-card{
  max-width:64rem;
  min-height:26rem;
  margin-inline:auto;
  border-radius:1.25rem;
  box-shadow:0 24px 60px rgba(13, 27, 46, 0.14);
}
/* The infrastructure title lives in the outer marketing card. Keep the map
   rectangular beneath it; otherwise this inner card rounds a second top edge
   and makes the two pieces look disconnected. */
.hc-layers .hc-infra-card .nem-map-card{
  max-width:none;
  margin:0;
  border:0;
  border-radius:0;
  box-shadow:none;
}
@media (max-width: 575.98px){
  .hc-layers .nem-map-card{ min-height:20rem; }
}

/* ---------- closing band (contact form embedded here, see below) ---------- */
/* White, matching the hero, so this reads as an invitation rather than a
   claims-heavy closer. The contact form (id="contact") lives inside this
   same section, directly under the headline/sub-copy, rather than a
   separate section with its own heading below the old CTA button — one
   close, not two. */
.hc-close-band{
  background:var(--hc-surface);
  padding-block: clamp(4rem, 10vw, 6.5rem);
  text-align:center;
}
/* Widened and the max font-size trimmed, same fix as the hero h1: "Get
   ahead of the power market." (31 characters) doesn't fit on one line in
   the old 40rem/3.5rem combo, which was sized for the shorter text before
   "power" was added. */
.hc-close-band h2{
  color:var(--varial-marketing-ink);
  font-family:var(--hc-font-serif);
  font-size:clamp(2rem, 5vw, 3rem);
  font-weight:600; letter-spacing:-0.015em; line-height:1.1;
  max-width:52rem; margin-inline:auto;
}
/* Qualified by parent, not a bare .hc-close-sub class: a bare class here
   loses to the global ".hc-page p{ margin:0 }" reset on specificity, which
   silently kills this margin and the auto-centering with it (see the
   .hc-close-band .hc-close-sub bug from earlier in this page's history). */
.hc-close-band .hc-close-sub{
  margin-top:1rem; color:var(--varial-gray-500);
  font-size:1.0625rem; line-height:1.5;
  max-width:32rem; margin-inline:auto;
}
/* ---------- Varial X promo band ---------- */
/* Deliberately quiet: a slim strip between the layers section and the final
   close band/contact form, not another full CTA section, so the beta
   short-horizon product reads as an adjunct to the platform above rather
   than a peer competing with it in nav or with the page's actual close. */
.hc-vx-promo{
  background:var(--hc-bg);
  border-top:1px solid var(--varial-border);
  padding-block: clamp(2rem, 4vw, 2.75rem);
}
.hc-vx-promo-inner{
  display:flex; align-items:center; justify-content:space-between; gap:2rem;
  flex-wrap:wrap;
}
.hc-vx-promo-eyebrow{
  font-family:var(--varial-font-mono); font-weight:600; font-size:0.75rem;
  letter-spacing:0.08em; text-transform:uppercase;
  color:var(--hc-accent);
  margin-bottom:0.375rem;
}
.hc-vx-promo-copy h3{
  font-family:var(--hc-font-serif);
  font-size:1.125rem; font-weight:600; letter-spacing:-0.005em;
  color:var(--varial-gray-900);
}
.hc-vx-promo-copy p:last-child{
  margin-top:0.375rem;
  font-size:0.9375rem; line-height:1.55; color:var(--varial-gray-500);
  max-width:36rem;
}
.hc-vx-promo-link{
  flex-shrink:0;
  font-weight:600; font-size:0.9375rem; color:var(--hc-accent);
  white-space:nowrap;
  transition:opacity .15s ease;
}
.hc-vx-promo-link:hover{ opacity:0.7; }
@media (max-width:600px){
  .hc-vx-promo-inner{ flex-direction:column; align-items:flex-start; }
}

/* ---------- contact form (inside .hc-close-band above) ---------- */
/* Reuses contact.css's existing form styling (loaded alongside, see
   extra_css) rather than re-styling every input/label from scratch — this
   page only adds the card placement/palette around the same form markup
   the old standalone /contact/ page used. */
.hc-contact-link{ color:var(--hc-accent); font-weight:600; }
/* Explicit background: contact.css's .contact-form-card doesn't set one, so
   the card was inheriting Bootstrap's --bs-card-bg, which resolves to the
   site's warm cream body background (--bs-body-bg, #FAF7EE) rather than
   this page's own sage tokens. margin-top replaces the vertical space the
   old standalone section's "Let's talk" heading + intro used to provide,
   now that the card sits directly under .hc-close-band's own sub-copy. */
.hc-contact-card{
  max-width:48rem;
  margin:clamp(2rem, 4vw, 2.75rem) auto 0;
  background:var(--hc-bg);
  border-color:var(--varial-border);
  text-align:left;
}
/* contact.css's default input background (--varial-gray-50) reads as barely
   different from this card's own sage background; white gives the fields
   real contrast against the card. */
.hc-contact-card .form-control{
  background:var(--hc-surface);
}
/* Wide, not tall: name + email stacked in a narrower left column, message
   filling a taller box in the wider right column, both columns the same
   height so the message box doesn't dwarf or shrink against the two short
   fields beside it. */
.hc-contact-grid{
  display:grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr);
  gap:1.75rem;
}
.hc-contact-grid-left{
  display:flex; flex-direction:column;
}
.hc-contact-grid-right{
  display:flex; flex-direction:column;
}
.hc-contact-grid-right textarea{
  flex:1;
  min-height:9.5rem;
  resize:vertical;
}
/* Cloudflare's default Turnstile widget is a fixed 300px wide iframe, which
   overflows this card's own padding on a narrow phone even with
   data-size="flexible" set above (a defensive floor, not the primary fix). */
.hc-contact-card .cf-turnstile{ max-width:100%; }
@media (max-width: 680px){
  .hc-contact-grid{ grid-template-columns:1fr; }
}

/* ---------- shared marketing footer ---------- */
/* These pages hide the newsletter form to keep the footer to the wordmark. */
:is(.home-concept-page, .varial-x-page) #newsletter-signup,
:is(.home-concept-page, .varial-x-page) .home-footer-signin{
  display:none;
}

@media (max-width: 780px){
  .hc-steps-grid{ grid-template-columns:1fr; row-gap:2rem; }
  /* Zeroing only padding-right left the 2.25rem padding-left from the
     shorthand in place, so the centred text inside sat in a lopsided box and
     read as pushed right of centre. Symmetric padding fixes it. */
  .hc-step{ border-right:none; padding-inline:1.25rem; }
  /* The heading stays left-aligned above 780px next to the numbered steps,
     but reads lopsided sitting over now-centred single-column steps. */
  .hc-steps-head{ text-align:center; }
}
