/* =====================================================================
   Gazer Monitoring Theme — makeover.css   (v2.20 "expansive depth" layer)
   Loads AFTER main.css + interactions.css (later-wins). Pairs with
   makeover.js (card 3D tilt) + hero-3d.js (live sensor-network canvas).

   The makeover, in one line: a NEWER type system (Satoshi + General
   Sans), real DEPTH (dark-glass surfaces, a 4-step elevation scale, pointer
   3D tilt, a live 3D hero centerpiece), and a more EXPANSIVE scale — while
   the brand stays black + neon-lime (#eaff12). Lime remains the signal;
   depth comes from graphite, glass, and light — not new colors.

   Performance: depth is shadows + compositor transforms; the only blur is a
   couple of glass panels; the 3D hero is a tiny Canvas2D, offscreen-paused
   and reduced-motion-safe. JS-driven states gate on .gz-fx; decorative
   motion gates on prefers-reduced-motion.
   ===================================================================== */

/* ---------- Type system (self-hosted) ---------- */
/* Display: Satoshi (Fontshare). Body: General Sans (Fontshare). */
/* Only the weights actually rendered ship: Satoshi 500 (h3/h4) + 700
   (h1/h2/card+CTA titles — Satoshi has no 600 face); General Sans 400 (body)
   + 600 (labels/links) + 700 (strong/bold). */
@font-face { font-family: "Satoshi"; font-style: normal; font-weight: 500; font-display: swap; src: url("../fonts/satoshi-500.woff2") format("woff2"); }
@font-face { font-family: "Satoshi"; font-style: normal; font-weight: 700; font-display: swap; src: url("../fonts/satoshi-700.woff2") format("woff2"); }
@font-face { font-family: "General Sans"; font-style: normal; font-weight: 400; font-display: swap; src: url("../fonts/general-sans-400.woff2") format("woff2"); }
@font-face { font-family: "General Sans"; font-style: normal; font-weight: 600; font-display: swap; src: url("../fonts/general-sans-600.woff2") format("woff2"); }
@font-face { font-family: "General Sans"; font-style: normal; font-weight: 700; font-display: swap; src: url("../fonts/general-sans-700.woff2") format("woff2"); }

:root {
	/* Swap the two type tokens the whole theme already reads from. Old faces
	   (Inter / Space Grotesk) stay in the fallback chain but are no longer
	   loaded, so nothing else needs to change. */
	/* Stacks fall back straight to SYSTEM fonts — NOT to the old Inter/Space
	   Grotesk webfaces. Listing another webfont as the fallback makes the
	   browser fetch it during the font-display:swap window (≈70KB of Inter was
	   being pulled for nothing); a system fallback costs zero bytes. */
	--gz-font: "General Sans", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", Arial, sans-serif;
	--gz-font-display: "Satoshi", "General Sans", "Segoe UI", -apple-system, BlinkMacSystemFont, sans-serif;

	/* Expansive container */
	--gz-container: 1280px;

	/* Dark-glass + elevation depth scale */
	--gz-glass-bg: linear-gradient(180deg, rgba(255, 255, 255, 0.055), rgba(255, 255, 255, 0.014));
	--gz-glass-border: rgba(255, 255, 255, 0.10);
	--gz-glass-hi: inset 0 1px 0 rgba(255, 255, 255, 0.07);   /* top light edge */
	--gz-elev-1: 0 1px 2px rgba(0, 0, 0, 0.40);
	--gz-elev-2: 0 8px 22px rgba(0, 0, 0, 0.42);
	--gz-elev-3: 0 18px 44px rgba(0, 0, 0, 0.50);
	--gz-elev-4: 0 34px 80px rgba(0, 0, 0, 0.55);
	--gz-lime-glow: 0 0 28px rgba(234, 255, 18, 0.20);
}

/* =====================================================================
   1. TYPOGRAPHY — tuned for the new faces.
   Satoshi is a clean geometric grotesque; bold (700) headings with slightly
   tighter tracking read confident without display-face flourish.
   ===================================================================== */
h1 { font-weight: 700; letter-spacing: -0.018em; line-height: 1.04; }
h2 { font-weight: 700; letter-spacing: -0.014em; line-height: 1.10; }
h3 { font-weight: 500; letter-spacing: -0.008em; }
h4 { font-weight: 500; letter-spacing: -0.004em; }
.gz-card-title-sm, .gz-card-title { font-weight: 700; }

/* Body in General Sans reads a touch tighter than Inter — nudge tracking. */
body { letter-spacing: -0.003em; }

/* General Sans ships no 800 face; pin the wordmark to 700 so it isn't
   synthetically faux-bolded. */
.gz-logo-text { font-weight: 700; }

/* Marquee hero headline on large screens — capped at the base h1 max (3.4rem)
   so the hero reads premium-display, not poster-scale, on wide monitors. */
@media (min-width: 1024px) {
	.gz-hero--split .gz-hero-copy h1 { font-size: clamp(2.7rem, 3.4vw, 3.4rem); }
}

/* =====================================================================
   2. SCALE — compact rhythm (v2.26): whitespace still separates sections on
   the one-continuous plane, but without the old cinematic excess.
   ===================================================================== */
@media (min-width: 1024px) {
	.gz-section-block { padding-block: clamp(3.75rem, 6vw, 5.5rem); }
	.gz-hero-grid     { gap: clamp(2.5rem, 4vw, 4rem); }
	.gz-card-grid, .gz-industry-grid, .gz-usecase-grid, .gz-risk-grid { gap: clamp(1.25rem, 2vw, 1.75rem); }
}

/* =====================================================================
   3. DEPTH on cards + standout panels — elevation + a top light edge.
   Lift surfaces off the page with the elevation scale + an inset highlight.
   Deliberately NO backdrop-filter (these panels are opaque over near-black,
   so a blur is pure GPU cost for no visible frost) and NO blanket
   background-image on panels that already carry a meaningful gradient (the
   compare --gazer lime wash, the benefit/group gradients) — depth comes from
   the shadow + highlight, not by repainting their surface.
   ===================================================================== */
/* NOTE: the v1.3 layer styles the card box-shadow via `.gz-card:not(.gz-bento--cta)`
   (specificity 0,2,0), so we match that specificity (and keep the existing lime
   bevel) to add a RESTING drop-shadow — cards now sit lifted off the page, not
   only on hover. */
.gz-card:not(.gz-bento--cta),
.gz-usecase-card,
.gz-risk-card,
.gz-benefit-card,
.gz-svc-checklist-card,
.gz-compare-panel,
.gz-svc-group {
	box-shadow: var(--gz-elev-2), var(--gz-bevel);
}

/* Subtle glass sheen only on the flat-colour cards (.gz-card base is a solid
   colour, so a gradient overlay reads as a light edge and clobbers nothing). */
.gz-card:not(.gz-bento--cta) { background-image: var(--gz-glass-bg); }

/* Hover/focus: a deeper elevation lift. Lime light on hover is owned by the
   v2.19 cursor spotlight + the primary CTA — it is not repeated here, so lime
   stays a signal rather than piling up. */
.gz-card:not(.gz-bento--cta):hover, .gz-card:not(.gz-bento--cta):focus-within,
.gz-usecase-card:hover, .gz-usecase-card:focus-within,
.gz-risk-card:hover, .gz-risk-card:focus-within,
.gz-benefit-card:hover, .gz-benefit-card:focus-within {
	box-shadow: var(--gz-elev-3), var(--gz-bevel);
}

/* =====================================================================
   4. POINTER 3D TILT on cards.
   makeover.js sets an inline `transform: perspective(...) rotateX/Y ...` on
   hover (inline wins over the per-variant :hover transforms in main.css, so
   no specificity war). We just provide the easing + a hint here.
   Gated to .gz-fx; reduced-motion users never get the listeners.
   ===================================================================== */
.gz-fx .gz-card,
.gz-fx .gz-usecase-card,
.gz-fx .gz-risk-card {
	transition: transform 160ms ease, box-shadow 240ms var(--gz-curve-soft, ease), border-color var(--gz-transition);
}

/* =====================================================================
   5. LIVE 3D HERO CENTERPIECE.
   hero-3d.js injects <canvas class="gz-hero3d"> as the first child of the
   hero media placeholder (the default visual shown until real media is set).
   Frame it like a viewfinder; let the network breathe behind the brackets.
   ===================================================================== */
/* hero-3d.js injects <canvas class="gz-hero3d gz-hero3d--bg"> as the first child
   of the homepage hero SECTION — an ambient sensor-network field BEHIND the
   hero. The hero media box is left untouched (it's the client's hero-video
   slot). Content floats above the backdrop. */
.gz-hero--split:not(.gz-svc-hero) {
	position: relative;
	overflow: hidden;
	isolation: isolate;
}
.gz-hero--split:not(.gz-svc-hero) > .gz-container {
	position: relative;
	z-index: 1;
}
.gz-hero3d--bg {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	display: block;
	z-index: 0;
	pointer-events: none;
	opacity: 0.5;
	/* Soften the field on the far left so the headline stays crisp. */
	-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 32%, #000 100%);
	        mask-image: linear-gradient(90deg, transparent 0, #000 32%, #000 100%);
}

/* =====================================================================
   6. (v2.25) The fixed graphite vignette was removed (with its makeover.js
   injection) — the one-continuous design is a solid black plane with no
   page-level background layers.
   ===================================================================== */

/* =====================================================================
   7. CTA + button depth — give the primary CTA a lit, raised feel.
   ===================================================================== */
.gz-btn--primary {
	box-shadow: var(--gz-elev-2), var(--gz-glow-rest, 0 0 16px rgba(234, 255, 18, 0.12)), inset 0 1px 0 rgba(255, 255, 255, 0.25);
}
.gz-btn--primary:hover, .gz-btn--primary:focus-visible {
	box-shadow: var(--gz-elev-3), var(--gz-lime-glow), inset 0 1px 0 rgba(255, 255, 255, 0.3);
}

/* =====================================================================
   8. REDUCED-MOTION SAFETY
   ===================================================================== */
@media (prefers-reduced-motion: reduce) {
	.gz-fx .gz-card,
	.gz-fx .gz-usecase-card,
	.gz-fx .gz-risk-card { transition-duration: 0.01ms; transform: none !important; }
}

/* =====================================================================
   9. (v2.25) The alternating section surface step (top-lit wash + lime glow
   band on --alt sections) was removed — sections share one continuous solid
   black plane; rhythm comes from whitespace + the kicker dash below.
   ===================================================================== */

/* Section kicker anchor — a small lime dash echoing the hero status dot,
   so every section head carries the same brand mark. */
.gz-kicker--section::before {
	content: "";
	display: inline-block;
	width: 18px;
	height: 2px;
	border-radius: 1px;
	background: var(--gz-lime);
	opacity: 0.85;
	vertical-align: 0.18em;
	margin-right: 0.6rem;
}

/* =====================================================================
   10. HOMEPAGE VIDEO HERO (v2.23) — full-bleed background video + centered
   content. Scoped to .gz-hero--video so every other page hero (which uses
   .gz-hero--split) is completely untouched. Background video is set via
   Customize → Gazer Images; a dark gradient shows until one is uploaded.
   ===================================================================== */
.gz-hero--video {
	position: relative;
	min-height: calc(100vh - 71px);
	min-height: calc(100svh - 71px);
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	text-align: center;
	padding: clamp(3.5rem, 8vh, 6rem) 0;
	overflow: hidden;
}
.gz-hero--video .gz-hero-bg {
	position: absolute;
	inset: 0;
	z-index: 0;
	background: radial-gradient(120% 90% at 50% 12%, #0d0f0a, #000);
}
.gz-hero--video .gz-hero-bg-video,
.gz-hero--video .gz-hero-bg-img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	filter: saturate(1.04) contrast(1.02) brightness(0.5);
}
.gz-hero--video .gz-hero-scrim {
	position: absolute;
	inset: 0;
	background: linear-gradient(180deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.58));
}
.gz-hero--video .gz-hero-bloom {
	position: absolute;
	left: 50%;
	top: 34%;
	width: 64vw;
	height: 64vw;
	transform: translate(-50%, -50%);
	background: radial-gradient(closest-side, rgba(234, 255, 18, 0.10), transparent 70%);
	filter: blur(30px);
	animation: gz-hero-bloom 20s ease-in-out infinite alternate;
	pointer-events: none;
}
@keyframes gz-hero-bloom {
	from { transform: translate(-50%, -50%) scale(1); }
	to   { transform: translate(-50%, -54%) scale(1.15); }
}
.gz-hero--video .gz-container { position: relative; z-index: 2; }
.gz-hero--video .gz-hero-center { display: flex; flex-direction: column; align-items: center; }
.gz-hero--video h1 { max-width: 18ch; margin: 0 auto; text-wrap: balance; text-shadow: 0 2px 40px rgba(0, 0, 0, 0.6); }
.gz-hero--video .gz-hero-lead { max-width: 60ch; margin: 1.4rem auto 0; text-shadow: 0 1px 20px rgba(0, 0, 0, 0.5); }
.gz-hero--video .gz-hero-actions { justify-content: center; margin-top: 2.2rem; }
.gz-hero--video .gz-hero-trust-wrap { margin-top: 2.6rem; }
.gz-hero--video .gz-hero-trust { justify-content: center; flex-wrap: wrap; }
@media (prefers-reduced-motion: reduce) {
	.gz-hero--video .gz-hero-bg-video { display: none; }
	.gz-hero--video .gz-hero-bloom { animation: none; }
}

/* =====================================================================
   11. COVERAGE TICKER (v2.24) — the industry "Key Areas Monitored" section.
   Monitored areas scroll as a compact, always-on feed. Content is duplicated
   (2×; the second set is .gz-tk--dup + aria-hidden) so the marquee loops
   seamlessly on a -50% translate. Hover pauses; reduced-motion falls back to
   a static wrapped chip row with the duplicate hidden. Compact density scale.
   ===================================================================== */
.gz-areas-ticker { margin-top: 1.75rem; overflow: hidden; -webkit-mask: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent); mask: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent); }
.gz-ticker-row { display: flex; gap: 10px; width: max-content; animation: gz-ticker 42s linear infinite; }
.gz-areas-ticker:hover .gz-ticker-row { animation-play-state: paused; }
.gz-tk { display: inline-flex; align-items: center; gap: 8px; padding: 10px 16px; border-radius: 999px; background: var(--gz-glass-bg); border: 1px solid var(--gz-glass-border); white-space: nowrap; font-family: var(--gz-font); font-weight: 600; font-size: 13.5px; }
.gz-tk-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--gz-lime); box-shadow: 0 0 8px var(--gz-lime); flex: 0 0 auto; animation: gz-ticker-pulse 2s infinite; }
.gz-tk-ic { color: var(--gz-lime); display: inline-flex; }
@keyframes gz-ticker { to { transform: translateX(-50%); } }
@keyframes gz-ticker-pulse { 0% { box-shadow: 0 0 0 0 rgba(234, 255, 18, 0.45); } 70% { box-shadow: 0 0 0 7px rgba(234, 255, 18, 0); } 100% { box-shadow: 0 0 0 0 rgba(234, 255, 18, 0); } }
@media (prefers-reduced-motion: reduce) {
	.gz-ticker-row { animation: none; flex-wrap: wrap; width: auto; justify-content: center; }
	.gz-tk-dot { animation: none; }
	.gz-tk--dup { display: none; }
}
