/*
  Shared tokens for every code component.

  A site-level CSS *class* never reaches inside a shadow root, but a site-level
  *variable* does (CLAUDE.md section 2) - so this file is where the components
  meet the site's own design system. Each --na-* name below resolves to the real
  Webflow variable first and to the value from the Figma file only as a fallback,
  which means retuning a colour in the Designer moves every block with it, while
  the components still render correctly in the local gallery, in Figma-faithful
  isolation, and on any site that does not define these.

  The Webflow names are the ones the Designer emits for the "Semantic Colors"
  and "Base" collections of the Nebius Academy site; every fallback here was
  checked against the live value and matches it.
*/
/* Both selectors on purpose: the CLI rewrites `:root` to `:host` when it builds
   the shadow-DOM stylesheet (section 2), but the local gallery inlines this file
   as-is, where `:root` matches nothing and every token would silently fall back.
   Naming `:host` as well makes the gallery behave like the real thing. */
:host,
:host {
  --container-max-width: 1280px;

  /* Type. Webflow holds no font-family variables - the faces are set in the
     site's typography settings - so these are ours, with the project's own
     "Inter 28" first and metric-compatible Arial behind it. */
  --na-font-sans: "Inter 28", Arial, sans-serif;
  --na-font-display: "Inter Tight", "Inter 28", Arial, sans-serif;
  --na-font-serif: "Tiempos Text", Georgia, "Times New Roman", serif;

  /* Text */
  --na-content-primary-bold: var(--_semantic-colors---content--primary-bold, #14070f);
  --na-content-primary: var(--_semantic-colors---content--primary, rgba(20, 7, 15, 0.9));
  --na-content-secondary: var(--_semantic-colors---content--secondary, rgba(20, 7, 15, 0.7));
  --na-content-tertiary: var(--_semantic-colors---content--tertiary, rgba(20, 7, 15, 0.5));
  --na-content-inverse-primary-bold: var(--_semantic-colors---content--inverse-primary-bold, #f9f8f6);
  --na-content-inverse-primary: var(--_semantic-colors---content--inverse-primary, rgba(249, 248, 246, 0.9));
  --na-content-inverse-secondary: var(--_semantic-colors---content--inverse-secondary, rgba(249, 248, 246, 0.7));
  --na-content-inverse-tertiary: var(--_semantic-colors---content--inverse-tertiary, rgba(249, 248, 246, 0.5));

  /* Surfaces */
  --na-background-primary: var(--_semantic-colors---background--primary, #f3efe8);
  --na-background-secondary: var(--_semantic-colors---background--secondary, #f9f8f6);
  --na-background-inverse: var(--_semantic-colors---background--inverse, rgba(20, 7, 15, 0.95));
  --na-background-primary-hover-subtle: var(--_semantic-colors---background--primary-hover-subtle, #eae6dc);

  /* Borders */
  --na-border-primary: var(--_semantic-colors---border-stroke--black--primary, rgba(20, 7, 15, 0.2));
  --na-border-secondary: var(--_semantic-colors---border-stroke--black--secondary, rgba(20, 7, 15, 0.1));
  --na-border-inverse-primary: var(--_semantic-colors---border-stroke--white--primary, rgba(249, 248, 246, 0.7));
  --na-color-black-alpha-20-a: var(--black--alpha--20-a, rgba(20, 7, 15, 0.2));

  /* No counterpart in the site's collections, so these stay ours - but they are
     still variables, so a page can retune them.

     Two of them deliberately do NOT use the similarly named Webflow token:
     Background/primary-hover is #ab9c8f there, and primary-hover-subtle is the
     opaque #eae6dc. Both are meant for beige cards. Over the header's glass bar
     a hover has to be a transparent wash or it reads as a solid chip, which is
     what the two "ghost" names below are for. */
  --na-background-primary-subtle: #f3efe8;
  --na-background-white: #fff;
  --na-background-glass: rgba(255, 255, 255, 0.5);
  --na-background-primary-hover: rgba(20, 7, 15, 0.06);
  --na-background-ghost-hover: rgba(20, 7, 15, 0.06);
  --na-background-ghost-hover-subtle: rgba(20, 7, 15, 0.04);
  --na-color-white-alpha-70-a: rgba(255, 255, 255, 0.7);
  --na-color-white-alpha-50-a: rgba(255, 255, 255, 0.5);
  --na-color-white-alpha-40-a: rgba(255, 255, 255, 0.4);

  /* The Problem section's "Tint" stat card (Figma node 21245-5945): a solid
     lavender card with a black-fading-to-lavender figure. No counterpart in
     the site's collections, so this stays ours the way the block above does. */
  --na-background-tint-purple: #d3d3fa;
  --na-gradient-stat-fade: linear-gradient(90deg, rgba(20, 7, 15, 0.95) 0%, rgba(20, 7, 15, 0.95) 35%, rgba(211, 211, 250, 0.9) 100%);

  /* The gradient every *emphasis* italic run in a heading is clipped to
     (Figma node 21045-20, the Hero heading). Webflow has no gradient
     variables to bridge to (same reasoning as the fonts above), so this one
     is ours outright - defined once here and referenced by every section's
     .emphasis rule instead of repeating the five stops seven times. */
  --na-gradient-emphasis: linear-gradient(213deg, #b5a9ea 18%, #8873de 54%, #2e2e7d 75%, #43425b 95%);
}

/* Horizontal padding is held in a variable because the marquee below has to
   cancel it out to reach the screen edges — keeping one source of truth means
   the bleed can never drift out of sync with the padding. */
.jEiFHO6giKFBtN5_El7r {
  --section-pad-x: var(--na-spacing-16, 16px);
  width: 100%;
  box-sizing: border-box;
  background: linear-gradient(180deg, #d0d0fd 0%, #e7e3ff 50%, #f3efe8 100%);
  border-radius: var(--na-border-radius-24, 24px);
  padding: var(--na-spacing-56, 56px) var(--section-pad-x);
  overflow: hidden;
}

.Q0dZqF5Og0kbAWDkXYj1 {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--na-spacing-64, 64px);
  width: 100%;
}

.JzfLZTpwt6shEm4igvb3 {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--na-spacing-24, 24px);
  width: 100%;
}

.U8kdTyF5xAc9GZAgT14A {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 12px;
  width: 100%;
}

.lX206gsfUSaLbSO8xLmS {
  margin: 0;
  font-family: var(--na-font-display, "Inter Tight", "Inter 28", Arial, sans-serif);
  font-weight: 400;
  font-size: 28px;
  line-height: 32px;
  text-align: center;
  color: var(--na-content-primary, rgba(20, 7, 15, 0.9));
}

.PGAgl9rpnfpC1HmqnAMR {
  font-family: var(--na-font-serif, "Tiempos Text", Georgia, "Times New Roman", serif);
  font-style: italic;
  letter-spacing: -0.6px;
  /* Clipped to the shared purple gradient (globals.css) rather than a
     flat color - see CLAUDE.md section 10. */
  background-image: var(--na-gradient-emphasis, linear-gradient(213deg, #b5a9ea 18%, #8873de 54%, #2e2e7d 75%, #43425b 95%));
  background-clip: text;
  -webkit-background-clip: text;
  color: transparent;
  -webkit-text-fill-color: transparent;
}

/* Same italic serif run, without the gradient clip - for the headings that
   should read as plain text emphasis (`emphasisGradient: false`). */
._y4z1o65zn8NGdKeBeZi {
  font-family: var(--na-font-serif, "Tiempos Text", Georgia, "Times New Roman", serif);
  font-style: italic;
  letter-spacing: -0.6px;
  color: inherit;
}

/* The <br> a newline in the heading produces. It breaks the line at every
   width here; the class exists so this section can change that at a breakpoint
   the way ProblemSection does (CLAUDE.md section 10). */
.nywGxVucQBzrcKzOCPuA {
  display: inline;
}

._XyWOxkG2DVctFGlmugf {
  margin: 0;
  font-family: var(--na-font-sans, "Inter 28", Arial, sans-serif);
  font-weight: 400;
  font-size: 16px;
  line-height: 24px;
  letter-spacing: -0.2px;
  text-align: center;
  color: var(--na-content-secondary, rgba(20, 7, 15, 0.7));
}

._XyWOxkG2DVctFGlmugf p {
  margin: 0;
}

._XyWOxkG2DVctFGlmugf p + p {
  margin-top: 0.75em;
}

.wJ6sScge2fIRGA2KPpcH {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  height: 52px;
  padding: var(--na-spacing-12, 12px) 24px;
  border: none;
  border-radius: var(--na-border-radius-14, 14px);
  background: var(--na-background-inverse, rgba(20, 7, 15, 0.95));
  font-family: var(--na-font-sans, "Inter 28", Arial, sans-serif);
  font-weight: 400;
  font-size: 16px;
  line-height: 24px;
  letter-spacing: -0.2px;
  color: var(--na-content-inverse-primary, rgba(249, 248, 246, 0.9));
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
}

/* ---- marquee -------------------------------------------------------------

   Every card dimension in Figma is the desktop design multiplied by one factor
   per breakpoint (0.75 at ≤768, 0.8906 at 992, 1 at 1200), so the whole row is
   expressed as `desktop px * --card-scale` instead of four sets of literals.

   Cancelling the section's own padding is what lets the row run past the
   screen edges; `width: auto` (not 100%) is what makes the box actually widen
   by those margins instead of overflowing by that amount on the right. */
.idpnMdnrDQpDrYY4HcZA {
  --card-scale: 0.75;
  /* .container centers its children, so without this the marquee would be a
     shrink-to-fit flex item as wide as the whole track — the clip window would
     then be sized by however many cards there are instead of by the section. */
  align-self: stretch;
  width: auto;
  margin-inline: calc(-1 * var(--section-pad-x));
  overflow: hidden;
}

/* The sequence of cards is rendered twice, so translating the track by exactly
   half its own width lands the copy precisely where the original started and
   the loop has no seam. That only holds while the spacing between cards comes
   from a margin on every card (including the last): a flex `gap` would put one
   fewer space in the track than in a full sequence, and 50% would drift. */
.Sn035VwBDebjAezbGHJS {
  display: flex;
  align-items: center;
  width: max-content;
  will-change: transform;
  animation: tTdpriKwNc3QK4YSQjYL var(--marquee-duration, 40s) linear infinite;
}

@keyframes tTdpriKwNc3QK4YSQjYL {
  from {
    transform: translate3d(0, 0, 0);
  }
  to {
    transform: translate3d(-50%, 0, 0);
  }
}

@media (prefers-reduced-motion: reduce) {
  .Sn035VwBDebjAezbGHJS {
    animation: none;
  }
}

.zO7SbqxIxpXniinB0Z2V {
  position: relative;
  flex: 0 0 auto;
  box-sizing: border-box;
  width: calc(261px * var(--card-scale));
  margin-right: calc(10px * var(--card-scale));
  overflow: hidden;
  border-radius: calc(16px * var(--card-scale));
  background: var(--na-background-secondary, #f9f8f6);
}

/* The row's rhythm in Figma repeats every four cards: short, tall, short, then
   one extra-tall. OutcomesSection.tsx assigns these by index. */
.HqWoe6BLqvXkec2dRxm9 {
  height: calc(180px * var(--card-scale));
}

.DyE7PeWuSg7YQYQoFDJw {
  height: calc(244px * var(--card-scale));
}

.rAtXVhJEBx7v5dZnHXp0 {
  height: calc(321px * var(--card-scale));
}

.gZUy4O9NdzxHRmK0hYxj {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Tablet: wider gutters, full-size heading */
@media (min-width: 768px) {
  .jEiFHO6giKFBtN5_El7r {
    --section-pad-x: var(--na-spacing-48, 48px);
  }

  .lX206gsfUSaLbSO8xLmS {
    max-width: 860px;
    margin-inline: auto;
    font-size: 42px;
    line-height: 52px;
    letter-spacing: 0;
  }

  .PGAgl9rpnfpC1HmqnAMR {
    letter-spacing: 0;
  }

  ._XyWOxkG2DVctFGlmugf {
    max-width: 700px;
    margin-inline: auto;
  }
}

/* Medium desktop: the tag steps up to Figma's M size and the cards grow */
@media (min-width: 992px) {
  .jEiFHO6giKFBtN5_El7r {
    padding-bottom: var(--na-spacing-80, 96px);
  }

  .edTzdJmdZRlA91Fp5HCQ {
    --tag-gap: 10px;
    --tag-dot-size: 10px;
    --tag-dot-radius: 3px;
    --tag-font-size: 20px;
    --tag-line-height: 28px;
    --tag-letter-spacing: -0.4px;
  }

  .idpnMdnrDQpDrYY4HcZA {
    --card-scale: 0.8906;
  }
}

/* Large desktop: full padding and full-size cards */
@media (min-width: 1200px) {
  .jEiFHO6giKFBtN5_El7r {
    --section-pad-x: var(--na-spacing-80, 80px);
    padding: var(--na-spacing-80, 96px) var(--section-pad-x);
  }

  .idpnMdnrDQpDrYY4HcZA {
    --card-scale: 1;
  }
}

/* Eyebrow tag (Figma "Tag Serif"): a small square dot next to an italic serif
   label. Figma ships it at two sizes, S and M.

   The size is driven by custom properties rather than a React prop, because
   every section so far switches between S and M at its *own* breakpoint
   (Outcomes at 992px, Ecosystem at 1200px) — something a JS prop cannot do.
   Defaults below are size S. A section moves to size M by passing `className`
   to <Tag> and setting these inside its own media query:

     @media (min-width: 992px) {
       .sectionTag {
         --tag-gap: 10px;
         --tag-dot-size: 10px;
         --tag-dot-radius: 3px;
         --tag-font-size: 20px;
         --tag-line-height: 28px;
         --tag-letter-spacing: -0.4px;
       }
     }

   The label is serif italic by default ("Tag Serif"). Figma also uses the same
   tag with a plain sans label inside cards - that is --tag-font-family and
   --tag-font-style, set the same way (see StepCard).

   Note the S values live in the var() fallbacks and are deliberately NOT
   declared on .tag itself — a declaration here would beat an override coming
   from the same element or an ancestor, and the switch would silently do
   nothing. */

._ieooqJhlujimY9scWb3 {
  display: flex;
  align-items: center;
  gap: var(--tag-gap, 8px);
}

.sA2Swnt2I2f1v55bsc1M {
  flex-shrink: 0;
  width: var(--tag-dot-size, 7px);
  height: var(--tag-dot-size, 7px);
  border-radius: var(--tag-dot-radius, 1.5px);
  background: var(--na-content-secondary, rgba(20, 7, 15, 0.7));
}

.wmvIIAw52vFHDRm9ZsjP {
  margin: 0;
  font-family: var(--tag-font-family, var(--na-font-serif, "Tiempos Text", Georgia, "Times New Roman", serif));
  font-style: var(--tag-font-style, italic);
  font-size: var(--tag-font-size, 14px);
  line-height: var(--tag-line-height, 20px);
  letter-spacing: var(--tag-letter-spacing, -0.2px);
  color: var(--na-content-secondary, rgba(20, 7, 15, 0.7));
  white-space: nowrap;
}

/* Three identical tiles stacked - the site's own recipe (see NoiseOverlay.tsx),
   not something to simplify to one: stacking the same tile compounds the
   blend into visible grain, where a single layer reads as almost nothing. */
/* No z-index here on purpose. A positioned element with z-index:0/auto still
   paints after in-flow, non-positioned content in the same stacking context
   (CSS 2.1 Appendix E) - so as long as the real content sitting over this
   overlay is itself `position: relative` (as every card content wrapper in
   this project already is) and comes later in the DOM, tree order alone keeps
   the grain under the copy. A fixed z-index here would instead force the
   overlay in front of any caller that isn't giving its content a *higher*
   one, which is one more number every caller would have to know to match. */
.VjIzBc5zC6slMhcdqEWS {
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}

.YqJvn0ptuHfTjC_wXJLP {
  position: absolute;
  inset: 0;
  background-color: var(--na-background-secondary, #f9f8f6);
  background-image: var(--noise-url);
  background-size: var(--noise-size, 256px);
  mix-blend-mode: color-burn;
}

