/*

The Eidolon Homepage Core Styles.

This file handles the homepage layout, but most importantly, it defines the Zero-JS 
fallback background logic for the hero section.

Because the WebGL shader is computationally expensive and occasionally skipped (due to 
missing hardware acceleration or low-FPS benchmarks), this CSS fallback is actually the 
authoritative "default" background. 

We construct the volumetric space look purely via multiple layered radial and linear 
gradients, matching the exact `#0a0a1a` deep-space blue constants used in the shader 
logic so the 1.5s cross-fade is mathematically seamless. 

Critically, we use `vw` (viewport width) units for the Y-axis constraints of the radial 
gradients instead of percentages. Using percentages structurally squishes spherical 
gradients into vertical pills on tall, narrow portrait screens.

@Optimization: When the shader successfully boots, it appends the `.webgl-active` class. 
We use this to kill the CSS `starTwinkle` animations via `display: none` on the pseudo-elements.
This recovers mobile CPU time that would otherwise be wasted calculating opacity 
interpolations behind an opaque, obscuring WebGL canvas.

*/
.hero {
  position: relative;
  /* Rigid height lock — NOT min-height. min-height allows the section to grow
     when fonts swap in (FOUT) or content changes, dragging the bottom-anchored
     arrow down then back up. height creates a geometry invariant the arrow trusts. */
  height: calc(100svh - 64px);
  /* 64px fixed header offset */
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--space-16) 0;
  overflow: hidden;
  background: #0a0a1a;
}

#hero-shader {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 0;
  pointer-events: none;
  /* Starts invisible and fades in fast on frame 1.
     Because the hero base is #0a0a1a (matching the shader's deep-space dark),
     this fade is dark-space → live shader — smooth and imperceptible as a "transition". */
  opacity: 0;
  transition: opacity 350ms ease-out;

  /* Scroll Performance Optimizations */
  will-change: opacity, transform;
  transform: translateZ(0);
  contain: strict;
}

#hero-shader.is-ready {
  opacity: 1;
}

/* If WebGL init fails at runtime, hide the blank canvas so the CSS fallback shows. */
.no-webgl #hero-shader {
  display: none;
}

/* data-no-shader is set synchronously in the <head> script on mobile.
   When present, never create the canvas at all. */
[data-no-shader] #hero-shader {
  display: none;
}

/* CSS gradient fallback — only active when shader is absent (mobile or hw failure). */
[data-no-shader] .hero,
.no-webgl .hero {
  background:
    radial-gradient(150vw 80vw at 50% 100%, color-mix(in srgb, var(--accent) 25%, transparent), transparent 70%),
    radial-gradient(100vw 60vw at 80% 20%, color-mix(in srgb, var(--accent-secondary) 15%, transparent), transparent 60%),
    linear-gradient(180deg,
      color-mix(in srgb, var(--bg) 15%, #0a0a1a) 0%,
      color-mix(in srgb, var(--bg) 25%, #0f0f2e) 40%,
      color-mix(in srgb, var(--bg) 40%, #1a1a3e) 70%,
      color-mix(in srgb, var(--accent) 20%, #0f0f2e) 100%);
}

/* SVG star overlays: only render for the CSS fallback path.
   On desktop with the shader active, these are never added to the DOM overhead. */
[data-no-shader] .hero::before,
.no-webgl .hero::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  background-image: url("data:image/svg+xml,%3Csvg%20width%3D%221200%22%20height%3D%221200%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Ccircle%20cx%3D%221021%22%20cy%3D%22111%22%20r%3D%220.6%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%22382%22%20cy%3D%223%22%20r%3D%220.8%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22126%22%20cy%3D%221035%22%20r%3D%220.6%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22865%22%20cy%3D%22927%22%20r%3D%220.7%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%221104%22%20cy%3D%221161%22%20r%3D%221.1%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22640%22%20cy%3D%221159%22%20r%3D%221.3%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%2293%22%20cy%3D%22989%22%20r%3D%220.8%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22944%22%20cy%3D%22643%22%20r%3D%221.1%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22219%22%20cy%3D%22750%22%20r%3D%221.3%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22452%22%20cy%3D%22432%22%20r%3D%222.0%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%221100%22%20cy%3D%22891%22%20r%3D%220.7%22%20fill%3D%22white%22%20opacity%3D%220.2%22%20%2F%3E%3Ccircle%20cx%3D%2215%22%20cy%3D%22931%22%20r%3D%221.3%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%2223%22%20cy%3D%22694%22%20r%3D%221.3%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22486%22%20cy%3D%221108%22%20r%3D%221.8%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22604%22%20cy%3D%221113%22%20r%3D%221.6%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22525%22%20cy%3D%221059%22%20r%3D%220.8%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22997%22%20cy%3D%22819%22%20r%3D%221.0%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%22911%22%20cy%3D%22655%22%20r%3D%220.9%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22673%22%20cy%3D%22425%22%20r%3D%221.4%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%221174%22%20cy%3D%22775%22%20r%3D%221.1%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22871%22%20cy%3D%22767%22%20r%3D%220.6%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22232%22%20cy%3D%2298%22%20r%3D%221.9%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22887%22%20cy%3D%22631%22%20r%3D%221.8%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22936%22%20cy%3D%22694%22%20r%3D%221.5%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%22966%22%20cy%3D%2235%22%20r%3D%220.9%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22510%22%20cy%3D%22614%22%20r%3D%221.9%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22708%22%20cy%3D%2282%22%20r%3D%221.4%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22766%22%20cy%3D%22462%22%20r%3D%221.9%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22695%22%20cy%3D%22799%22%20r%3D%221.7%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22991%22%20cy%3D%22676%22%20r%3D%221.0%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%221180%22%20cy%3D%22740%22%20r%3D%220.9%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%221011%22%20cy%3D%22317%22%20r%3D%221.9%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22392%22%20cy%3D%22790%22%20r%3D%221.7%22%20fill%3D%22white%22%20opacity%3D%220.2%22%20%2F%3E%3Ccircle%20cx%3D%22688%22%20cy%3D%22619%22%20r%3D%220.8%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%22291%22%20cy%3D%22881%22%20r%3D%221.8%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%228%22%20cy%3D%22279%22%20r%3D%221.2%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22881%22%20cy%3D%22353%22%20r%3D%221.4%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%228%22%20cy%3D%22217%22%20r%3D%221.2%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%22978%22%20cy%3D%221150%22%20r%3D%221.6%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22562%22%20cy%3D%22337%22%20r%3D%222.0%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%2246%22%20cy%3D%22714%22%20r%3D%221.2%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22257%22%20cy%3D%22194%22%20r%3D%220.8%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22358%22%20cy%3D%221163%22%20r%3D%220.5%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22728%22%20cy%3D%22520%22%20r%3D%220.7%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22370%22%20cy%3D%22500%22%20r%3D%220.9%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22512%22%20cy%3D%22777%22%20r%3D%221.5%22%20fill%3D%22white%22%20opacity%3D%220.2%22%20%2F%3E%3Ccircle%20cx%3D%22723%22%20cy%3D%2228%22%20r%3D%220.8%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22815%22%20cy%3D%22211%22%20r%3D%220.7%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22416%22%20cy%3D%22815%22%20r%3D%221.1%22%20fill%3D%22white%22%20opacity%3D%220.2%22%20%2F%3E%3Ccircle%20cx%3D%22757%22%20cy%3D%22894%22%20r%3D%221.6%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%221037%22%20cy%3D%22753%22%20r%3D%221.3%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22674%22%20cy%3D%22976%22%20r%3D%221.7%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%22303%22%20cy%3D%22990%22%20r%3D%220.9%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22255%22%20cy%3D%22250%22%20r%3D%221.1%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%22651%22%20cy%3D%22963%22%20r%3D%220.9%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22572%22%20cy%3D%22340%22%20r%3D%221.7%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22564%22%20cy%3D%22968%22%20r%3D%221.9%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%22856%22%20cy%3D%221098%22%20r%3D%220.7%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22122%22%20cy%3D%22251%22%20r%3D%221.4%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22751%22%20cy%3D%22450%22%20r%3D%221.9%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22927%22%20cy%3D%229%22%20r%3D%221.8%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%22328%22%20cy%3D%22972%22%20r%3D%221.5%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22605%22%20cy%3D%22561%22%20r%3D%221.5%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22232%22%20cy%3D%22971%22%20r%3D%222.0%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%221159%22%20cy%3D%221036%22%20r%3D%222.0%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%221039%22%20cy%3D%22320%22%20r%3D%220.6%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22818%22%20cy%3D%22450%22%20r%3D%220.5%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22660%22%20cy%3D%22501%22%20r%3D%221.0%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%221094%22%20cy%3D%22256%22%20r%3D%221.2%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%22651%22%20cy%3D%2232%22%20r%3D%221.9%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22759%22%20cy%3D%221170%22%20r%3D%221.4%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22752%22%20cy%3D%2289%22%20r%3D%222.0%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22458%22%20cy%3D%22576%22%20r%3D%221.7%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22573%22%20cy%3D%22763%22%20r%3D%221.1%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%2222%22%20cy%3D%2287%22%20r%3D%221.4%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22658%22%20cy%3D%22441%22%20r%3D%221.9%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22201%22%20cy%3D%221083%22%20r%3D%220.6%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%221194%22%20cy%3D%2289%22%20r%3D%220.7%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22871%22%20cy%3D%22441%22%20r%3D%221.5%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%221039%22%20cy%3D%22561%22%20r%3D%221.1%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22164%22%20cy%3D%221190%22%20r%3D%220.6%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22293%22%20cy%3D%22941%22%20r%3D%220.5%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22242%22%20cy%3D%22235%22%20r%3D%220.6%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22372%22%20cy%3D%22708%22%20r%3D%221.2%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22150%22%20cy%3D%22511%22%20r%3D%221.0%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22997%22%20cy%3D%22792%22%20r%3D%220.7%22%20fill%3D%22white%22%20opacity%3D%220.2%22%20%2F%3E%3Ccircle%20cx%3D%22877%22%20cy%3D%221166%22%20r%3D%221.6%22%20fill%3D%22white%22%20opacity%3D%220.3%22%20%2F%3E%3Ccircle%20cx%3D%22548%22%20cy%3D%22106%22%20r%3D%221.9%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22974%22%20cy%3D%22605%22%20r%3D%222.0%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22149%22%20cy%3D%22939%22%20r%3D%220.9%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22126%22%20cy%3D%22426%22%20r%3D%221.5%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22417%22%20cy%3D%22705%22%20r%3D%221.5%22%20fill%3D%22white%22%20opacity%3D%220.2%22%20%2F%3E%3Ccircle%20cx%3D%22755%22%20cy%3D%22247%22%20r%3D%221.5%22%20fill%3D%22white%22%20opacity%3D%220.2%22%20%2F%3E%3Ccircle%20cx%3D%22357%22%20cy%3D%22799%22%20r%3D%221.2%22%20fill%3D%22white%22%20opacity%3D%220.2%22%20%2F%3E%3Ccircle%20cx%3D%22802%22%20cy%3D%2227%22%20r%3D%221.3%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%221080%22%20cy%3D%22395%22%20r%3D%221.5%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22547%22%20cy%3D%22216%22%20r%3D%221.8%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22110%22%20cy%3D%22905%22%20r%3D%221.8%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22971%22%20cy%3D%22656%22%20r%3D%221.0%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%221051%22%20cy%3D%22674%22%20r%3D%221.1%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3C%2Fsvg%3E");
}

[data-no-shader] .hero::after,
.no-webgl .hero::after {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  background-image: url("data:image/svg+xml,%3Csvg%20width%3D%221500%22%20height%3D%221500%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Ccircle%20cx%3D%22697%22%20cy%3D%2279%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22560%22%20cy%3D%221279%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%221059%22%20cy%3D%221216%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%221091%22%20cy%3D%22164%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22847%22%20cy%3D%22928%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22493%22%20cy%3D%22218%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22897%22%20cy%3D%2283%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22796%22%20cy%3D%22742%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%221397%22%20cy%3D%22835%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%221235%22%20cy%3D%22549%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22906%22%20cy%3D%22443%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22540%22%20cy%3D%221035%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22501%22%20cy%3D%22565%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%221252%22%20cy%3D%22392%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%221267%22%20cy%3D%22775%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22923%22%20cy%3D%22668%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.9%22%20%2F%3E%3Ccircle%20cx%3D%22199%22%20cy%3D%221030%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22438%22%20cy%3D%221036%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%221327%22%20cy%3D%22266%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22499%22%20cy%3D%22902%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%221217%22%20cy%3D%22309%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22301%22%20cy%3D%22878%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22359%22%20cy%3D%22936%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%221218%22%20cy%3D%22581%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%221010%22%20cy%3D%221464%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22886%22%20cy%3D%22220%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22752%22%20cy%3D%22499%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22556%22%20cy%3D%229%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22795%22%20cy%3D%221369%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22314%22%20cy%3D%2232%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22373%22%20cy%3D%22743%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22153%22%20cy%3D%22570%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22476%22%20cy%3D%221496%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.9%22%20%2F%3E%3Ccircle%20cx%3D%228%22%20cy%3D%22440%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22783%22%20cy%3D%22983%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22884%22%20cy%3D%22953%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22341%22%20cy%3D%22155%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.9%22%20%2F%3E%3Ccircle%20cx%3D%22951%22%20cy%3D%2263%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22174%22%20cy%3D%221432%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%221001%22%20cy%3D%22101%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22876%22%20cy%3D%221060%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%221432%22%20cy%3D%22122%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22940%22%20cy%3D%22130%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22697%22%20cy%3D%22538%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22806%22%20cy%3D%221068%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%221024%22%20cy%3D%221222%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22561%22%20cy%3D%22342%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%221203%22%20cy%3D%22172%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%221097%22%20cy%3D%22293%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22830%22%20cy%3D%22358%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22129%22%20cy%3D%22684%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22209%22%20cy%3D%2250%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.9%22%20%2F%3E%3Ccircle%20cx%3D%22898%22%20cy%3D%221391%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%2289%22%20cy%3D%22808%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22136%22%20cy%3D%22747%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22105%22%20cy%3D%221375%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22693%22%20cy%3D%22790%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%22436%22%20cy%3D%221454%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22335%22%20cy%3D%221054%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22434%22%20cy%3D%22184%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22291%22%20cy%3D%22900%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%221317%22%20cy%3D%221377%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22671%22%20cy%3D%221448%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.9%22%20%2F%3E%3Ccircle%20cx%3D%22871%22%20cy%3D%22469%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.9%22%20%2F%3E%3Ccircle%20cx%3D%22105%22%20cy%3D%22131%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.5%22%20%2F%3E%3Ccircle%20cx%3D%22713%22%20cy%3D%22215%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22511%22%20cy%3D%22174%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%22549%22%20cy%3D%221070%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22578%22%20cy%3D%22533%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%221024%22%20cy%3D%221063%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%221435%22%20cy%3D%22448%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%221115%22%20cy%3D%22629%22%20r%3D%222%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%221316%22%20cy%3D%22245%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.7%22%20%2F%3E%3Ccircle%20cx%3D%221359%22%20cy%3D%221132%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.9%22%20%2F%3E%3Ccircle%20cx%3D%22290%22%20cy%3D%221289%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22474%22%20cy%3D%22690%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.8%22%20%2F%3E%3Ccircle%20cx%3D%221121%22%20cy%3D%221110%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.6%22%20%2F%3E%3Ccircle%20cx%3D%22749%22%20cy%3D%221452%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%221250%22%20cy%3D%221418%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.4%22%20%2F%3E%3Ccircle%20cx%3D%22766%22%20cy%3D%221368%22%20r%3D%221%22%20fill%3D%22white%22%20opacity%3D%220.9%22%20%2F%3E%3C%2Fsvg%3E");
}

.hero-content {
  text-align: center;
  max-width: 800px;
  position: relative;
  z-index: 1;
  background-color: color-mix(in srgb, var(--bg-surface) 65%, transparent);
  padding: clamp(var(--space-6), 6vw, var(--space-12));
  border-radius: 2rem;
  border: 1px solid color-mix(in srgb, var(--border) 60%, transparent);
  box-shadow: 0 12px 40px var(--shadow), inset 0 0 0 1px color-mix(in srgb, #ffffff 8%, transparent);
}

/* 
  Optimization: Only apply the incredibly expensive Gaussian blur if the WebGL 
  volumetric clouds are actually rendering. If we are in the CSS fallback state, 
  the background is just a dark static gradient, meaning the blur yields zero 
  visual benefit while causing catastrophic 100ms+ presentation delays on scroll.
*/
.webgl-active .hero-content {
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
}

.hero-title {
  font-size: clamp(3rem, 6vw, 5rem);
  line-height: 1.1;
  margin-bottom: var(--space-6);
  color: var(--text-primary);
  letter-spacing: -0.03em;
}

.hero-subtitle {
  font-size: clamp(1.25rem, 2vw, 1.5rem);
  color: var(--text-secondary);
  margin-bottom: var(--space-8);
  max-width: 600px;
  margin-left: auto;
  margin-right: auto;
}

.hero-actions {
  display: flex;
  gap: var(--space-4);
  justify-content: center;
  align-items: center;
  flex-wrap: wrap;
}

/* Scroll Indicator */
.scroll-indicator {
  position: absolute;
  bottom: var(--space-8);
  /* Centering via margin instead of transform, so transform is exclusively
     owned by the bounce keyframes with zero interpolation conflict. */
  left: 50%;
  margin-left: -24px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  border-radius: 50%;
  color: var(--text-primary);
  background-color: color-mix(in srgb, var(--bg-surface) 80%, transparent);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border: 1px solid color-mix(in srgb, var(--border) 80%, transparent);
  box-shadow: 0 4px 16px var(--shadow);
  animation: bounce 2s infinite;
  z-index: 2;
  opacity: 0.85;
  will-change: transform;
  transition: opacity var(--transition-base), background-color var(--transition-base), border-color var(--transition-base);
}

.scroll-indicator:hover {
  opacity: 1;
  background-color: var(--bg-surface);
  /* Scale only — no translateX needed since centering is now via margin-left */
  transform: scale(1.05);
}

.scroll-indicator svg {
  width: 24px;
  height: 24px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}

@keyframes bounce {

  0%,
  20%,
  50%,
  80%,
  100% {
    transform: translateY(0);
  }

  40% {
    transform: translateY(-10px);
  }

  60% {
    transform: translateY(-5px);
  }
}

/* Features Section */
.features-section {
  padding: var(--space-24) 0;
  background-color: var(--bg);
  position: relative;
  /* Soft top border to separate from hero shader */
  border-top: 1px solid var(--border);
}

.features-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: var(--space-8);
  margin-top: var(--space-12);
}

.feature-card {
  height: 100%;
}

.feature-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.75rem;
  height: 2.75rem;
  background-color: color-mix(in srgb, var(--accent) 15%, transparent);
  border-radius: var(--radius-sm);
  margin-bottom: var(--space-5);
  flex-shrink: 0;
}

.feature-icon svg {
  width: 1.5rem;
  height: 1.5rem;
  color: var(--accent);
}

/* How It Works Section */
.steps-section {
  padding: var(--space-20) 0;
  background-color: var(--bg-surface);
}

.steps-container {
  display: flex;
  flex-direction: column;
  gap: var(--space-12);
  margin-top: var(--space-12);
}

.step-item {
  display: flex;
  gap: var(--space-6);
  align-items: flex-start;
  position: relative;
}

.step-item:not(:last-child)::before {
  content: '';
  position: absolute;
  top: 48px;
  left: 24px;
  bottom: calc(-1 * var(--space-12));
  width: 1px;
  background: color-mix(in srgb, var(--text-secondary) 15%, transparent);
  z-index: 0;
  transform: translateX(-50%);
}

.step-number {
  flex-shrink: 0;
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background-color: var(--accent);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-heading);
  font-size: 1.5rem;
  font-weight: 700;
  line-height: 1;
  position: relative;
  z-index: 1;
  /* 
     Optical Typography Alignment:
     We force `lining-nums` to disable Lora's Old-Style Figures (which previously gave '3' a descender).
     Now all numbers rest cleanly on the baseline. Because Lora's line-box still reserves empty space 
     at the bottom for descenders it isn't using, the mathematical box center pushes the digits slightly
     too high. We apply a soft padding-top pressure to gently shift the flex optical center downward.
  */
  font-variant-numeric: lining-nums tabular-nums;
}

.step-content h3 {
  margin-bottom: var(--space-2);
}

/* Community Section */
.community-section {
  padding: var(--space-24) 0;
  text-align: center;
  background-color: var(--bg);
}

.social-links {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-6);
  margin-top: var(--space-8);
}

.social-card {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-4) var(--space-6);
  border-radius: var(--radius-pill);

  background: color-mix(in srgb, var(--bg-surface) 20%, transparent);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px solid color-mix(in srgb, var(--border) 30%, transparent);
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);

  color: var(--text-primary);
  font-weight: 600;
  transition: all 400ms cubic-bezier(0.16, 1, 0.3, 1);
}

.social-card:hover {
  background: color-mix(in srgb, var(--accent) 70%, transparent);
  border-color: var(--accent);
  color: #fff;
  text-decoration: none;
  transform: translateY(-4px) scale(1.02);
  box-shadow: 0 12px 32px color-mix(in srgb, var(--accent) 30%, transparent);
}

.social-card svg {
  width: 20px;
  height: 20px;
  fill: currentColor;
}

/* Status Banner */
.status-banner {
  margin-top: var(--space-16);
  max-width: 600px;
  margin-left: auto;
  margin-right: auto;
  text-align: center;
}

/* App Preview / Carousel */
.carousel-section {
  padding: var(--space-20) 0;
  background-color: var(--bg);
  position: relative;
  overflow: hidden;
}

.carousel-mask {
  width: 100%;
  position: relative;
}

/* Only apply the edge-fade on screens wide enough for it to look good.
   On phones the fade eats too much of the visible carousel, so we let it run edge-to-edge. */
@media (min-width: 768px) {
  .carousel-mask {
    -webkit-mask-image: linear-gradient(
      to right,
      transparent,
      black 120px,
      black calc(100% - 120px),
      transparent
    );
    mask-image: linear-gradient(
      to right,
      transparent,
      black 120px,
      black calc(100% - 120px),
      transparent
    );
  }
}



@keyframes marquee {
  0% { transform: translateX(0); }
  100% { transform: translateX(calc(-50% - (var(--space-6) / 2))); }
}

.carousel-slide {
  flex: 0 0 auto;
  width: min(80vw, 320px); /* iPhone aspect width */
  transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1);
}

.carousel-slide:hover {
  transform: translateY(-8px);
}

.mockup-img {
  width: 100%;
  height: auto;
  border-radius: 40px;
  border: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
  box-shadow: 
    0 12px 24px rgba(0,0,0,0.15), 
    inset 0 0 0 1px rgba(255,255,255,0.1);
  display: block;
}

.web-mockup-img {
  border-radius: 12px;
}

/* Carousel Toggle UI */
.carousel-toggle {
  display: inline-flex;
  background: color-mix(in srgb, var(--bg-surface) 40%, transparent);
  padding: 4px;
  border-radius: var(--radius-pill);
  border: 1px solid color-mix(in srgb, var(--border) 60%, transparent);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  margin-bottom: var(--space-4);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
}

.toggle-btn {
  background: transparent;
  border: none;
  padding: 8px 24px;
  border-radius: var(--radius-pill);
  color: var(--text-secondary);
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 0.9rem;
  cursor: pointer;
  transition: all 0.3s ease;
}

.toggle-btn.active {
  background: var(--bg-surface);
  color: var(--accent);
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

.toggle-btn:hover:not(.active) {
  color: var(--text-primary);
}

/* Track Stacking and Crossfade */
.carousel-track-wrapper {
  position: relative;
  width: 100%;
}

.carousel-track {
  display: flex;
  gap: var(--space-6);
  padding: var(--space-8) 0;
  margin-top: var(--space-6);
  width: max-content;
  animation: marquee 40s linear infinite;
  will-change: transform;
  
  /* GPU-accelerated crossfade */
  transition: opacity 0.4s ease, visibility 0.4s ease;
}

.carousel-mask:hover .carousel-track {
  animation-play-state: paused;
}

/* Default States (iOS active) */
.carousel-track.ios-track {
  position: relative;
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}

.carousel-track.web-track {
  position: absolute;
  top: 0;
  left: 0;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

/* Toggled States (Web active) */
.show-web .carousel-track.ios-track {
  position: absolute;
  top: 0;
  left: 0;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

.show-web .carousel-track.web-track {
  position: relative;
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}

/* Web slide dimensions */
.carousel-slide.web-slide {
  width: min(80vw, 540px); /* Web aspect width */
}