/* ============================================================
   RZEC FX — Showcase layer ("Command Centre")
   Loaded on the homepage on top of the base motion kit.
   Everything gated behind html.fx (added by fx.js, which exits
   entirely under prefers-reduced-motion).
   ============================================================ */

/* ---------- Hero: word boot-in ---------- */
html.fx .fxw{display:inline-block;overflow:hidden;vertical-align:bottom;padding-bottom:.1em;margin-bottom:-.1em}
html.fx .fxw>i{display:inline-block;font-style:normal;transform:translateY(118%) rotate(4deg);transition:transform .85s cubic-bezier(.19,.9,.28,1) var(--d,0ms);will-change:transform}
html.fx.fx-go .fxw>i{transform:none}

/* hero secondary elements rise */
html.fx .fxh{opacity:0;transform:translateY(28px);transition:opacity .85s ease var(--d,0ms),transform .85s cubic-bezier(.19,.9,.28,1) var(--d,0ms)}
html.fx.fx-go .fxh{opacity:1;transform:none}
html.fx .fx-rule{transform-origin:left center;transform:scaleX(0);transition:transform 1s cubic-bezier(.19,.9,.28,1) var(--d,0ms)}
html.fx.fx-go .fx-rule{transform:scaleX(1)}

/* hero photo is scrubbed by JS (parallax + slow zoom) */
html.fx .hero-banner .hero-photo{will-change:transform}

/* ember canvas layers */
.fx-embers{position:absolute;inset:0;pointer-events:none}
.hero-banner .fx-embers{z-index:1}

/* scroll cue */
.fx-cue{position:absolute;left:50%;bottom:20px;transform:translateX(-50%);z-index:2;width:26px;height:42px;border:2px solid rgba(255,255,255,.45);border-radius:14px;opacity:0;transition:opacity 1s ease 1.6s}
html.fx.fx-go .fx-cue{opacity:1}
.fx-cue::after{content:"";position:absolute;left:50%;top:8px;width:4px;height:9px;margin-left:-2px;border-radius:2px;background:#fff;animation:fx-cue 1.9s ease-in-out infinite}
@keyframes fx-cue{0%,100%{transform:translateY(0);opacity:1}70%{transform:translateY(13px);opacity:0}}

/* ============================================================
   FIRE STORY — pinned scroll-scrubbed scene
   ============================================================ */
.fire-story{display:none}
html.fx .fire-story{display:block;position:relative;background:#0a1220}
.fs-pin{position:relative;height:100vh;min-height:680px;overflow:hidden;display:flex;align-items:flex-end;justify-content:center;padding-bottom:5vh}
.fs-bg{position:absolute;inset:0;background:linear-gradient(180deg,#0a1220 0%,#0e1830 55%,#0a1220 100%)}
.fs-grid{position:absolute;inset:0;background-image:linear-gradient(rgba(120,160,210,.055) 1px,transparent 1px),linear-gradient(90deg,rgba(120,160,210,.055) 1px,transparent 1px);background-size:44px 44px}
.fs-stage{position:relative;width:min(820px,90vw);z-index:2}
.fs-stage svg{width:100%;height:auto;display:block;overflow:visible}

.fs-fire{position:absolute;width:24%;aspect-ratio:1/1;right:8%;bottom:6%;pointer-events:none;background:radial-gradient(circle at 50% 68%,rgba(255,180,70,.95),rgba(235,90,30,.6) 36%,rgba(200,16,46,.25) 60%,transparent 74%);filter:blur(13px);transform-origin:50% 88%;transform:scale(0);opacity:0}
.fs-cool{position:absolute;inset:0;z-index:3;pointer-events:none;background:linear-gradient(180deg,rgba(60,120,200,.16),rgba(25,60,120,.12));opacity:0}
.fs-embers{position:absolute;inset:0;z-index:2;pointer-events:none}

.fs-head{position:absolute;top:calc(6vh + 76px);left:0;width:100%;text-align:center;z-index:4;padding:0 20px}
.fs-head .fs-eb{font-family:'Montserrat';font-weight:700;font-size:12.5px;letter-spacing:.16em;text-transform:uppercase;color:#F4A100;display:inline-flex;align-items:center;gap:10px}
.fs-head .fs-eb::before,.fs-head .fs-eb::after{content:"";width:26px;height:2px;background:#C8102E;display:inline-block}
.fs-head h2{color:#fff;font-size:clamp(24px,3.4vw,44px);margin-top:10px}
/* basic operating principle strip (lights up stage by stage) */
.fs-flow{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 10px;margin-top:18px}
.fs-flow span{font-family:'Montserrat';font-weight:700;font-size:clamp(10px,1.2vw,12.5px);letter-spacing:.05em;text-transform:uppercase;color:#8ea3bd;padding:5px 13px;border:1px solid rgba(140,170,210,.22);border-radius:20px;transition:color .3s ease,border-color .3s ease,background .3s ease,box-shadow .3s ease}
.fs-flow i{color:#4a5a70;font-style:normal;font-weight:700;font-size:14px}
.fs-flow span.on{color:#0a1220;background:#F4A100;border-color:#F4A100;box-shadow:0 0 18px rgba(244,161,0,.5)}
@media(max-width:640px){.fs-flow{gap:6px}.fs-flow span{font-size:9.5px;padding:4px 9px}.fs-flow i{display:none}}

.fs-caps{position:absolute;left:0;top:calc(6vh + 228px);bottom:auto;width:100%;height:180px;z-index:4;pointer-events:none}
.fs-cap{position:absolute;left:50%;top:0;transform:translate(-50%,16px);width:min(720px,90vw);opacity:0;display:flex;flex-direction:column;align-items:center;gap:9px}
.fs-cn{width:38px;height:38px;border-radius:50%;background:#F4A100;color:#0a1220;font-family:'Montserrat';font-weight:800;font-size:19px;display:grid;place-items:center;box-shadow:0 0 22px rgba(244,161,0,.55)}
.fs-cap.cool .fs-cn{background:#7dd3fc;box-shadow:0 0 22px rgba(125,211,252,.55)}
.fs-cap b{font-family:'Montserrat';font-weight:800;font-size:clamp(18px,2.2vw,25px);color:#F4A100;letter-spacing:.02em}
.fs-cap.cool b{color:#7dd3fc}
.fs-cap p{margin:0;color:#d6dfea;font-size:clamp(13.5px,1.55vw,17px);line-height:1.62;max-width:640px;text-align:center}
.fs-key{font-family:'Montserrat';font-weight:700;font-size:11.5px;letter-spacing:.05em;text-transform:uppercase;color:#ffcf87;background:rgba(244,161,0,.12);border:1px solid rgba(244,161,0,.42);padding:4px 13px;border-radius:20px}
@media(max-width:760px){.fs-caps{top:calc(5vh + 208px);bottom:auto;height:220px}.fs-cap{gap:7px}.fs-cn{width:32px;height:32px;font-size:16px}}

.fs-stamp{position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;opacity:0;transform:scale(1.7);pointer-events:none;text-align:center;padding:0 20px}
.fs-stamp .box{border:3px solid #4ade80;color:#4ade80;font-family:'Montserrat';font-weight:800;font-size:clamp(22px,3.4vw,44px);letter-spacing:.14em;padding:14px 34px;border-radius:8px;transform:rotate(-4deg);text-shadow:0 0 24px rgba(74,222,128,.5);box-shadow:0 0 34px rgba(74,222,128,.22),inset 0 0 26px rgba(74,222,128,.08);background:rgba(10,18,32,.55);backdrop-filter:blur(3px)}
.fs-stamp p{color:#c9d4e2;font-size:clamp(13px,1.5vw,16.5px);max-width:520px}
.fs-stamp .btn{pointer-events:auto}
.fire-story.fs-done .fs-stamp{pointer-events:auto}

/* replay control */
.fs-replay{position:absolute;right:22px;bottom:22px;z-index:6;display:inline-flex;align-items:center;gap:8px;padding:9px 16px;border-radius:24px;border:1px solid rgba(255,255,255,.28);background:rgba(10,18,32,.5);color:#c9d4e2;font-family:'Montserrat';font-weight:600;font-size:12.5px;letter-spacing:.06em;cursor:pointer;opacity:0;transform:translateY(8px);transition:opacity .4s ease,transform .4s ease,border-color .25s ease,color .25s ease;pointer-events:none;backdrop-filter:blur(4px)}
.fire-story.fs-done .fs-replay{opacity:1;transform:none;pointer-events:auto}
.fs-replay:hover{border-color:#F4A100;color:#F4A100}
.fs-replay svg{width:14px;height:14px}

/* SVG scene bits (initial states; JS scrubs them) */
.fs-sprk{transform-origin:center;transform-box:fill-box;transform:scale(0);opacity:0}
.fs-water{opacity:0}
.fs-water .drip{stroke-dasharray:6 14;animation:fs-drip .45s linear infinite}
@keyframes fs-drip{to{stroke-dashoffset:-40}}
.fs-hw{opacity:0}
.fs-thermo{opacity:0}
#fsBulb{opacity:0}
#fsFlash{opacity:0}
#fsBulb2{opacity:0}
#fsFlash2{opacity:0}
#fsCharge{filter:drop-shadow(0 0 6px rgba(200,16,46,.85))}
/* water flowing INSIDE the pipe once heads open */
#fsFlow{opacity:0;stroke-dasharray:9 21;transition:opacity .5s ease}
.fire-story.fs-flowing #fsFlow{opacity:.95;animation:fs-flow .42s linear infinite}
@keyframes fs-flow{to{stroke-dashoffset:-30}}
/* activated sprinkler deflector spins fast */
.fs-sprk .rotor{transform-origin:center;transform-box:fill-box}
.fire-story.fs-flowing .fs-sprk.on .rotor{animation:fs-spin .12s linear infinite}
@keyframes fs-spin{to{transform:rotate(360deg)}}
/* fire pump running (cuts in on water flow) */
.fire-story.fs-pumping #fsPump{animation:fs-pump 1s ease-in-out infinite}
@keyframes fs-pump{0%,100%{filter:drop-shadow(0 0 2px rgba(200,16,46,.4))}50%{filter:drop-shadow(0 0 10px rgba(200,16,46,.95))}}

/* ============================================================
   Kinetic ghost titles
   ============================================================ */
.fx-ghost-host{position:relative;overflow:hidden}
.fx-ghost-host>.wrap{position:relative;z-index:1}
.fx-ghost{position:absolute;top:26px;left:0;width:100%;text-align:center;font-family:'Montserrat';font-weight:800;font-size:clamp(70px,12.5vw,175px);line-height:1;letter-spacing:.05em;color:transparent;-webkit-text-stroke:1.5px rgba(31,42,55,.08);pointer-events:none;white-space:nowrap;will-change:transform;z-index:0;user-select:none}
.fx-ghost.light{-webkit-text-stroke-color:rgba(255,255,255,.065)}

/* ============================================================
   Services grid — cinematic 2x3 (flip-in entrance, idle float,
   light-sweep, hover ignite)
   ============================================================ */
html.fx .services .svc{opacity:0}
html.fx .services.fx-svc-in .svc{opacity:1;animation:fx-flip .9s cubic-bezier(.18,.85,.3,1) var(--fd,0ms) backwards}
@keyframes fx-flip{0%{opacity:0;transform:perspective(950px) rotateX(22deg) translateY(64px) scale(.94);filter:blur(9px)}100%{opacity:1;transform:none;filter:blur(0)}}
/* light sweep on arrival */
html.fx .services .svc .fx-sweep{position:absolute;inset:0;pointer-events:none;z-index:3;overflow:hidden;border-radius:inherit}
html.fx .services .svc .fx-sweep::before{content:"";position:absolute;top:-30%;bottom:-30%;left:-40%;width:38%;background:linear-gradient(105deg,transparent,rgba(255,255,255,.16),transparent);transform:translateX(-140%) skewX(-14deg)}
html.fx .services.fx-svc-in .svc .fx-sweep::before{animation:fx-sweep 1.15s ease calc(var(--fd,0ms) + .55s) forwards}
@keyframes fx-sweep{to{transform:translateX(560%) skewX(-14deg)}}
/* hover ignite: icon glows amber, arrow slides */
html.fx .services .svc .ico{transition:background .25s ease,box-shadow .35s ease,transform .35s ease}
html.fx .services .svc:hover .ico{box-shadow:0 0 0 9px rgba(244,161,0,.12),0 0 30px rgba(244,161,0,.4);transform:scale(1.06)}
html.fx .services .svc:hover .more svg{transform:translateX(5px)}

/* ============================================================
   3D tilt glare
   ============================================================ */
.fx-glare{position:absolute;inset:0;pointer-events:none;border-radius:inherit;background:radial-gradient(430px at var(--gx,50%) var(--gy,50%),rgba(255,255,255,.15),transparent 62%);opacity:0;transition:opacity .35s ease;z-index:4}
.fx-tilt{will-change:transform}
.fx-tilt:hover .fx-glare{opacity:1}

/* ============================================================
   Cursor spotlight over dark sections
   ============================================================ */
.fx-spot{position:fixed;inset:0;pointer-events:none;z-index:69;opacity:0;transition:opacity .45s ease;background:radial-gradient(560px at var(--sx,50%) var(--sy,40%),rgba(244,161,0,.085),transparent 65%);mix-blend-mode:screen}
html.fx-dark .fx-spot{opacity:1}

/* ============================================================
   Stats slam-in
   ============================================================ */
html.fx .stat.m-in .num{animation:fx-slam .75s cubic-bezier(.16,.9,.3,1.15) both}
@keyframes fx-slam{0%{transform:scale(1.75);opacity:0;filter:blur(7px)}100%{transform:scale(1);opacity:1;filter:blur(0)}}

/* mobile story tweaks */
@media (max-width:760px){
  .fs-fire{width:34%;right:4%}
}
