/* ==========================================================================
   360photographers — V3 design system (reskin-in-place port).
   Loaded by app/views/inc/header.php. Nav + footer are namespaced (.v3nav / footer.ft)
   so this coexists with the legacy style.min.css while page bodies are ported one by one.
   ========================================================================== */
:root{--bg:#000;--ink:#f5f4f2;--mut:#8b8f98;--acc:#ff7f1a;--card:#17191f;
--line:rgba(255,255,255,.08);
--d:'Plus Jakarta Sans','Commissioner','Roboto',sans-serif;--w:'Unbounded','Commissioner',sans-serif}
/* consistent 16px root for the V3 chrome — legacy style.min.css shrinks html to 50% on small screens, which made the nav/logo tiny on pages (e.g. Terms) that lack the main pages' override */
html{font-size:100%}
/* 🚨 MOBILE BLACK BARS (audit teo, Motorola G34). The legacy style.min.css has
   `@media (max-width:1050px){ main{max-width:100%;padding:0 1.5rem} }` — 24px of side padding on
   <main>, which wraps the whole V3 body. Below 1050px that inset every full-bleed V3 element
   (hero, scrub video, section backgrounds) by 24px a side, so the page sat in a 312px column on a
   360px phone with black gutters. It also made `.sec3>.wrap` (92vw = 331px) WIDER than main's
   312px content box, which is why the text was clipped on the right. Both symptoms, one cause.
   Desktop never showed it because the legacy rule is scoped under 1050px.
   V3 elements manage their own gutters (.wrap = min(1180px,92vw)), so main needs none. */
body main{padding-left:0;padding-right:0;max-width:100%}
/* ===== LOW-END DEVICE PATH — html.lowfx, set by the inline <head> script in inc/header.php =====
   audit george (Motorola G34): "we need to serve to old mobiles as well, animations stuck etc,
   make something simple (by device)". Triggered by coarse pointer + <=4GB RAM, or by prefers-reduced-motion.
   Three things go: stuck reveals, the scroll-scrubbed video heroes, and compositing-heavy blur.
   Everything stays legible — nothing is hidden, only simplified.

   🚨 EVERY hero rule below is scoped to `.vhero[data-vsrc]` ON PURPOSE. It must match EXACTLY the set
   that v3.js skips (`querySelectorAll('.vhero[data-vsrc]')`) — the inner-page heroes.
   The HOME hero sections (#vhero, #earth) also carry class="vhero" but have NO data-vsrc: they are
   initialised explicitly in JS and are deliberately still scrubbed. Scoping these rules to plain
   `.vhero` collapsed the home hero's 360vh AND forced all 5 of its scroll-revealed .vcue layers
   visible at once, while its scrub kept running — every headline stacked on top of the next.
   That is the iPhone bug george reported. Do not loosen these selectors. */
/* 1. reveals can never sit stuck at opacity 0 if the observer misfires on a slow device */
.lowfx .v3 .rev,.lowfx .v3 [data-stagger]>*{opacity:1!important;transform:none!important;transition:none!important}
/* 2. the 260vh scrub hero collapses to a plain poster banner. The <video> keeps its poster attribute
      and never gets a src (v3.js skips initScrubHero), so it paints the poster with no decoding cost. */
.lowfx .v3 .vhero[data-vsrc]{height:auto!important}
.lowfx .v3 .vhero[data-vsrc] .vhero-pin{position:relative;height:min(72svh,520px)}
.lowfx .v3 .vhero[data-vsrc] .vcv,.lowfx .v3 .vhero[data-vsrc] .introfade,.lowfx .v3 .vhero[data-vsrc] .vscroll{display:none!important}
.lowfx .v3 .vhero[data-vsrc] .vcue{opacity:1!important;transform:none!important;position:absolute;left:0;bottom:0;width:100%}
/* 3. blur is the single most expensive thing on a weak GPU */
.lowfx .v3 *,.lowfx .v3nav,.lowfx footer.ft *,.lowfx .ccbar{backdrop-filter:none!important;-webkit-backdrop-filter:none!important}
.lowfx .v3nav .lk{background:rgba(6,7,10,.96)}
.lowfx #voidbg{display:none}

.v3nav *,footer.ft *,.v3 *{box-sizing:border-box}
.v3,.v3 a{color:var(--ink)}
.v3 a{text-decoration:none}

/* ===== PILL NAV ===== */
.v3nav{position:fixed;top:0;left:0;right:0;z-index:90;display:flex;justify-content:space-between;align-items:center;padding:20px 4vw;text-shadow:0 1px 10px rgba(0,0,0,.5);transition:padding .3s;font-family:var(--d)}
.v3nav.scrolled{padding:12px 4vw}
.v3nav .lg{display:flex;gap:10px;align-items:center;font-weight:800;font-size:1rem;color:#fff}
.v3nav .lg img{width:42px;height:42px}
.v3nav .lg b{color:var(--acc)}
.logomask{-webkit-mask:radial-gradient(circle closest-side at 50% 50%,#000 79%,transparent 82%);mask:radial-gradient(circle closest-side at 50% 50%,#000 79%,transparent 82%)}
.v3nav .lk{position:relative;display:flex;align-items:center;font-size:.8rem;color:#f4f4f4;text-shadow:none;overflow:hidden;transition:.35s;list-style:none;margin:0;padding:5px;
  background:rgba(8,9,12,.4);backdrop-filter:blur(18px) saturate(1.4);-webkit-backdrop-filter:blur(18px) saturate(1.4);
  border:1px solid rgba(255,255,255,.16);border-radius:100px;box-shadow:0 10px 34px rgba(0,0,0,.32),inset 0 1px 0 rgba(255,255,255,.1)}
.v3nav .lk::before{content:"";position:absolute;width:180px;height:180px;border-radius:50%;background:radial-gradient(circle,rgba(255,127,26,.45),transparent 65%);left:var(--mx,50%);top:var(--my,50%);transform:translate(-50%,-50%);filter:blur(16px);opacity:.55;pointer-events:none;z-index:0}
.v3nav .lk::after{content:"";position:absolute;inset:0;border-radius:inherit;background:linear-gradient(115deg,transparent 30%,rgba(255,255,255,.22) 46%,transparent 60%);transform:translateX(-120%);transition:transform .7s;pointer-events:none;z-index:0}
.v3nav .lk:hover{border-color:rgba(255,127,26,.6);box-shadow:0 8px 40px rgba(255,127,26,.25)}
.v3nav .lk:hover::after{transform:translateX(120%)}
.v3nav .lk a{position:relative;z-index:1;padding:9px 15px;border-radius:100px;white-space:nowrap;transition:color .25s,background .25s,transform .12s;color:#f4f4f4}
.v3nav .lk a:hover{color:#fff;background:rgba(255,255,255,.08)}
.v3nav .lk a:active{transform:scale(.93);background:rgba(255,127,26,.28);color:#fff}
.v3nav .lk a.active{color:var(--acc);background:rgba(255,127,26,.14);box-shadow:inset 0 0 0 1px rgba(255,127,26,.4)}
.hscroll .hscroll-scroll{position:absolute;left:50%;bottom:26px;transform:translateX(-50%);z-index:4}
/* preloader (restored from prototype) — spinning masked logo + 0→360° counter, curtain lifts on load */
#loader{position:fixed;inset:0;background:#000;z-index:9999;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:24px;transition:clip-path .9s cubic-bezier(.85,0,.15,1)}
#loader.done{clip-path:inset(0 0 100% 0);pointer-events:none}
#loader img{width:104px;height:104px}
#loader b{font-family:var(--w),"Plus Jakarta Sans",sans-serif;font-size:.8rem;color:var(--acc);letter-spacing:.3em}
@media(prefers-reduced-motion:reduce){#loader{transition:opacity .4s}#loader.done{clip-path:none;opacity:0}}
.v3nav .lk .lang{display:inline-flex;gap:6px;align-items:center;padding:9px 12px;font-size:.78rem;color:var(--mut)}
.v3nav .lk .lang a{padding:2px 4px}
.v3nav .lk .lang a.active{color:var(--acc)}
.nav-burger{display:none;flex-direction:column;justify-content:center;gap:5px;width:46px;height:46px;padding:0 12px;cursor:pointer;z-index:96;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,.04);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,.14);border-radius:50%;transition:border-color .25s,background .25s}
.nav-burger span{display:block;height:2px;width:20px;background:#e8e8e8;border-radius:2px;transition:transform .3s,opacity .3s,background .2s}
.nav-burger:hover,.nav-burger:active{border-color:rgba(255,127,26,.6)}
.nav-burger:hover span,.nav-burger:active span{background:var(--acc)}
.v3nav.open .nav-burger span:nth-child(1){transform:translateY(7px) rotate(45deg)}
.v3nav.open .nav-burger span:nth-child(2){opacity:0}
.v3nav.open .nav-burger span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}
@media(max-width:900px){
  .v3nav .lg-txt{display:none}
  .nav-burger{display:flex}
  .v3nav .lk{position:fixed;inset:0;flex-direction:column;justify-content:center;align-items:center;gap:0;font-size:1.4rem;background:rgba(6,7,10,.97);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:0;border-radius:0;padding:0;box-shadow:none;opacity:0;pointer-events:none;transform:translateY(-6px);transition:opacity .3s,transform .3s;z-index:95}
  .v3nav.open .lk{opacity:1;pointer-events:auto;transform:none}
  .v3nav .lk::before,.v3nav .lk::after{display:none}
  .v3nav .lk a{width:min(74%,340px);text-align:center;padding:18px 0;font-size:1.35rem;color:#f2f2f2;border-bottom:1px solid rgba(255,255,255,.09)}
  .v3nav .lk a:hover,.v3nav .lk a:active,.v3nav .lk a.active{color:var(--acc)}
  .v3nav .lk .lang{padding-top:26px}
}

/* ===== LIQUID GLASS BUTTON ===== */
.lg-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;text-align:center;gap:10px;padding:16px 32px;border-radius:100px;font-family:var(--d);font-weight:600;font-size:.95rem;color:#fff;background:rgba(8,9,12,.36);border:1px solid rgba(255,255,255,.18);backdrop-filter:blur(16px) saturate(1.3);-webkit-backdrop-filter:blur(16px) saturate(1.3);overflow:hidden;cursor:pointer;transition:.35s;text-decoration:none}
.lg-btn::before{content:"";position:absolute;width:130px;height:130px;border-radius:50%;background:radial-gradient(circle,rgba(255,127,26,.5),transparent 65%);left:var(--mx,20%);top:var(--my,50%);transform:translate(-50%,-50%);filter:blur(14px);transition:opacity .3s;opacity:.65;pointer-events:none}
.lg-btn::after{content:"";position:absolute;inset:0;border-radius:inherit;background:linear-gradient(115deg,transparent 30%,rgba(255,255,255,.25) 46%,transparent 60%);transform:translateX(-120%);transition:transform .7s}
.lg-btn:hover{border-color:rgba(255,127,26,.6);box-shadow:0 8px 40px rgba(255,127,26,.25)}
.lg-btn:hover::after{transform:translateX(120%)}
.lg-btn.solid{background:var(--acc);color:#140900;border-color:transparent}

/* ===== SHARED TYPOGRAPHY (v3 pages) ===== */
.v3 .kick{font-family:var(--w);font-size:.72rem;letter-spacing:.32em;color:var(--acc);text-transform:uppercase;display:inline-block;margin-bottom:18px}
.v3 .lead{max-width:640px;color:var(--mut);font-weight:300;font-size:clamp(15px,1.15vw,18px);line-height:1.7}   /* px, not rem (legacy root-scaling shrank it) */
.v3 .sec-t{font-family:var(--w);font-weight:700;font-size:clamp(1.7rem,4vw,3rem);line-height:1.05;letter-spacing:-.02em;text-transform:uppercase;margin-bottom:12px}
.v3 .sec-t em{font-style:normal;color:var(--acc)}
.v3 .o{color:var(--acc)}

/* ===== FOOTER (grey folder card) ===== */
footer.ft{position:relative;z-index:2;margin-top:14vh;padding:0 clamp(12px,2vw,28px) clamp(24px,3vw,44px);background:transparent;overflow:visible;font-family:var(--d)}
/* ===== Footer panel: landonorris-style shape (rounded corners + raised top-center tab + wide bottom foot, all with fixed 45° diagonals & fixed corner radii). The mask is GENERATED to the card's exact px by initFooterShape() in v3.js so nothing distorts when it stretches. ===== */
footer.ft .ft-card{position:relative;z-index:1;background:var(--card);border-radius:clamp(26px,3vw,46px);
  padding:clamp(74px,9vw,128px) clamp(30px,5vw,76px) clamp(46px,4vw,64px);overflow:hidden;isolation:isolate;
  background-image:radial-gradient(circle at 20% 10%,rgba(255,127,26,.05),transparent 40%)}
footer.ft .ft-lead{position:relative;z-index:4;text-align:center;max-width:1040px;margin:0 auto}
footer.ft .ft-lead .kick{font-family:var(--w);font-size:.72rem;letter-spacing:.32em;color:var(--acc);text-transform:uppercase;display:block}
footer.ft .ft-lead h2{font-family:var(--w);font-weight:700;font-size:clamp(1.9rem,5.2vw,4.4rem);line-height:1.04;letter-spacing:-.02em;text-transform:uppercase;color:#efeeec;margin:8px 0 0}
/* white + orange duotone headline (landonorris-style split, our type/colours) */
footer.ft .ft-lead h2 .g{color:transparent;-webkit-text-stroke:1px rgba(255,127,26,.4)}   /* ghost 360 in orange */
footer.ft .ft-lead h2 .o{color:var(--acc)}
footer.ft .ft-lead h2 .d1{color:#f4f3f1}     /* PHOTO — white */
footer.ft .ft-lead h2 .d2{color:var(--acc)}  /* GRAPHERS — orange */
footer.ft .ft-benefits{display:flex;gap:8px 24px;justify-content:center;flex-wrap:wrap;margin-top:22px;color:var(--mut);font-size:.92rem;font-weight:300}
footer.ft .ft-benefits span{display:inline-flex;align-items:center;gap:9px}
footer.ft .ft-benefits span::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--acc);flex:none}
footer.ft .ft-stage{position:relative;z-index:2;display:flex;justify-content:center;gap:clamp(30px,6vw,90px);flex-wrap:wrap;margin-top:clamp(28px,3.5vw,50px)}
footer.ft .ft-col{position:relative;z-index:4;display:flex;flex-direction:column;gap:11px;list-style:none;padding:0;margin:0}
footer.ft .ft-h{font-family:var(--w);font-size:.62rem;letter-spacing:.26em;color:var(--acc);text-transform:uppercase;margin-bottom:6px}
footer.ft .ft-col a{position:relative;color:var(--mut);font-size:1.02rem;font-weight:300;width:fit-content;transition:color .25s,transform .25s cubic-bezier(.2,.9,.2,1)}
footer.ft .ft-col a::before{content:"";position:absolute;left:-15px;top:50%;width:7px;height:7px;border-radius:50%;background:var(--acc);transform:translateY(-50%) scale(0);transition:transform .32s cubic-bezier(.3,1.5,.4,1)}
footer.ft .ft-col a:hover{color:#fff;transform:translateX(15px)}
footer.ft .ft-col a:hover::before{transform:translateY(-50%) scale(1)}
footer.ft .ft-cta-wrap{position:relative;z-index:4;display:flex;flex-direction:column;align-items:center;gap:13px;margin:clamp(26px,3vw,44px) auto 0}
footer.ft .ft-bigcta{font-size:1.06rem;padding:19px 42px;animation:ctaPulse 2.8s ease-in-out infinite}
footer.ft .ft-bigcta:hover{transform:translateY(-2px)}
@keyframes ctaPulse{0%,100%{box-shadow:0 8px 30px rgba(255,127,26,.26)}50%{box-shadow:0 12px 52px 6px rgba(255,127,26,.52)}}
footer.ft .ft-cta-sub{font-size:.8rem;color:var(--mut)}
footer.ft .ft-logo{width:90px;height:90px;margin:0 auto 8px}
/* meta now lives OUT of the gray card, on the black, in the bottom corners (flanking the foot) — like landonorris */
footer.ft .fmeta{position:relative;z-index:4;display:flex;align-items:flex-end;justify-content:space-between;color:var(--mut);font-size:.78rem;margin:clamp(18px,2vw,30px) 0 0;padding:0 clamp(20px,3.2vw,54px);flex-wrap:wrap;gap:10px 22px}
footer.ft .fmeta-legal{display:flex;gap:8px 20px;flex-wrap:wrap;justify-content:flex-end}
/* desktop (row mode only): pull the meta UP into the black corners that flank the foot. JS adds .ft-stack when the
   gap between the two link groups reaches 200px — then the meta is reparented ONTO the gray card instead (below). */
@media(min-width:720px){footer.ft:not(.ft-stack) .fmeta{flex-wrap:nowrap;margin-top:-62px}}
/* row mode: the pulled-up meta row intrudes ~87px into the card's bottom zone — extra bottom padding lifts the CTA clear of it (audit george: CTA overlapped the links) */
@media(min-width:720px){footer.ft:not(.ft-stack) .ft-card{padding-bottom:clamp(110px,9vw,132px)}}
/* mobile view (.ft-stack): meta lives INSIDE the gray card — centered column above the card's bottom edge */
footer.ft.ft-stack .ft-card .fmeta{position:relative;z-index:4;flex-direction:column;align-items:center;text-align:center;gap:10px;margin:clamp(20px,3vw,32px) 0 0;padding:0 16px}
footer.ft.ft-stack .ft-card .fmeta-legal{justify-content:center}
footer.ft .fmeta-legal a{color:var(--mut);transition:color .2s}
footer.ft .fmeta-legal a:hover{color:var(--acc)}
@media(max-width:760px){footer.ft .ft-stage{flex-direction:column;align-items:center;text-align:center;gap:26px}footer.ft .ft-col{align-items:center}footer.ft .ft-col a:hover{transform:none}
  /* when copyright + legal don't fit left/right, stack them: legal links first, copyright below (Lando-style) */
  footer.ft .fmeta{flex-direction:column;align-items:center;text-align:center;gap:12px}
  footer.ft .fmeta-legal{order:-1;justify-content:center}}

/* ==========================================================================
   HOME (index.php) — scoped under .v3 so un-ported pages keep their legacy CSS
   ========================================================================== */
html,body{background:#000}   /* pitch-black base so the #voidbg ambient (ghost words + logo) reads behind everything */
.v3{position:relative;z-index:1;background:transparent;color:var(--ink);font-family:var(--d)}
.v3 .wrap{width:min(1180px,92vw);margin:0 auto}
.v3 img{max-width:100%;display:block}
.v3 hr{display:none}
.v3 a{color:inherit;text-decoration:none}

/* hero */
.v3-home-hero{padding:calc(78px + 5vh) 0 5vh}
.v3 .hero-2col{display:grid;grid-template-columns:1.08fr .92fr;gap:clamp(30px,5vw,66px);align-items:center}
.v3 .hero-copy h1{font-family:var(--w);font-weight:700;font-size:clamp(2.6rem,6vw,5rem);line-height:1;letter-spacing:-.03em;text-transform:uppercase;margin:0}
.v3 .hero-copy .lead{margin:22px 0 30px}
.v3 .hero-copy .lead a{color:var(--acc)}
.v3 .hero-media{position:relative}
.v3 .hero-media img{width:100%;border-radius:22px;border:1px solid var(--line);box-shadow:0 40px 90px -30px rgba(0,0,0,.8)}
.v3 .hero-media::after{content:"";position:absolute;inset:0;border-radius:22px;box-shadow:inset 0 0 0 1px rgba(255,127,26,.12);pointer-events:none}
@media(max-width:860px){.v3 .hero-2col{grid-template-columns:1fr;gap:34px}}

/* sections + grids + cards */
.v3-sec{padding:clamp(46px,7vw,92px) 0;position:relative;z-index:1}
.v3-sec .sec-t{text-align:center}
.v3 .grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:clamp(30px,4vw,50px)}
@media(max-width:900px){.v3 .grid3{grid-template-columns:1fr 1fr}}
@media(max-width:600px){.v3 .grid3{grid-template-columns:1fr}}
.v3 .card3{position:relative;border-radius:20px;overflow:hidden;border:1px solid var(--line);background:#14161b;display:block;transition:border-color .3s,transform .3s,box-shadow .3s}
.v3 .card3:hover{border-color:rgba(255,127,26,.4);transform:translateY(-4px);box-shadow:0 22px 60px -18px rgba(255,127,26,.35),0 12px 40px rgba(0,0,0,.5)}
.v3 .card3 .c-img{overflow:hidden;height:210px;background:#0e1015}
.v3 .card3 .c-img img{width:100%;height:100%;object-fit:cover;transition:transform .6s}
.v3 .card3:hover .c-img img{transform:scale(1.06)}
.v3 .card3 .c-body{padding:18px 20px 22px}
.v3 .card3 .c-cap{font-weight:600;font-size:1rem;line-height:1.35;margin:0;color:var(--ink)}
.v3 .card3 .c-go{position:absolute;top:14px;right:14px;z-index:2;width:42px;height:42px;border-radius:50%;background:var(--acc);color:#140900;display:flex;align-items:center;justify-content:center;font-size:1.15rem;opacity:0;transform:translateY(-6px);transition:.3s}
.v3 .card3:hover .c-go{opacity:1;transform:none}
.v3 .card3.cta-card{display:flex;align-items:center;justify-content:center;text-align:center;padding:30px;background:linear-gradient(160deg,#1a1c22,#101116);font-family:var(--w);font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:#fff;line-height:1.3}
.v3 .card3.cta-card .o{color:var(--acc)}

/* feature rows */
.v3 .feature-row{display:grid;grid-template-columns:1fr 1fr;gap:clamp(30px,5vw,64px);align-items:center}
.v3 .feature-row.reverse .feature-media{order:-1}
.v3 .feature-copy .sec-t{text-align:left}
.v3 .feature-copy .lead{margin:18px 0 26px}
.v3 .feature-media img{width:100%;border-radius:20px;border:1px solid var(--line)}
@media(max-width:860px){.v3 .feature-row{grid-template-columns:1fr;gap:30px}.v3 .feature-row.reverse .feature-media{order:0}}

/* stats block (reskinned statistics.php — NO green) */
.v3 .stats-2col{display:grid;grid-template-columns:1fr 1fr;gap:clamp(30px,5vw,64px);align-items:center}
@media(max-width:860px){.v3 .stats-2col{grid-template-columns:1fr;gap:34px}}
.v3 .v3-stats{background:var(--card);border:1px solid var(--line);border-radius:22px;padding:clamp(26px,3vw,40px)}
.v3 .statbars{list-style:none;margin:18px 0 0;padding:0;display:flex;flex-direction:column;gap:20px}
.v3 .statbars li{display:grid;grid-template-columns:auto 1fr;grid-template-areas:"num label" "bar bar";gap:6px 14px;align-items:baseline}
.v3 .statbars b{grid-area:num;font-family:var(--w);font-weight:700;font-size:1.5rem;color:var(--mut)}
.v3 .statbars li.win b{color:var(--acc);font-size:1.9rem}
.v3 .statbars b em{font-style:normal;font-size:.6em}
.v3 .statbars li>span{grid-area:label;color:var(--mut);font-weight:300;font-size:.92rem;align-self:center}
.v3 .statbars i{grid-area:bar;display:block;height:8px;border-radius:100px;background:rgba(255,255,255,.06);position:relative;overflow:hidden;margin-top:4px}
.v3 .statbars i::after{content:"";position:absolute;left:0;top:0;height:100%;width:var(--w,0);border-radius:100px;background:rgba(255,255,255,.22);transition:width 1.2s cubic-bezier(.2,.9,.2,1)}
.v3 .statbars li.win i::after{background:linear-gradient(90deg,#ffc489,var(--acc));box-shadow:0 0 12px rgba(255,127,26,.5)}
.v3 .rev:not(.in) .statbars i::after{width:0!important}
.v3 .statnote{color:var(--mut);font-weight:300;font-size:.92rem;line-height:1.6;margin-top:22px}
.v3 .stats-copy .sec-t{text-align:left}
.v3 .stats-copy .lead{margin:16px 0 26px}

/* reveal (scoped) */
.v3 .rev{opacity:0;transform:translateY(26px);transition:opacity .8s cubic-bezier(.2,.9,.2,1),transform .8s cubic-bezier(.2,.9,.2,1)}
.v3 .rev.in{opacity:1;transform:none}
.v3 [data-stagger]>*{opacity:0;transform:translateY(24px);transition:opacity .7s cubic-bezier(.2,.9,.2,1),transform .7s cubic-bezier(.2,.9,.2,1)}
.v3 [data-stagger].in>*{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){.v3 .rev,.v3 [data-stagger]>*{opacity:1!important;transform:none!important}}

/* ==========================================================================
   SCROLL-SCRUB VIDEO HERO + smart-gap (homepage) — ported from _v3.html, scoped .v3
   ========================================================================== */
.v3 .vhero{position:relative;z-index:2;width:100vw;margin-left:calc(50% - 50vw)}/* full-bleed: cancel MAIN side padding so video/canvas fills edge-to-edge (audit teo c6a4e462 — mobile black bars) */
.v3 .vhero-pin{position:sticky;top:0;height:100svh;overflow:hidden;background:#000}
.v3 .vhero video,.v3 .vhero .vcv{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 40%}
.v3 .vhero .vcv{display:none;z-index:1}
.v3 .vhero .introfade{position:absolute;inset:0;z-index:2;background:#000;pointer-events:none;opacity:0}
.v3 .vhero .scrim{position:absolute;inset:0;z-index:2;pointer-events:none;
  background:radial-gradient(ellipse at 62% 40%,transparent 44%,rgba(5,5,6,.55) 88%),
  linear-gradient(0deg,var(--bg) 3%,rgba(5,5,6,.35) 26%,transparent 52%),
  linear-gradient(96deg,rgba(5,5,6,.72),rgba(5,5,6,.15) 42%,transparent 62%)}
.v3 .vcue{position:absolute;left:0;bottom:0;width:100%;padding:0 4vw 12vh;z-index:3;opacity:0;will-change:opacity,transform;pointer-events:none}
/* ==== DEVICE STACK — scroll-scrubbed stacking device cards (rebuild per George's sticky-scale ref) ==== */
.v3 .devstack{position:relative;z-index:2}
.v3 .devstack-pin{position:sticky;top:0;height:100svh;overflow:hidden;display:flex;align-items:center}
.v3 .devstack .dwrap{display:grid;grid-template-columns:300px 1fr;gap:30px;align-items:center;width:min(1180px,92vw);margin:0 auto;height:100%}
.v3 .devstack .dtitles{align-self:center}
.v3 .devstack .dtitles .kick{display:block;margin-bottom:18px}
.v3 .devstack .dtitles .big{font-family:var(--w);font-weight:700;font-size:clamp(1.9rem,4vw,3.6rem);line-height:1.02;letter-spacing:-.02em;text-transform:uppercase;margin:0 0 26px}
.v3 .devstack .dtitles .big .o{color:var(--acc)}
.v3 .dlist{list-style:none;margin:0;padding:0;display:grid;gap:14px}
.v3 .dlist li{display:flex;align-items:baseline;gap:14px;opacity:.34;transform:translateX(0);transition:opacity .4s ease,transform .4s ease,color .4s ease}
.v3 .dlist li .dn{font-family:var(--w);font-size:.8rem;color:var(--mut);letter-spacing:.1em}
.v3 .dlist li .dl{font-family:var(--w);font-weight:700;font-size:1.15rem;color:#fff}
.v3 .dlist li.on{opacity:1;transform:translateX(8px)}
.v3 .dlist li.on .dn{color:var(--acc)}
.v3 .dlist li.on::before{content:"";width:20px;height:2px;background:var(--acc);align-self:center;box-shadow:0 0 10px var(--acc)}
.v3 .devstack .dstage{position:relative;height:100%;perspective:1400px}
.v3 .devcard{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);will-change:transform,opacity;filter:drop-shadow(0 50px 80px rgba(0,0,0,.6))}
.v3 .devcard .dev-screen{position:relative;overflow:hidden;background:#05070c}
.v3 .devcard .dev-screen img{width:100%;height:100%;object-fit:cover;display:block}
.v3 .devcard .dev-screen::after{content:"";position:absolute;inset:0;background:linear-gradient(120deg,rgba(255,255,255,.14),transparent 40%);pointer-events:none}   /* subtle glass glare */
/* iPhone */
.v3 .dev-phone{width:clamp(180px,20vw,224px);aspect-ratio:9/19.2;border-radius:34px;background:#0a0b0e;border:2px solid #2a2c33;box-shadow:inset 0 0 0 2px #000,0 40px 90px -20px rgba(0,0,0,.85);padding:9px}
.v3 .dev-phone .dev-screen{height:100%;border-radius:26px}
.v3 .dev-phone .ph-notch{position:absolute;top:16px;left:50%;transform:translateX(-50%);width:58px;height:17px;background:#000;border-radius:11px;z-index:3}
/* iPad */
.v3 .dev-tablet{width:clamp(280px,34vw,420px);aspect-ratio:4/3;border-radius:22px;background:#0a0b0e;border:2px solid #2a2c33;box-shadow:inset 0 0 0 2px #000,0 44px 100px -24px rgba(0,0,0,.85);padding:12px}
.v3 .dev-tablet .dev-screen{height:100%;border-radius:10px}
/* MacBook */
.v3 .dev-laptop{width:clamp(290px,44vw,560px)}
.v3 .dev-laptop .lp-lid{background:#0a0b0e;border:2px solid #2a2c33;border-radius:16px;padding:12px 12px 12px;box-shadow:inset 0 0 0 2px #000}
.v3 .dev-laptop .dev-screen{aspect-ratio:16/10;border-radius:6px}
.v3 .dev-laptop .lp-base{display:block;width:114%;margin-left:-7%;height:14px;background:linear-gradient(#c6c9ce,#7f838a);border-radius:0 0 12px 12px;position:relative;box-shadow:0 22px 40px -18px rgba(0,0,0,.8)}
.v3 .dev-laptop .lp-base::after{content:"";position:absolute;top:0;left:50%;transform:translateX(-50%);width:84px;height:6px;background:#54575d;border-radius:0 0 7px 7px}
/* VR headset — Meta-Quest-3-style: WHITE rounded pebble body, black front strip with 3 pill cameras, white side face-pads, light strap */
.v3 .dev-vr{width:clamp(300px,36vw,420px);aspect-ratio:1.42/1}
.v3 .dev-vr .vr-body{position:absolute;inset:0;z-index:1;border-radius:46% 46% 43% 43%/54% 54% 46% 46%;
  background:linear-gradient(178deg,#ffffff 0%,#f4f5f7 40%,#e4e6ea 78%,#d4d7dc 100%);   /* white pebble body */
  box-shadow:0 48px 92px -26px rgba(0,0,0,.72),inset 0 4px 5px rgba(255,255,255,.95),inset 0 -14px 26px rgba(0,0,0,.09)}
.v3 .dev-vr .vr-face{position:absolute;left:11%;right:11%;top:38%;bottom:15%;border-radius:70px;   /* black front sensor strip */
  background:linear-gradient(180deg,#2a2c31,#0b0c0f 82%);
  box-shadow:inset 0 3px 8px rgba(0,0,0,.85),inset 0 0 0 1px rgba(0,0,0,.6),0 2px 3px rgba(255,255,255,.55)}
.v3 .dev-vr .vr-cam{position:absolute;top:50%;transform:translateY(-50%);width:12.5%;height:66%;border-radius:40px;
  background:radial-gradient(62% 54% at 50% 32%,#3a3d45,#050608 74%);box-shadow:inset 0 0 0 1px rgba(255,255,255,.06),inset 0 5px 12px rgba(0,0,0,.9)}
.v3 .dev-vr .vr-cam::after{content:"";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:44%;aspect-ratio:1;border-radius:50%;
  background:radial-gradient(circle at 40% 34%,#767a84,#0a0b0e 66%);box-shadow:inset 0 0 3px rgba(255,255,255,.25),0 0 5px rgba(0,0,0,.6)}
.v3 .dev-vr .vr-cam.c1{left:19%}
.v3 .dev-vr .vr-cam.c2{left:44%}
.v3 .dev-vr .vr-cam.c3{left:69%}
.v3 .dev-vr .vr-pad{position:absolute;z-index:0;top:40%;width:17%;height:44%;border-radius:50%;   /* white facial-interface wings peeking at the sides */
  background:linear-gradient(180deg,#ffffff,#dcdee2);box-shadow:0 14px 26px -12px rgba(0,0,0,.45),inset 0 2px 3px rgba(255,255,255,.9)}
.v3 .dev-vr .vr-pad.l{left:-5%}
.v3 .dev-vr .vr-pad.r{right:-5%}
.v3 .dev-vr .vr-strap{position:absolute;z-index:-1;bottom:56%;left:27%;right:27%;height:66%;border-radius:60px 60px 30px 30px;   /* light strap arching over the top */
  background:linear-gradient(180deg,#edeef1,#c7cace);box-shadow:inset 0 2px 0 rgba(255,255,255,.9),0 18px 34px -18px rgba(0,0,0,.6)}
@media(max-width:820px){
  .v3 .devstack .dwrap{grid-template-columns:1fr;gap:0;justify-items:center}
  .v3 .devstack .dtitles{position:absolute;top:8vh;left:0;right:0;text-align:center;z-index:5;align-self:auto}
  .v3 .dlist{justify-items:center}
  .v3 .dlist li.on::before{display:none}
  .v3 .devstack .dstage{width:100%}
}
.v3 .vcue.on{pointer-events:auto}
.v3 .vcue-c{max-width:min(1280px,95vw)}
/* hero-cue headline that WRAPS (used by Contact + inner-page video heroes; long ranking TITLEs never overflow) */
.v3 .vcue h1{font-family:var(--w);font-weight:700;font-size:clamp(2rem,5vw,4.6rem);line-height:1.02;letter-spacing:-.025em;text-transform:uppercase;margin:0;max-width:20ch}
.v3 .vcue h1 .o{color:var(--acc)}
/* SHUTTER title reveal (top <h1> load animation, built by initShutterTitle) — per-char blur-in + orange slice sweeps.
   Word-grouped (.sh-word nowrap) so a heading never breaks mid-word. */
/* audit teo T1/T2 — pre-paint hold: the hero title AND its secondary text stay invisible until the reveal starts,
   so they appear WITH the animation instead of flashing in first. `shpre` is set by an inline <head> script
   (JS-only, not under reduced-motion) and removed the moment the reveal is queued; a 3s failsafe also clears it. */
/* !important: the scrub hero writes INLINE opacity:1 on [data-reveal] elements at scroll-top (Contact/Testimonials
   heroes), which would beat this hold and flash the title before its reveal — the hold must win until released */
html.shpre .v3 h1,
html.shpre .v3 .vcue-c .kick,
html.shpre .v3 .vcue-c .lead,
html.shpre .v3 .vcue-c .hero-ctas,
html.shpre .v3 .phero3-in .lead,
html.shpre .v3 .hero-copy .sub,
html.shpre .v3 .hero-copy .hero-ctas{opacity:0!important}
.v3 h1 .sh-word{display:inline-block;white-space:nowrap}
.v3 h1 .sh-char{position:relative;display:inline-block;overflow:hidden;vertical-align:top}
.v3 h1 .sh-char>.m{display:inline-block}
.v3 h1 .sh-char>.sl{position:absolute;left:0;top:0;pointer-events:none;white-space:pre;opacity:0;will-change:transform,opacity;color:var(--acc)}
.v3 h1 .sh-char>.sl::after{content:attr(data-c)}   /* slice glyph via CSS content — keeps the real letters out of the DOM text */
.v3 h1 .sh-char>.sl.s1{clip-path:polygon(0 0,100% 0,100% 35%,0 35%)}
.v3 h1 .sh-char>.sl.s2{clip-path:polygon(0 35%,100% 35%,100% 65%,0 65%);color:#ffe3c2}
.v3 h1 .sh-char>.sl.s3{clip-path:polygon(0 65%,100% 65%,100% 100%,0 100%)}
.v3 .vcue .kick{display:block;margin-bottom:22px}
.v3 .vcue .hero-ctas{pointer-events:auto}
.v3 .vscroll{position:absolute;left:50%;bottom:26px;transform:translateX(-50%);z-index:4;display:flex;flex-direction:column;align-items:center;gap:9px;font-family:var(--w);font-size:.6rem;letter-spacing:.34em;color:var(--mut);text-transform:uppercase;transition:opacity .55s ease}
.v3 .vscroll.hide{opacity:0;pointer-events:none}
/* audit george: "when the cookies consent pop up is there it overlaps the scroll animation, it is
   not visible, when this happens put the scroll animation higher than the consent window".
   v3.js measures the bar and sets --ccH, then flags <html>. Both axes are handled: the reminder is
   pushed ABOVE the bar so they never share space, and its z-index clears the bar's 120 in case a
   hero ever stacks differently. Reverts the moment a choice is made. */
html.cc-on .v3 .vscroll{bottom:calc(26px + var(--lift, 0px));z-index:130}
html.cc-on .v3 .vscroll3{bottom:calc(22px + var(--lift, 0px));z-index:130}
/* Desktop/tablet keep the vertical beam. On burger/mobile screens the beam overlapped the CTA →
   drop the beam and show a compact HORIZONTAL blinking "scroll" instead; JS still toggles .hide (on scroll)
   and .remind (idle re-reveal), so the idle-interval blink is preserved. */
@media(max-width:900px){
  .v3 .vhero .vscroll i{display:none}
  .v3 .vhero .vscroll{bottom:16px;font-size:.62rem;letter-spacing:.42em;gap:0}
  .v3 .vhero .vscroll:not(.hide){animation:scrollblink 1.3s ease-in-out infinite}
}
@keyframes scrollblink{0%,100%{opacity:.28}50%{opacity:1}}
.v3 .vscroll i{position:relative;width:4px;height:54px;background:rgba(255,255,255,.12);overflow:hidden;border-radius:2px}
.v3 .vscroll i::after{content:"";position:absolute;top:0;left:0;width:100%;height:62%;border-radius:2px;background:linear-gradient(180deg,#ffc489,var(--acc) 42%,rgba(255,127,26,.15));box-shadow:0 0 12px 1.5px rgba(255,127,26,.9),0 0 4px rgba(255,170,90,.9);animation:sdrop 1.7s cubic-bezier(.7,0,.3,1) infinite}
@keyframes sdrop{0%{transform:translateY(-100%)}100%{transform:translateY(200%)}}
/* remind (idle re-reveal): let the keyframes drive opacity so it BLINKS (was opacity:1!important = flat) */
.v3 .vscroll.remind{pointer-events:auto!important;animation:remind 1.5s ease-in-out infinite}
@keyframes remind{0%,100%{transform:translateX(-50%) translateY(9px);opacity:.35}50%{transform:translateX(-50%) translateY(-3px);opacity:1}}

/* ===== «ΣΕ ΚΑΘΕ ΣΥΣΚΕΥΗ» device list ===== */
.v3 .devlist{list-style:none;margin:26px 0 0;padding:0;display:flex;flex-direction:column;gap:0;max-width:min(560px,92vw)}
.v3 .devlist li{display:flex;align-items:baseline;gap:clamp(12px,2vw,20px);padding:clamp(11px,1.6vw,16px) 0;border-bottom:1px solid rgba(255,255,255,.12)}
.v3 .devlist li:last-child{border-bottom:0}
.v3 .devlist .dn{font-family:var(--w);font-weight:700;font-size:clamp(.72rem,1.3vw,.92rem);color:var(--acc);min-width:2.4em;letter-spacing:.12em;line-height:1}
.v3 .devlist .dl{font-family:var(--d);font-weight:600;font-size:clamp(1.05rem,2.3vw,1.6rem);color:#f5f4f2;letter-spacing:.005em;line-height:1}
@media(max-width:767px){.v3 .devlist{margin-top:18px}.v3 .devlist li{padding:11px 0}}
.v3 .big{font-family:var(--w);font-weight:700;font-size:clamp(2.7rem,7.6vw,6.8rem);line-height:.98;letter-spacing:-.03em;text-transform:uppercase;margin:0}
.v3 .big .ln{display:block;overflow:hidden;white-space:nowrap}
.v3 .big .ch{display:inline-block;transform:translateY(115%)}
.v3 .big .o{color:var(--acc)}
.v3 .sub{max-width:600px;color:#c9cace;font-weight:300;font-size:clamp(16px,1.2vw,19px);line-height:1.75;margin:26px 0 34px}   /* px, not rem — legacy html{font-size:50-62.5%} was shrinking rem body text */
.v3 .sub a{color:var(--acc)}
.v3 .hero-ctas{display:flex;gap:16px;flex-wrap:wrap}
.v3 .hero-stats{position:absolute;right:4vw;bottom:12vh;z-index:3;text-align:right;display:flex;flex-direction:column;gap:18px}
.v3 .hero-stats b{font-family:var(--w);font-size:clamp(1.7rem,2vw,2.4rem);color:#fff;display:block}
.v3 .hero-stats span{font-size:.85rem;color:var(--mut);letter-spacing:.06em}
.v3 .readmore{display:none}   /* the collapse arrow only ever exists on small screens while text is collapsed */
@media(max-width:767px){
  /* Hero cue: fit the stack into the lower area, clear of the fixed nav, and let the H1 WRAP (was cut off) */
  .v3 .vcue{padding:0 6vw 8vh;bottom:0;top:auto}
  .v3 .vcue-c{max-width:100%}
  .v3 .vcue .kick{margin-bottom:10px;font-size:.58rem;letter-spacing:.2em}
  .v3 .hero-stats{display:none}
  .v3 .big{font-size:clamp(1.65rem,7.8vw,3.1rem)!important;line-height:1.06;letter-spacing:-.02em}
  .v3 .big .ln{white-space:normal;overflow:visible}      /* wrap between words instead of overflowing off-screen */
  .v3 .big .ch{transform:none!important}                 /* neutralise the letter-reveal on mobile so nothing stays clipped */
  .v3 .vcue h1{font-size:clamp(1.45rem,6.4vw,2.5rem);line-height:1.06;max-width:100%}   /* inner-hero titles: long words (e.g. PHOTOGRAPHERS) must fit, never clip */
  .v3 .sub{font-size:clamp(15px,4.2vw,18px);line-height:1.62;margin:16px 0 22px;max-width:100%}
  .v3 .hero-ctas{gap:10px}
  .v3 .hero-ctas .lg-btn{flex:1 1 100%;justify-content:center}
  .v3 .vhero .scrim{background:linear-gradient(0deg,var(--bg) 5%,rgba(5,5,6,.52) 48%,rgba(5,5,6,.36) 100%)}
  /* small-screen text-coverage rule: clamp tall text behind a tiny arrow (see initTextClamp in v3.js) */
  .v3 .tclamp{max-height:var(--cap,16vh);overflow:hidden;-webkit-mask-image:linear-gradient(180deg,#000 58%,transparent);mask-image:linear-gradient(180deg,#000 58%,transparent);transition:max-height .5s ease}
  .v3 .tclamp.open{max-height:260vh;-webkit-mask-image:none;mask-image:none}
  /* tiny arrow tucked right under the text (part of it), well clear of the CTA; gentle bob hints it's tappable */
  .v3 .readmore{display:inline-flex;align-items:center;justify-content:center;pointer-events:auto;margin:-14px 0 26px;width:30px;height:30px;padding:0;background:rgba(255,127,26,.1);border:1px solid rgba(255,127,26,.4);border-radius:50%;color:var(--acc);font-size:1rem;font-weight:700;line-height:1;cursor:pointer;animation:rmbob 1.7s ease-in-out infinite}
  .v3 .readmore:hover,.v3 .readmore:active{background:rgba(255,127,26,.22)}
  @keyframes rmbob{0%,100%{transform:translateY(0)}50%{transform:translateY(2.5px)}}
}
/* smart-gap band */
/* overflow:CLIP (not hidden) so the wide marquee never turns this band into a horizontal scroll container that steals wheel/trackpad scroll; pointer-events:none (band is decorative/aria-hidden) lets scroll+touch pass straight through to the page */
.v3 .tgap{position:relative;z-index:2;overflow:clip;pointer-events:none;background:var(--bg);border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:clamp(18px,2.6vw,34px) 0}
.v3 .tgap::before,.v3 .tgap::after{content:"";position:absolute;top:0;bottom:0;width:16vw;z-index:2;pointer-events:none}
.v3 .tgap::before{left:0;background:linear-gradient(90deg,var(--bg),transparent)}
.v3 .tgap::after{right:0;background:linear-gradient(270deg,var(--bg),transparent)}
.v3 .tgap-row{display:flex;white-space:nowrap}
.v3 .bigln{font-family:var(--w);font-weight:700;font-size:clamp(2.3rem,6.2vw,5.2rem);line-height:1;white-space:nowrap;letter-spacing:.02em;will-change:transform;color:transparent;-webkit-text-stroke:1.1px rgba(230,230,230,.22)}
.v3 .bigln b{color:var(--acc);-webkit-text-stroke:0}
.v3 .bigln i{color:var(--acc);-webkit-text-stroke:0;font-style:normal}   /* IMMERSIVE lit up in orange */

/* ==========================================================================
   FULL homepage experience sections (ported from _v3.html), scoped .v3
   ========================================================================== */
.v3 .sec{position:relative;z-index:2;padding:14vh 4vw}
.v3 .sec>.sec-t{font-family:var(--w);font-weight:700;font-size:clamp(2rem,4.6vw,3.6rem);letter-spacing:-.02em;margin-bottom:8vh;text-transform:uppercase;text-align:left}
.v3 .sec>.sec-t em{font-style:normal;color:var(--acc)}
/* benefit beam cards */
.v3 .beams{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
.v3 .beam{position:relative;border-radius:18px;padding:34px 28px;background:rgba(255,255,255,.025);overflow:hidden;min-height:230px;display:flex;flex-direction:column;justify-content:flex-end}
.v3 .beam::before{content:"";position:absolute;inset:0;border-radius:inherit;padding:1px;background:conic-gradient(from var(--a,0deg),transparent 0 82%,var(--acc) 92%,#ffd9b3 96%,transparent 100%);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;animation:beamspin 5s linear infinite}
@property --a{syntax:'<angle>';initial-value:0deg;inherits:false}
@keyframes beamspin{to{--a:360deg}}
.v3 .beam h3{font-weight:800;font-size:1.25rem;margin-bottom:8px}
.v3 .beam p{color:var(--mut);font-weight:300;font-size:.95rem;line-height:1.65}
.v3 .beam .n{position:absolute;top:24px;left:28px;font-family:var(--w);color:rgba(255,255,255,.22);font-size:2rem;z-index:2}
.v3 .beam .bgi{position:absolute;inset:0;background-size:cover;background-position:center;z-index:0;opacity:.5;filter:brightness(.4) contrast(1.04) saturate(.92);transition:transform .6s cubic-bezier(.2,.8,.2,1),opacity .35s}
.v3 .beam::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(11,12,16,.28) 0%,rgba(11,12,16,.6) 45%,rgba(11,12,16,.93) 100%);z-index:1}
.v3 .beam h3,.v3 .beam p{position:relative;z-index:2}
.v3 .beam:hover .bgi{transform:scale(1.07);opacity:.66}
.v3 .sec-t{position:relative}
/* #7 project filter — filtered cards animate in on category switch */
.v3 #pgrid .card3.appear{animation:cardin .5s cubic-bezier(.2,.8,.2,1) both}
@keyframes cardin{from{opacity:0;transform:translateY(16px) scale(.96)}to{opacity:1;transform:none}}
/* #8 CTA-section background — subtle continuous dolly-in (readnobox feel, not static) */
.v3 .cta3-bg img{animation:dollyken 15s ease-in-out infinite alternate;transform-origin:center;will-change:transform}
@keyframes dollyken{from{transform:scale(1.03)}to{transform:scale(1.13)}}
@media(prefers-reduced-motion:reduce){.v3 .cta3-bg img{animation:none}}
/* #10 Contact info — premium glass cards (was a flat centered list) */
.v3 .ccards{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;max-width:1000px;margin:0 auto}
.v3 .ccard{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:11px;padding:30px 26px;border-radius:20px;border:1px solid rgba(255,255,255,.1);background:rgba(255,255,255,.04);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);transition:transform .25s,border-color .25s,box-shadow .25s;overflow:hidden;min-height:260px}
.v3 .ccard:hover{transform:translateY(-4px);border-color:rgba(255,127,26,.45);box-shadow:0 18px 40px rgba(0,0,0,.4)}
.v3 .ccard.hl{border-color:rgba(255,127,26,.35);background:rgba(255,127,26,.06)}
.v3 .ccard .ci{width:48px;height:48px;border-radius:14px;display:flex;align-items:center;justify-content:center;background:rgba(255,127,26,.14);color:var(--acc);box-shadow:inset 0 0 0 1px rgba(255,127,26,.35)}
.v3 .ccard .ci .fico{width:24px;height:24px}
.v3 .ccard .ck{font-family:var(--w),sans-serif;font-size:.62rem;letter-spacing:.18em;text-transform:uppercase;color:var(--mut)}
.v3 .ccard .ct{font-size:1.12rem;font-weight:800;margin:0}
.v3 .ccard .cd{color:var(--mut);font-size:.9rem;line-height:1.55;margin:0 0 4px}
.v3 .ccard .lg-btn,.v3 .ccard .csocials{margin-top:auto}
.v3 .ccard .csocials{display:flex;flex-wrap:wrap;gap:8px}
@media(max-width:900px){.v3 .ccards{grid-template-columns:1fr}}
@media(max-width:900px){.v3 .beams{grid-template-columns:1fr}}
/* horizontal projects gallery */
.v3 .hscroll{position:relative;z-index:2}
.v3 .hscroll-pin{position:sticky;top:0;height:100svh;overflow:hidden;display:flex;flex-direction:column;justify-content:center}
.v3 .hscroll-head{display:flex;align-items:baseline;justify-content:space-between;gap:20px;padding:0 4vw;margin-bottom:clamp(24px,4vh,50px)}
.v3 .hscroll-head .sec-t{font-family:var(--w);font-weight:700;font-size:clamp(2rem,4.6vw,3.6rem);letter-spacing:-.02em;text-transform:uppercase;margin:0}
.v3 .hscroll-head .sec-t em{font-style:normal;color:var(--acc)}
.v3 .hscroll-hint{font-family:var(--w);font-size:.62rem;letter-spacing:.3em;color:var(--acc);text-transform:uppercase}
.v3 .hscroll-track{display:flex;gap:24px;padding:0 4vw;will-change:transform}
.v3 .hcard{flex:none;width:min(500px,82vw);border-radius:20px;overflow:hidden;border:1px solid var(--line);background:#14161b;text-decoration:none;color:inherit;position:relative;transition:border-color .3s}
.v3 .hcard:hover{border-color:rgba(255,127,26,.4)}
.v3 .hcard img{width:100%;height:clamp(280px,40vh,420px);object-fit:cover;display:block}
.v3 .hc-body{padding:20px 24px}
.v3 .hc-t{font-weight:800;font-size:1.18rem}
.v3 .hc-s{color:var(--mut);font-size:.9rem;line-height:1.5;margin-top:7px}
.v3 .hc-go{position:absolute;top:16px;right:16px;width:46px;height:46px;border-radius:50%;background:var(--acc);color:#140900;display:flex;align-items:center;justify-content:center;font-size:1.25rem;transition:transform .25s}
.v3 .hcard:hover .hc-go{transform:translateX(3px)}
.v3 .hcard-cta{display:flex;align-items:center;justify-content:center;text-align:center;background:linear-gradient(160deg,#1a1c22,#101116);padding:40px}
/* animated testimonials */
.v3 .atest{display:grid;grid-template-columns:minmax(0,340px) 1fr;gap:clamp(30px,5vw,72px);align-items:center;max-width:1000px;margin:0 auto}
.v3 .atest-photos{position:relative;width:100%;aspect-ratio:1;max-width:340px}
.v3 .atest-photos img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:26px;transition:transform .7s cubic-bezier(.4,.2,.2,1),opacity .7s;will-change:transform,opacity;box-shadow:0 24px 60px rgba(0,0,0,.5)}
.v3 .atest-q{font-weight:300;font-size:clamp(1.3rem,2.4vw,1.95rem);line-height:1.5;color:#eee;min-height:4.6em;transition:opacity .3s;margin:0}
.v3 .atest-who{margin-top:24px}
.v3 .atest-who b{font-family:var(--w);font-size:.8rem;letter-spacing:.16em;text-transform:uppercase;color:#fff;display:block}
.v3 .atest-who span{color:var(--acc);font-size:.82rem;letter-spacing:.06em}
.v3 .atest-nav{display:flex;gap:12px;margin-top:28px}
.v3 .atest-nav button{width:50px;height:50px;border-radius:50%;border:1px solid var(--line);background:rgba(255,255,255,.05);color:#fff;cursor:pointer;font-size:1.15rem;transition:.25s;display:flex;align-items:center;justify-content:center}
.v3 .atest-nav button:hover{background:var(--acc);color:#140900;border-color:transparent;transform:translateY(-2px)}
@media(max-width:800px){.v3 .atest{grid-template-columns:1fr;text-align:center;gap:34px}.v3 .atest-photos{max-width:260px;margin:0 auto}.v3 .atest-nav{justify-content:center}.v3 .atest-q{min-height:0}}
/* wizard */
.v3 .wiz{max-width:680px;margin:0 auto;background:rgba(255,255,255,.03);border:1px solid var(--line);border-radius:22px;padding:38px;position:relative;overflow:hidden}
.v3 .wiz .bar{height:2px;background:rgba(255,255,255,.1);border-radius:2px;margin-bottom:30px}
.v3 .wiz .bar i{display:block;height:100%;width:33%;background:var(--acc);transition:.5s}
.v3 .wstep{display:none}.v3 .wstep.on{display:block}
.v3 .wopts{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:18px 0 26px}
.v3 .wopt{display:flex;flex-direction:column;align-items:center;gap:9px;padding:18px 12px;text-align:center;font-size:.9rem;font-weight:600;cursor:pointer;border:1px solid rgba(255,255,255,.12);border-radius:16px;background:rgba(255,255,255,.045);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:transform .15s,border-color .2s,background .2s,box-shadow .2s}
.v3 .wopt .fico{width:24px;height:24px;color:var(--acc)}
.v3 .wopt:hover{border-color:rgba(255,127,26,.55);background:rgba(255,127,26,.08);box-shadow:0 8px 24px rgba(0,0,0,.35)}
.v3 .wopt:active{transform:scale(.95)}
.v3 .wopt.sel{border-color:var(--acc);background:rgba(255,127,26,.14);color:#fff;box-shadow:inset 0 0 0 1px rgba(255,127,26,.45)}
.v3 .wiz input{width:100%;background:#0b0c10;border:1px solid var(--line);border-radius:12px;padding:15px 16px;color:#fff;margin:8px 0;font-family:var(--d)}
@media(max-width:800px){.v3 .wopts{grid-template-columns:1fr 1fr}}

/* nav + footer links live outside .v3 — kill the legacy underline explicitly */
.v3nav a,.v3nav a:link,.v3nav a:visited{text-decoration:none}
footer.ft a,footer.ft a:link,footer.ft a:visited{text-decoration:none}
footer.ft a:hover{text-decoration:none}
.lg-btn,.lg-btn:link,.lg-btn:visited{text-decoration:none}

/* ==========================================================================
   INNER-PAGE components (Services/Projects/Blog/Team/Testimonials/Contact) — scoped .v3
   ========================================================================== */
.v3 .phero3{position:relative;z-index:2;min-height:64vh;display:flex;align-items:flex-end;overflow:hidden;padding:calc(70px + 2vh) 0 clamp(46px,6vw,88px)}
.v3 .phero3.short{min-height:52vh}
.v3 .phero3-bg{position:absolute;inset:0;z-index:0}
.v3 .phero3-bg img{width:100%;height:100%;object-fit:cover;transform:scale(1.06);will-change:transform}
.v3 .phero3-bg::after{content:"";position:absolute;inset:0;background:linear-gradient(0deg,var(--bg) 2%,rgba(5,5,6,.55) 34%,rgba(5,5,6,.25) 62%,rgba(5,5,6,.55) 100%),linear-gradient(96deg,rgba(5,5,6,.72),rgba(5,5,6,.12) 55%,transparent 78%)}
.v3 .phero3-in{position:relative;z-index:1;width:min(1180px,92vw);margin:0 auto}
.v3 .phero3-in h1{font-family:var(--w);font-weight:700;font-size:clamp(2.4rem,6.4vw,5.4rem);line-height:.98;letter-spacing:-.03em;text-transform:uppercase;max-width:16ch;margin:0}
/* audit teo (mobile): the 2.4rem floor made the h1 38.4px on a 360px phone, where «ΥΠΟΒΡΥΧΙΟ-ΜΟΥΣΕΙΟ» needs 402px
   and «ΣΗΜΑΤΟΤΗΛΕΓΡΑΦΟΣ» 408px against 331px of space. .sh-word is nowrap by design (never break mid-word), so the
   overflow was chopped by .phero3{overflow:hidden}. Lower floor + steeper vw so long Greek compounds fit, and drop
   the `ch` cap on phones — it is font-relative, so it shrinks with the text and can never resolve the overflow.
   fitHeadingToWidest() in v3.js is the safety net for any title longer than these. */
@media(max-width:700px){
  .v3 .phero3-in h1{font-size:clamp(1.55rem,8.2vw,2.4rem);max-width:none}
}
.v3 .phero3-in h1 .o{color:var(--acc)}
.v3 .phero3-in .lead{margin-top:22px}
.v3 .vscroll3{position:absolute;left:50%;bottom:22px;transform:translateX(-50%);z-index:2;display:flex;flex-direction:column;align-items:center;gap:8px;font-family:var(--w);font-size:.58rem;letter-spacing:.34em;color:var(--mut);text-transform:uppercase}
.v3 .vscroll3 i{position:relative;width:4px;height:46px;background:rgba(255,255,255,.12);overflow:hidden;border-radius:2px}
.v3 .vscroll3 i::after{content:"";position:absolute;top:0;left:0;width:100%;height:62%;border-radius:2px;background:linear-gradient(180deg,#ffc489,var(--acc) 42%,rgba(255,127,26,.15));box-shadow:0 0 12px 1.5px rgba(255,127,26,.9);animation:sdrop 1.7s cubic-bezier(.7,0,.3,1) infinite}
.v3 .sec3{position:relative;z-index:2;padding:clamp(56px,9vw,120px) 0}
.v3 .sec3.tight{padding-top:0}
.v3 .sec3>.wrap{width:min(1180px,92vw);margin:0 auto}
/* soft top+bottom fade so every section blends into the black layer at its edges (audit teo c6a4e4a0). Sits in the section padding — never over content. */
.v3 .sec3::before,.v3 .sec3::after{content:"";position:absolute;left:0;right:0;height:64px;z-index:3;pointer-events:none}
.v3 .sec3::before{top:0;background:linear-gradient(180deg,var(--bg),transparent)}
.v3 .sec3::after{bottom:0;background:linear-gradient(0deg,var(--bg),transparent)}
.v3 .sec3.tight::before{display:none}
/* Anchor landing target for the «back to all …» buttons (audit teo). The section sits directly under a
   260vh scrub hero, so /blog#All_Posts and /Projects#All_Projects drop the visitor past the animation
   instead of making them scroll it a second time. scroll-margin-top keeps the section edge clear of the
   fixed .v3nav rather than tucked underneath it. */
.v3 .backtarget{scroll-margin-top:92px}
/* board 8+11: every CTA now targets /Contact#quoteform. Without this the section top lands
   UNDER the fixed nav, which reads as "the link did nothing". Same 92px as .backtarget. */
.v3 #quoteform{scroll-margin-top:92px}
/* the post-submit landing target. flash() emits id="msg-flash" on the message itself; without the
   scroll-margin the fixed nav sits on top of it, and a confirmation you cannot read is no
   confirmation. A little more room than #quoteform so the message clears the header comfortably. */
.v3 #msg-flash{scroll-margin-top:120px}
/* board 7: the article <-> project cross-link. Deliberately quiet, it sits under the tour and is a
   navigation aid, not a CTA, so it must not compete with the orange buttons around it. */
.v3 .relcross{display:flex;align-items:center;gap:12px;margin:18px 0 4px;padding:14px 18px;border:1px solid var(--line);border-radius:14px;background:rgba(255,255,255,.02);text-decoration:none;transition:.25s}
.v3 .relcross:hover{border-color:var(--acc);background:rgba(255,255,255,.045);transform:translateX(3px)}
.v3 .relcross .rx-k{flex:none;font:700 .72rem/1 var(--w);letter-spacing:.08em;text-transform:uppercase;color:var(--acc)}
.v3 .relcross .rx-t{flex:1;color:#e7e8ea;font-size:.98rem;line-height:1.45}
.v3 .relcross .rx-go{flex:none;color:var(--acc);font-size:1.1rem}
@media(max-width:640px){.v3 .relcross{flex-wrap:wrap;gap:6px}.v3 .relcross .rx-t{flex:1 0 100%}}
/* ==== REUSABLE CAROUSEL (audit teo — requested in 5 card rows) — native scroll-snap track + arrows + dots + auto-advance ==== */
.v3 .car{position:relative}
/* audit george, on the track itself:
   `touch-action:pan-x pan-y`      -> the browser handles the gesture and AXIS-LOCKS it: a horizontal swipe pans the
                                    slider and the page stays put ("the page moves at the same time you try to slide
                                    to next"), a vertical swipe scrolls the page normally.
                                    ⚠️ This was `pan-x` alone, which locked the axis but ALSO meant a finger landing
                                    anywhere on the slider could never scroll the page — on a 360px phone the row is
                                    nearly full-width, so the page felt stuck. `pan-x pan-y` keeps George's fix and
                                    drops the trap; the real culprit for the simultaneous scroll was Lenis, now
                                    handled with data-lenis-prevent in initCarousel (see v3.js).
   `overscroll-behavior-x:contain` -> swiping past the first/last card no longer chains to the browser's
                                    back/forward gesture. */
.v3 .car-track{display:flex!important;grid-template-columns:none!important;gap:24px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding:4px 2px 8px;touch-action:pan-x pan-y;overscroll-behavior-x:contain}
.v3 .car-track::-webkit-scrollbar{display:none}
.v3 .car-track>*{flex:0 0 auto;scroll-snap-align:start;width:calc((100% - 48px)/3)}   /* 3 per view (desktop) */
@media(max-width:900px){.v3 .car-track>*{width:calc((100% - 24px)/2)}}                  /* 2 per view (tablet) */
@media(max-width:600px){.v3 .car-track>*{width:86%}}                                    /* ~1 per view + peek (mobile) */
.v3 .car-nav{position:absolute;top:calc(50% - 24px);transform:translateY(-50%);z-index:6;width:46px;height:46px;border-radius:50%;display:grid;place-items:center;cursor:pointer;background:rgba(8,9,12,.55);border:1px solid rgba(255,255,255,.16);color:#fff;font-size:1.6rem;line-height:1;padding-bottom:3px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:.25s}
.v3 .car-nav:hover{border-color:var(--acc);color:var(--acc);box-shadow:0 8px 30px rgba(255,127,26,.28)}
.v3 .car-nav.prev{left:-8px}
.v3 .car-nav.next{right:-8px}
.v3 .car-nav.off{opacity:0;pointer-events:none}
.v3 .car-dots{display:flex;justify-content:center;gap:9px;margin-top:20px}
.v3 .car-dot{width:8px;height:8px;border-radius:50%;border:0;padding:0;cursor:pointer;background:rgba(255,255,255,.24);transition:.3s}
.v3 .car-dot.on{background:var(--acc);width:26px;border-radius:5px}
.v3 .car.no-scroll .car-nav,.v3 .car.no-scroll .car-dots{display:none}
.v3 .car.drag .car-track{scroll-snap-type:none;cursor:grabbing;scroll-behavior:auto}
/* audit george, desktop drag: belt to the JS preventDefault. The cards are <a> wrapping <img>, so a
   mouse drag started the browser's native link/ghost-image drag instead of scrolling the track. */
.v3 .car-track{cursor:grab}
.v3 .car-track a,.v3 .car-track img{-webkit-user-drag:none;user-select:none;-webkit-user-select:none}
.v3 .car.drag .car-track a{pointer-events:none}   /* a drag must never land as a click on a card */
@media(max-width:600px){.v3 .car-nav{display:none}}   /* mobile: swipe + dots only, arrows would crowd */
/* ==== SERVICE DETAIL — friendlier, image-rich article layout (audit teo c6a4e4c6) ==== */
.v3 .svc-detail{display:grid;grid-template-columns:1fr 340px;gap:46px;align-items:start}
@media(max-width:900px){.v3 .svc-detail{grid-template-columns:1fr;gap:32px}}
.v3 .article{font-size:1.06rem;line-height:1.9;color:#cfd0d3}
.v3 .article>p:first-of-type::first-letter{font-family:var(--w);font-weight:700;font-size:3.1em;line-height:.78;float:left;margin:.06em .12em 0 0;color:var(--acc)}
.v3 .article p{margin:0 0 1.15em}
.v3 .article h2,.v3 .article h3{font-family:var(--w);font-weight:700;color:#fff;line-height:1.2;margin:1.5em 0 .5em;letter-spacing:-.01em}
.v3 .article h2{font-size:1.5rem}
.v3 .article h3{font-size:1.2rem}
.v3 .article a:not(.lg-btn){color:var(--acc)}   /* prose links orange, but NEVER override button text (.lg-btn.solid is dark-on-orange → orange text made it invisible) */
.v3 .article ul{margin:0 0 1.2em;padding:0;list-style:none}
.v3 .article ul li{position:relative;padding:0 0 .6em 26px}
.v3 .article ul li::before{content:"";position:absolute;left:3px;top:.6em;width:8px;height:8px;border-radius:50%;background:var(--acc);box-shadow:0 0 12px rgba(255,127,26,.6)}
.v3 .svc-side{position:sticky;top:96px}
@media(max-width:900px){.v3 .svc-side{position:static}}
.v3 .svc-card{background:var(--card);border:1px solid var(--line);border-radius:22px;overflow:hidden}
.v3 .svc-card>img{width:100%;height:180px;object-fit:cover;display:block}
.v3 .svc-card-in{padding:24px}
.v3 .svc-card-in h3{font-family:var(--w);font-weight:700;font-size:1.12rem;margin:0 0 16px}
.v3 .svc-feats{list-style:none;margin:0 0 22px;padding:0;display:grid;gap:12px}
.v3 .svc-feats li{display:flex;align-items:center;gap:11px;color:#d7d8db;font-size:.94rem}
.v3 .svc-feats li .fico{width:19px;height:19px;color:var(--acc);flex:0 0 auto}
.v3 .svc-card .lg-btn{width:100%}
/* card3 extras */
.v3 .card3 .c-tag{font-family:var(--w);font-size:.62rem;letter-spacing:.2em;text-transform:uppercase;color:var(--acc)}
.v3 .card3 h3{font-weight:800;font-size:1.12rem;line-height:1.3;margin:10px 0 12px}
.v3 .card3 .c-rm{color:var(--mut);font-size:.86rem;font-weight:600;transition:color .25s}
.v3 .card3:hover .c-rm{color:#fff}
.v3 .card3.flag{grid-column:1/-1;display:grid;grid-template-columns:1.15fr 1fr}
.v3 .card3.flag .c-img{height:100%;min-height:330px;display:flex;align-items:center;justify-content:center;padding:26px;background:radial-gradient(ellipse at 50% 60%,rgba(255,127,26,.15),transparent 66%),#101218}
.v3 .card3.flag .c-img img{width:auto;height:auto;max-height:100%;object-fit:contain;filter:drop-shadow(0 24px 44px rgba(0,0,0,.6));transform:none}
.v3 .card3.flag .c-body{padding:clamp(28px,4vw,46px);display:flex;flex-direction:column;justify-content:center}
.v3 .card3.flag h3{font-size:1.6rem}
.v3 .card3.flag p{color:var(--mut);font-weight:300;line-height:1.65;margin-bottom:14px}
.v3 .card3.flag .c-press{font-size:.82rem;color:#b9722a;border-top:1px solid var(--line);padding-top:14px;margin-top:6px}
@media(max-width:860px){.v3 .card3.flag{grid-template-columns:1fr}.v3 .card3.flag .c-img{min-height:240px}}
/* filter chips */
.v3 .filters3{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:36px}
.v3 .fchip{display:inline-flex;align-items:center;gap:8px;cursor:pointer;user-select:none;font-size:.85rem;font-weight:600;padding:9px 16px;border-radius:100px;border:1px solid rgba(255,255,255,.12);color:var(--ink);background:rgba(255,255,255,.045);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:transform .15s,border-color .2s,background .2s,box-shadow .2s}
.v3 .fchip .fico{width:16px;height:16px;color:var(--acc)}
.v3 .fchip:hover{border-color:rgba(255,127,26,.5);background:rgba(255,127,26,.08);box-shadow:0 6px 18px rgba(0,0,0,.3)}
.v3 .fchip:active{transform:scale(.95)}
.v3 .fchip.on{border-color:var(--acc);color:#fff;background:rgba(255,127,26,.14);box-shadow:inset 0 0 0 1px rgba(255,127,26,.45)}
/* credential chips */
.v3 .chip{display:inline-flex;align-items:center;gap:8px;font-size:.85rem;font-weight:600;padding:9px 15px;border-radius:100px;border:1px solid var(--line);color:var(--ink);background:rgba(255,255,255,.03)}
.v3 .chip b{color:var(--acc)}
/* audit teo: "same rollover on these buttons (Facebook, YouTube, TikTok) from «Δες το προφίλ μας» on the
   left". Those three were the only <a class="chip"> on the site and had NO hover state whatever, sitting
   next to a .lg-btn with the full treatment. Same three layers, scaled to the smaller pill: cursor-tracked
   orange glow (--mx/--my, set by the same JS handler), diagonal sheen sweep, orange border + shadow.
   🚨 Scoped to `a.chip` DELIBERATELY — every other .chip is a static <span> badge (Google Trusted,
   Local Guide L8, 2.909 φωτογραφίες …) on /Contact and /Our_team, and must not look clickable.
   The glow fades in on hover rather than sitting at rest as .lg-btn's does: three permanently glowing
   pills in a row read as noise, and "rollover" is what was asked for. */
.v3 a.chip{position:relative;overflow:hidden;transition:.35s;cursor:pointer}
.v3 a.chip::before{content:"";position:absolute;width:90px;height:90px;border-radius:50%;
  background:radial-gradient(circle,rgba(255,127,26,.5),transparent 65%);
  left:var(--mx,50%);top:var(--my,50%);transform:translate(-50%,-50%);filter:blur(12px);
  opacity:0;transition:opacity .3s;pointer-events:none}
.v3 a.chip::after{content:"";position:absolute;inset:0;border-radius:inherit;
  background:linear-gradient(115deg,transparent 30%,rgba(255,255,255,.25) 46%,transparent 60%);
  transform:translateX(-120%);transition:transform .7s}
.v3 a.chip:hover{border-color:rgba(255,127,26,.6);box-shadow:0 8px 30px rgba(255,127,26,.22)}
.v3 a.chip:hover::before{opacity:.65}
.v3 a.chip:hover::after{transform:translateX(120%)}
/* stats */
.v3 .stat3{text-align:center;padding:34px 24px;background:var(--card);border:1px solid var(--line);border-radius:20px}
.v3 .stat3 b{font-family:var(--w);font-weight:700;font-size:2.4rem;color:var(--acc);display:block;line-height:1.1}
.v3 .stat3 span{color:var(--mut);font-size:.9rem;font-weight:300}
/* bio */
.v3 .bio3{display:grid;grid-template-columns:360px 1fr;gap:56px;align-items:center}
.v3 .bio3-photo{border-radius:22px;overflow:hidden;border:1px solid var(--line)}
.v3 .bio3-photo img{width:100%;height:100%;object-fit:cover}
.v3 .bio3 .creds{display:flex;flex-wrap:wrap;gap:11px;margin:24px 0 28px}
@media(max-width:860px){.v3 .bio3{grid-template-columns:1fr;gap:34px}.v3 .bio3-photo{max-width:320px}}
/* quote cards */
.v3 .qcard{background:var(--card);border:1px solid var(--line);border-radius:20px;padding:30px;transition:border-color .3s,transform .3s}
.v3 .qcard:hover{border-color:rgba(255,127,26,.35);transform:translateY(-4px)}
.v3 .qcard .stars{color:var(--acc);letter-spacing:3px;margin-bottom:14px}
.v3 .qcard p{color:#d7d8db;font-weight:300;font-size:1rem;line-height:1.6}
.v3 .qcard .who{display:flex;align-items:center;gap:12px;margin-top:22px}
.v3 .qcard .who img{width:46px;height:46px;border-radius:50%;object-fit:cover}
.v3 .qcard .who b{font-family:var(--w);font-size:.7rem;letter-spacing:.12em;text-transform:uppercase}
.v3 .qcard .who span{display:block;color:var(--acc);font-size:.78rem}
/* contact */
.v3 .cgrid{display:grid;grid-template-columns:1fr 1.05fr;gap:56px;align-items:start}
@media(max-width:900px){.v3 .cgrid{grid-template-columns:1fr;gap:40px}}
.v3 .cform{background:var(--card);border:1px solid var(--line);border-radius:22px;padding:clamp(26px,3vw,38px)}
.v3 .cform label{font-family:var(--w);font-size:.62rem;letter-spacing:.16em;text-transform:uppercase;color:var(--mut);display:block;margin:18px 0 8px}
.v3 .cform input,.v3 .cform select,.v3 .cform textarea{width:100%;background:#0b0c10;border:1px solid var(--line);border-radius:12px;padding:14px 16px;color:var(--ink);font-family:var(--d);font-size:.95rem;transition:.25s}
.v3 .cform input:focus,.v3 .cform select:focus,.v3 .cform textarea:focus{outline:none;border-color:var(--acc);box-shadow:0 0 0 3px rgba(255,127,26,.12)}
.v3 .cform textarea{min-height:120px;resize:vertical}
/* select — drop the native OS chevron/list look, match the dark form UI with a custom orange chevron (audit teo c6a4e421) */
.v3 .cform select{appearance:none;-webkit-appearance:none;-moz-appearance:none;cursor:pointer;padding-right:44px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23ff7f1a' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 16px center;background-size:14px}
.v3 .cform select:hover{border-color:rgba(255,127,26,.5)}
.v3 .cform select option{background:#0b0c10;color:var(--ink)}
.v3 .steps{display:flex;flex-direction:column;gap:20px;margin-top:28px}
.v3 .step{display:flex;gap:16px;align-items:flex-start}
.v3 .step b{flex:0 0 40px;height:40px;border-radius:50%;background:rgba(255,127,26,.12);color:var(--acc);display:flex;align-items:center;justify-content:center;font-family:var(--w);font-size:.9rem}
.v3 .step p{color:var(--mut);font-weight:300;font-size:.95rem;line-height:1.55}
.v3 .step p strong{color:var(--ink);display:block;font-weight:600;font-size:1rem;margin-bottom:2px}
/* cta band */
.v3 .cta3{position:relative;overflow:hidden;border-radius:26px;border:1px solid var(--line);padding:clamp(40px,6vw,74px);text-align:center}
.v3 .cta3-bg{position:absolute;inset:0;z-index:0}
.v3 .cta3-bg img{width:100%;height:100%;object-fit:cover;opacity:.32}
.v3 .cta3-bg::after{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at 50% 40%,rgba(5,5,6,.4),var(--bg))}
.v3 .cta3-in{position:relative;z-index:1}
.v3 .cta3-in h2{font-family:var(--w);font-weight:700;font-size:clamp(1.6rem,3.6vw,2.7rem);line-height:1.08;text-transform:uppercase;letter-spacing:-.02em;max-width:20ch;margin:0 auto 14px}
.v3 .cta3-in p{color:var(--mut);font-weight:300;max-width:52ch;margin:0 auto 26px;line-height:1.6}
/* LIVE bottom-CTA — glowing/blinking orange edges on the sides of the image + a provocative pulsing button, to "wake the user up" on the always-at-the-bottom CTA sections (audit teo c6a4d38b + George "make the button more provocative"). */
.v3 .cta3.cta-live{animation:ctaEdge 2.6s ease-in-out infinite}
@keyframes ctaEdge{
  0%,100%{border-color:rgba(255,127,26,.40);box-shadow:0 0 34px -10px rgba(255,127,26,.30),inset 26px 0 50px -46px rgba(255,127,26,.6),inset -26px 0 50px -46px rgba(255,127,26,.6)}
  50%{border-color:rgba(255,127,26,.95);box-shadow:0 0 72px -6px rgba(255,127,26,.55),inset 46px 0 60px -42px rgba(255,127,26,.95),inset -46px 0 60px -42px rgba(255,127,26,.95)}}
.v3 .lg-btn.boom{font-size:1.05rem;font-weight:800;padding:20px 42px;text-transform:uppercase;letter-spacing:.015em;animation:ctaPulse 1.9s ease-in-out infinite}
.v3 .lg-btn.boom::after{transition:none;animation:btnSheen 3.4s ease-in-out infinite}   /* periodic shimmer sweep so the button keeps catching the eye */
@keyframes btnSheen{0%,74%{transform:translateX(-130%)}88%{transform:translateX(130%)}100%{transform:translateX(130%)}}
@media(prefers-reduced-motion:reduce){.v3 .cta3.cta-live{animation:none;border-color:rgba(255,127,26,.55)}.v3 .lg-btn.boom{animation:none}.v3 .lg-btn.boom::after{animation:none}}

/* blog post prose */
.v3 .blogprose{font-size:1.05rem;line-height:1.85;color:#cfd0d3;font-weight:300}
.v3 .blogprose h2,.v3 .blogprose h3{font-family:var(--w);font-weight:700;color:var(--ink);text-transform:none;letter-spacing:-.01em;margin:0 0 14px;font-size:1.5rem}
.v3 .blogprose p{margin:0 0 16px}
/* inline keyword link — NO underline (never). Orange keyword that pops a small tooltip on hover.
   Kills the legacy peach box (style.min.css .text-blog-link{background:#faebd7}). */
.v3 .blogprose a,.v3 .text-blog-link,
.v3 .text-blog-link:link,.v3 .text-blog-link:visited,.v3 .text-blog-link:active{
  display:inline-block;padding:0;background:none;color:var(--acc);text-decoration:none;font-weight:800;
  position:relative;cursor:pointer;white-space:nowrap;-webkit-tap-highlight-color:transparent;
  transition:color .2s ease,text-shadow .2s ease}
.v3 .blogprose a:hover,.v3 .text-blog-link:hover{color:#ffb35c;text-shadow:0 0 16px rgba(255,127,26,.45)}
/* hover pop-up (the .lpop span is injected by v3.js) */
.v3 .text-blog-link .lpop{
  position:absolute;left:50%;bottom:calc(100% + 12px);transform:translate(-50%,8px) scale(.85);transform-origin:50% 130%;
  display:inline-flex;align-items:center;gap:.5em;white-space:nowrap;padding:.5em .85em;border-radius:12px;
  background:#0b0b0d;color:#fff;font-family:var(--d);font-weight:700;font-size:.8em;letter-spacing:.01em;line-height:1;
  box-shadow:0 14px 34px rgba(0,0,0,.55),0 0 0 1px rgba(255,127,26,.32),inset 0 0 0 1px rgba(255,255,255,.04);
  opacity:0;pointer-events:none;z-index:30;transition:opacity .26s ease,transform .3s cubic-bezier(.2,1.3,.3,1)}
.v3 .text-blog-link .lpop::before{content:"";width:.5em;height:.5em;border-radius:50%;background:var(--acc);box-shadow:0 0 9px rgba(255,127,26,.85)}
.v3 .text-blog-link .lpop::after{content:"";position:absolute;left:50%;top:100%;transform:translateX(-50%);border:6px solid transparent;border-top-color:#0b0b0d}
.v3 .text-blog-link:hover .lpop,.v3 .text-blog-link:focus-visible .lpop{opacity:1;transform:translate(-50%,0) scale(1)}
.v3 .blog-desc-title{display:block;font-family:var(--w);font-weight:700;color:var(--ink);font-size:1.15rem;margin:18px 0 10px}
.v3 .blogtags{margin-top:40px;color:var(--mut);font-size:.9rem}
.v3 .blogtags a{color:var(--acc);text-decoration:none;margin-right:8px}

/* ===== RESTORED aesthetic layer (dropped during the DB port) ===== */
/* scroll progress bar */
#scrollbar{position:fixed;top:0;left:0;height:3px;width:0;z-index:97;background:linear-gradient(90deg,#ffc489,var(--acc));box-shadow:0 0 12px rgba(255,127,26,.7);transition:width .1s linear}
/* ambient drifting-words void background — always behind content, subtle life in dark areas */
#voidbg{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;background:#000}
/* typography only — one word at a time, no logo, no rotation, opacity driven smoothly from JS (WAAPI) */
#voidbg .vb-w{position:absolute;left:var(--x);top:var(--y);transform:translate(-50%,-50%);font-family:var(--w);font-weight:700;font-size:var(--s,6vw);white-space:nowrap;text-transform:uppercase;letter-spacing:.05em;color:transparent;-webkit-text-stroke:1px rgba(230,230,230,.12);opacity:0;will-change:opacity}   /* brightness ×2 */
#voidbg .vb-w.o{-webkit-text-stroke-color:rgba(255,127,26,.30)}
#voidbg .vb-w.g{-webkit-text-stroke-color:rgba(255,255,255,.10)}
#voidbg::after{content:"";position:absolute;inset:-20%;pointer-events:none;background:radial-gradient(38% 38% at 22% 28%,rgba(255,127,26,.055),transparent 70%),radial-gradient(34% 34% at 80% 72%,rgba(255,127,26,.045),transparent 70%);animation:auroraDrift 28s ease-in-out infinite alternate}
@keyframes auroraDrift{0%{transform:translate3d(-3%,-2%,0) scale(1)}100%{transform:translate3d(3%,2%,0) scale(1.12)}}
@media(prefers-reduced-motion:reduce){#voidbg{display:none}}
/* keep real sections above the void bg */
.v3 .sec3,.v3 .phero3,.v3 .vhero,.v3 footer,.v3 nav{position:relative;z-index:2}

/* ===== Services «Πού κάνει τη διαφορά» verticals band (restored, DB-additive) ===== */
.v3 .band{background:#0b0c10;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.v3 .vgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
@media(max-width:820px){.v3 .vgrid{grid-template-columns:1fr 1fr}}
@media(max-width:520px){.v3 .vgrid{grid-template-columns:1fr}}
.v3 .vcard{position:relative;border-radius:18px;overflow:hidden;border:1px solid var(--line);aspect-ratio:3/2;display:block}
.v3 .vcard img{width:100%;height:100%;object-fit:cover;transition:transform .6s}
.v3 .vcard:hover img{transform:scale(1.07)}
.v3 .vcard::after{content:"";position:absolute;inset:0;background:linear-gradient(0deg,rgba(5,5,6,.86),rgba(5,5,6,.08) 55%,transparent);transition:background .3s}
.v3 .vcard:hover::after{background:linear-gradient(0deg,rgba(5,5,6,.82),rgba(255,127,26,.12) 60%,transparent)}
.v3 .vcard .vc-t{position:absolute;left:18px;bottom:15px;z-index:1;font-family:var(--w);font-weight:700;font-size:1.02rem;text-transform:uppercase;letter-spacing:.02em;color:#fff}
.v3 .vcard .vc-t i{display:block;font-style:normal;font-family:var(--d);font-weight:300;font-size:.78rem;letter-spacing:0;text-transform:none;color:var(--acc);margin-top:2px}

/* ===== Testimonials animated stat row (restored) ===== */
.v3 .tstats{display:flex;flex-wrap:wrap;justify-content:center;gap:clamp(28px,6vw,84px);margin-bottom:54px;text-align:center}
.v3 .tstats .ts b{font-family:var(--w);font-weight:700;font-size:clamp(2rem,4.6vw,3.3rem);color:var(--acc);display:block;line-height:1;letter-spacing:-.02em}
.v3 .tstats .ts span{color:var(--mut);font-size:.9rem;font-weight:300;margin-top:8px;display:block;max-width:20ch}

/* ===== Footer runner / treadmill (restored — was dropped in the port) ===== */
footer.ft .ft-tread{position:relative;z-index:2;width:100%;margin-top:clamp(30px,4vw,54px);height:clamp(50px,7vw,92px);overflow:hidden;display:flex;align-items:center;-webkit-mask:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);mask:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent)}
footer.ft .ft-tread-row{display:flex;gap:clamp(32px,5vw,68px);width:max-content;align-items:center;animation:tread 36s linear infinite}
footer.ft .ft-tread-row b{font-family:var(--w);font-weight:700;font-size:clamp(1rem,2.1vw,1.6rem);color:rgba(255,255,255,.13);white-space:nowrap;text-transform:uppercase;letter-spacing:.03em}
@keyframes tread{to{transform:translateX(-50%)}}

/* ============================ AUDIT ROUND-3 COMPONENTS ============================ */
/* 360 tour shield — glass "enter" button so scrolling over the embed doesn't hijack the page (teo #4/#10) */
/* 16/9 suits a wide screen. On a portrait phone it collapsed the tour to 331x186 (23% of the screen vs
   83% on desktop) and 3DVista's own controls became unreachable — audit teo. Below 700px give it real
   height instead, so the embedded UI has room to lay out. svh, not vh, so the mobile browser chrome
   does not push the bottom of the tour off-screen. */
.v3 .tour360{position:relative;aspect-ratio:16/9}
@media(max-width:700px){
  .v3 .tour360{aspect-ratio:auto;height:min(78svh,600px)}
}
.v3 .tour360 .t360-shield{position:absolute;inset:0;z-index:3;display:flex;align-items:center;justify-content:center;cursor:pointer;background:rgba(5,6,10,.42);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);transition:opacity .4s ease}
.v3 .tour360.active .t360-shield{opacity:0;pointer-events:none}
.v3 .tour360 .t360-play{display:flex;align-items:center;gap:14px;padding:14px 26px 14px 16px;border-radius:100px;background:rgba(20,22,28,.55);border:1px solid rgba(255,255,255,.25);-webkit-backdrop-filter:blur(12px) saturate(1.2);backdrop-filter:blur(12px) saturate(1.2);box-shadow:0 10px 40px rgba(0,0,0,.5);color:#fff;font-family:var(--w);font-weight:700;transition:.3s;animation:t360pulse 2.4s ease-in-out infinite}
.v3 .tour360 .t360-shield:hover .t360-play{border-color:var(--acc);transform:scale(1.04)}
.v3 .tour360 .t360-ic{display:grid;place-items:center;width:42px;height:42px;border-radius:50%;background:var(--acc);color:#160a00;font-size:.9rem}
.v3 .tour360 .t360-tx{font-size:.95rem}
@keyframes t360pulse{0%,100%{box-shadow:0 10px 40px rgba(0,0,0,.5),0 0 0 0 rgba(255,127,26,.4)}50%{box-shadow:0 10px 40px rgba(0,0,0,.5),0 0 0 15px rgba(255,127,26,0)}}
.v3 .tour360 .t360-relock{position:absolute;top:12px;right:12px;z-index:4;display:none;align-items:center;gap:6px;background:rgba(12,13,17,.82);border:1px solid rgba(255,255,255,.2);color:#cfd0d3;border-radius:100px;padding:8px 14px;font:600 12px system-ui;cursor:pointer;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.v3 .tour360.active .t360-relock{display:inline-flex}
.v3 .tour360 .t360-relock:hover{border-color:var(--acc);color:#fff}
@media(prefers-reduced-motion:reduce){.v3 .tour360 .t360-play{animation:none}}

/* Blog Text Reveal — words dim until scrolled through (teo #8) */
.v3 .blogprose .tr-w{opacity:.22;transition:opacity .12s linear;will-change:opacity}

/* ===== LAMP (teo #6) — Aceternity lamp in orange on the void bg (rgb(5,5,6)).
   NO clip: the fx box is far larger than the light and every layer is a soft radial
   that fades to full transparent (zero) deep inside the box, so the perimeter melts
   into black — no rim, no straight edge, no cut-off. Only the tube line stays crisp. ===== */
.v3 .lamp{position:relative;isolation:isolate;text-align:center;padding-top:clamp(115px,14vw,185px)}
.v3 .lamp .lamp-fx{position:absolute;top:0;left:50%;transform:translateX(-50%);width:min(1400px,120vw);height:clamp(440px,52vw,720px);z-index:-1;pointer-events:none}
/* the two angled beam sides — heavily blurred + faded early (radial mask from the apex) so the sides melt, never a rim */
.v3 .lamp .lamp-fx .lc{position:absolute;top:52px;height:19rem;width:0;opacity:0;filter:blur(34px);transition:width 1.2s cubic-bezier(.3,0,.2,1) .1s,opacity 1s .1s}
.v3 .lamp .lamp-fx .lc-l{right:50%;background:conic-gradient(from 78deg at center top,rgba(255,146,44,.7),transparent 26%);
  -webkit-mask-image:radial-gradient(120% 120% at 100% 0,#000 6%,transparent 52%);mask-image:radial-gradient(120% 120% at 100% 0,#000 6%,transparent 52%)}
.v3 .lamp .lamp-fx .lc-r{left:50%;background:conic-gradient(from 282deg at center top,transparent 74%,rgba(255,146,44,.7));
  -webkit-mask-image:radial-gradient(120% 120% at 0 0,#000 6%,transparent 52%);mask-image:radial-gradient(120% 120% at 0 0,#000 6%,transparent 52%)}
/* the downward bloom — big, very soft, fades to zero far inside the box + brighter core just beneath the line */
.v3 .lamp .lamp-fx .lamp-glow{position:absolute;top:52px;left:50%;transform:translateX(-50%);width:min(52rem,110vw);height:26rem;opacity:0;transition:opacity 1.1s .12s;
  background:radial-gradient(ellipse 56% 62% at 50% 0,rgba(255,150,52,.62),rgba(255,120,30,.16) 36%,transparent 62%);filter:blur(44px)}
.v3 .lamp .lamp-fx .lamp-core{position:absolute;top:52px;left:50%;transform:translateX(-50%);width:0;height:15rem;transition:width 1.1s .12s;
  background:radial-gradient(ellipse 66% 90% at 50% 0,rgba(255,208,148,.9),transparent 52%);filter:blur(32px)}
/* the crisp bright line/tube */
.v3 .lamp .lamp-fx .lamp-line{position:absolute;top:52px;left:50%;transform:translateX(-50%);height:3px;width:0;border-radius:3px;transition:width 1.2s cubic-bezier(.3,0,.2,1) .05s;
  background:linear-gradient(90deg,transparent,#ffd9a8 12%,#fff 48%,#fff 52%,#ffd9a8 88%,transparent);box-shadow:0 0 48px 7px rgba(255,150,60,.85),0 0 10px 1px #fff}
.v3 .lamp.lit .lamp-fx .lc{width:min(38rem,96vw);opacity:.6}
.v3 .lamp.lit .lamp-fx .lamp-glow{opacity:1}
.v3 .lamp.lit .lamp-fx .lamp-core{width:min(20rem,60vw)}
.v3 .lamp.lit .lamp-fx .lamp-line{width:min(32rem,86vw)}
.v3 .lamp>h2{opacity:.5;transform:translateY(48px);transition:opacity .8s ease .3s,transform .8s ease .3s}
.v3 .lamp.lit>h2{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){.v3 .lamp>h2{opacity:1;transform:none}.v3 .lamp.lit .lamp-fx *{transition:none}}

/* ===== CAROUSEL (audit teo T3) — faithful vanilla port of the pasted React "Carousel" spec; REPLACES the Focus Rail.
   Values map 1:1 to the prompt's Tailwind: 70vmin square slides, mx 4vmin (track -4vmin), track
   translateX(-current*100/N %) over 1s ease-in-out, non-current scale(.98) rotateX(8deg) origin bottom under
   perspective 1200px, active image opacity 1 / others .5, pointer parallax translate3d(var(--x)/30,var(--y)/30,0),
   title+button cross-fade 1s, round prev/next controls at top:calc(100% + 1rem). ===== */
.v3 .c3d-viewport{position:relative;overflow:hidden;width:100%;padding:5rem 0}
.v3 .c3d{position:relative;width:70vmin;height:70vmin;margin:0 auto}
.v3 .c3d-track{position:absolute;display:flex;margin:0 -4vmin;padding:0;list-style:none;transition:transform 1s ease-in-out;will-change:transform}
.v3 .c3d-persp{perspective:1200px;transform-style:preserve-3d}
.v3 .c3d-slide{display:flex;flex:1 1 0%;flex-direction:column;align-items:center;justify-content:center;position:relative;text-align:center;color:#fff;
  width:70vmin;height:70vmin;margin:0 4vmin;z-index:10;cursor:pointer;list-style:none;
  transform:scale(.98) rotateX(8deg);transform-origin:bottom;transition:transform .5s cubic-bezier(.4,0,.2,1)}
.v3 .c3d-slide.is-current{transform:scale(1) rotateX(0deg);cursor:default}
.v3 .c3d-imgwrap{position:absolute;top:0;left:0;width:100%;height:100%;background:#1D1F2F;border-radius:1%;overflow:hidden;transition:transform .15s ease-out}
.v3 .c3d-slide.is-current .c3d-imgwrap{transform:translate3d(calc(var(--x,0px)/30),calc(var(--y,0px)/30),0)}
.v3 .c3d-imgwrap img{position:absolute;inset:0;width:120%;height:120%;object-fit:cover;opacity:.5;transition:opacity .6s ease-in-out}
.v3 .c3d-slide.is-current .c3d-imgwrap img{opacity:1}
.v3 .c3d-shade{position:absolute;inset:0;background:rgba(0,0,0,.3);opacity:0;transition:opacity 1s}
.v3 .c3d-slide.is-current .c3d-shade{opacity:1}
.v3 .c3d-article{position:relative;padding:4vmin;opacity:0;visibility:hidden;transition:opacity 1s ease-in-out}
.v3 .c3d-slide.is-current .c3d-article{opacity:1;visibility:visible}
.v3 .c3d-article h2{font-size:1.125rem;font-weight:600;position:relative;margin:0;color:#fff;line-height:1.2}
@media(min-width:768px){.v3 .c3d-article h2{font-size:1.5rem}}
@media(min-width:1024px){.v3 .c3d-article h2{font-size:2.25rem}}
.v3 .c3d-btnrow{display:flex;justify-content:center}
.v3 .c3d-btn{margin:1.5rem auto 0;padding:.5rem 1rem;width:fit-content;color:#000;background:#fff;height:3rem;border:1px solid transparent;font-size:.75rem;
  display:flex;justify-content:center;align-items:center;border-radius:1rem;text-decoration:none;transition:box-shadow .2s;
  box-shadow:0px 2px 3px -1px rgba(0,0,0,.1),0px 1px 0px 0px rgba(25,28,33,.02),0px 0px 0px 1px rgba(25,28,33,.08)}
@media(min-width:640px){.v3 .c3d-btn{font-size:.875rem}}
.v3 .c3d-btn:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1)}
.v3 .c3d-ctrls{position:absolute;display:flex;justify-content:center;width:100%;top:calc(100% + 1rem)}
.v3 .c3d-nav{width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;margin:0 .5rem;background:#262626;color:#e5e5e5;
  border:3px solid transparent;border-radius:9999px;cursor:pointer;padding:0;transition:transform .2s,border-color .2s}
.v3 .c3d-nav:hover{transform:translateY(-2px)}
.v3 .c3d-nav:active{transform:translateY(2px)}
.v3 .c3d-nav:focus-visible{border-color:#6D64F7;outline:none}
.v3 .c3d-nav.prev{transform:rotate(180deg)}
.v3 .c3d-nav.prev:hover{transform:rotate(180deg) translateY(-2px)}
.v3 .c3d-nav.prev:active{transform:rotate(180deg) translateY(2px)}
.v3 .c3d-nav svg{width:24px;height:24px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
@media(prefers-reduced-motion:reduce){.v3 .c3d-track,.v3 .c3d-slide,.v3 .c3d-imgwrap,.v3 .c3d-article,.v3 .c3d-imgwrap img{transition:none}}

/* ===== ANIMATED CARDS STACK (teo #3) — sticky scroll-driven deck ===== */
.v3 .cstack{position:relative;height:300vh}
.v3 .cstack-sticky{position:sticky;top:0;height:100svh;display:flex;align-items:center;justify-content:center}
.v3 .cstack-box{position:relative;width:min(380px,90vw);height:min(460px,72vh)}
.v3 .cstack-card{position:absolute;left:0;top:0;width:100%;height:100%;will-change:transform,opacity;transform-origin:center;overflow:auto}
/* reduced motion (or no-JS): show every review as a simple readable column, never a hidden stack */
@media(prefers-reduced-motion:reduce){
  .v3 .cstack{height:auto}
  .v3 .cstack-sticky{position:static;height:auto;display:block}
  .v3 .cstack-box{width:100%;height:auto;display:flex;flex-direction:column;gap:16px}
  .v3 .cstack-card{position:static;height:auto}
}

/* ===== SCROLL TILTED GRID (teo #11) — 2-col editorial tilt ===== */
.v3 .tiltgrid{display:grid!important;grid-template-columns:1fr 1fr;gap:clamp(20px,3.5vw,48px)!important;width:min(760px,92vw);margin:0 auto;padding:14vh 0;perspective:1000px}
.v3 .tiltgrid>*{will-change:transform,filter;transform-style:preserve-3d}
.v3 .tiltgrid .c-img{overflow:hidden}
.v3 .tiltgrid .c-img img{will-change:transform}

/* ===== COOKIE CONSENT BAR (audit teo T6) — GDPR/ePrivacy. Shown until a choice is made; reopenable from the footer. ===== */
.ccbar{position:fixed;left:0;right:0;bottom:0;z-index:120;padding:0 clamp(12px,2vw,24px) clamp(12px,2vw,24px);pointer-events:none;
  transform:translateY(115%);transition:transform .45s cubic-bezier(.22,1,.36,1)}
.ccbar.in{transform:none}
/* LIQUID GLASS (audit george: "apply liquid glass effect to the consent window").
   The old panel was 96% opaque, so its blur did nothing: nothing showed through to be blurred.
   Now it is genuinely translucent and the blur carries the weight, with saturation to keep the page
   colour alive through it, a specular highlight along the top lip, and an inner rim light.
   ⚠️ backdrop-filter is fine HERE: one small fixed panel, painted once. The rule against it applies
   to the stacked gallery cards, which overlap by design so each blur re-samples the ones beneath. */
.ccbar-in{pointer-events:auto;max-width:1100px;margin:0 auto;position:relative;isolation:isolate;
  background:linear-gradient(150deg,rgba(38,41,50,.62) 0%,rgba(18,20,25,.55) 46%,rgba(30,26,20,.60) 100%);
  -webkit-backdrop-filter:blur(26px) saturate(190%);backdrop-filter:blur(26px) saturate(190%);
  border:1px solid rgba(255,255,255,.16);border-radius:22px;padding:clamp(16px,2vw,22px) clamp(18px,2.4vw,26px);
  display:flex;align-items:center;gap:clamp(14px,2vw,28px);flex-wrap:wrap;
  box-shadow:0 24px 60px -20px rgba(0,0,0,.85),
             inset 0 1px 0 rgba(255,255,255,.22),
             inset 0 -1px 0 rgba(255,255,255,.05)}
/* the specular lip: a bright, short highlight that fades out across the top edge */
.ccbar-in::before{content:"";position:absolute;inset:0 0 auto 0;height:52%;pointer-events:none;z-index:-1;
  border-radius:22px 22px 0 0;
  background:linear-gradient(180deg,rgba(255,255,255,.10) 0%,rgba(255,255,255,.03) 55%,transparent 100%)}
/* a whisper of the brand warmth through the glass, so it belongs to this site and not to a template */
.ccbar-in::after{content:"";position:absolute;inset:0;pointer-events:none;z-index:-1;border-radius:22px;
  background:radial-gradient(120% 180% at 88% 0%,rgba(255,127,26,.13),transparent 58%)}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){
  /* no backdrop-filter: fall back to an opaque panel rather than unreadable text over the page */
  .ccbar-in{background:rgba(18,20,25,.96)}
}
.ccbar-tx{flex:1 1 420px;margin:0;color:#c9cace;font-size:.9rem;line-height:1.55;font-weight:300}
.ccbar-tx b{color:#f4f3f1;font-weight:600}
.ccbar-tx a{color:var(--acc)}
.ccbar-btns{display:flex;gap:10px;flex:0 0 auto}
.ccbtn{font-family:var(--d);font-size:.86rem;font-weight:600;padding:12px 22px;border-radius:100px;cursor:pointer;transition:.25s;
  border:1px solid rgba(255,255,255,.2);background:transparent;color:#e7e7ea}
.ccbtn.ghost:hover{border-color:rgba(255,255,255,.45);color:#fff}
.ccbtn.solid{background:var(--acc);border-color:transparent;color:#140900}
.ccbtn.solid:hover{filter:brightness(1.07)}
.ccbtn:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
footer.ft .fmeta-cc{background:none;border:0;padding:0;font:inherit;color:var(--mut);cursor:pointer;transition:color .25s}
footer.ft .fmeta-cc:hover{color:#fff}
footer.ft .fmeta-cc:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
@media(max-width:640px){.ccbar-in{flex-direction:column;align-items:stretch}.ccbar-btns{justify-content:stretch}.ccbtn{flex:1}}
@media(prefers-reduced-motion:reduce){.ccbar{transition:none}}

/* ===== SERVICES IN FULL (SEO parity with the live/ranking page) — real headings + copy under the carousel ===== */
.v3 .svc-full-list{display:flex;flex-direction:column;gap:clamp(30px,4vw,52px)}
/* Media column is narrower than the copy so the text stays readable; it was 7fr/5fr the other way round,
   which is what left the tall black void beside each short heading (audit george 2026-07-25). */
.v3 .svc-full{border-top:1px solid var(--line);padding-top:clamp(22px,3vw,34px);display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(20px,4vw,56px);align-items:start}
/* the pin: heading + image hold in place while their own copy scrolls past, released by the next service.
   Same offset as .svc-side on the service detail page. align-items:start above is required for this to work. */
.v3 .svc-full-media{position:sticky;top:96px}
.v3 .svc-full-card{margin-top:clamp(14px,1.6vw,20px)}
.v3 .svc-full-card .c-body{padding:14px 20px 16px}   /* no <h3> in this variant — the h2 above carries the title */
/* audit george «use comment b, make them provocative» — "comment b" is the bottom CTA's ctaEdge pulse, so the
   pinned service cards reuse that exact keyframe. Delays are staggered: four cards strobing in unison reads as
   a broken page, offset they read as alive. Hover pauses it so the card's own hover state stays legible. */
.v3 .svc-full-card{animation:ctaEdge 2.6s ease-in-out infinite}
.v3 .svc-full:nth-of-type(2) .svc-full-card{animation-delay:.65s}
.v3 .svc-full:nth-of-type(3) .svc-full-card{animation-delay:1.3s}
.v3 .svc-full:nth-of-type(4) .svc-full-card{animation-delay:1.95s}
.v3 .svc-full-card:hover{animation-play-state:paused;border-color:rgba(255,127,26,.95)}
@media(prefers-reduced-motion:reduce){.v3 .svc-full-card{animation:none;border-color:rgba(255,127,26,.55)}}
.v3 .svc-full-t{font-family:var(--w);font-weight:700;font-size:clamp(1.5rem,3.2vw,2.4rem);line-height:1.08;letter-spacing:-.02em;color:#f4f3f1;margin:0}
.v3 .svc-full-body{color:var(--mut);font-weight:300;line-height:1.7}
.v3 .svc-full-body p{margin:0 0 1em}
.v3 .svc-full-body p:last-child{margin-bottom:0}
/* the copy is now real <p>s (see Services/index.php), which would otherwise inherit .article's orange drop-cap
   on the first paragraph of every service — four drop caps down the page. Neutralised, prose styling kept. */
.v3 .svc-full-body>p:first-of-type::first-letter{font-family:inherit;font-weight:inherit;font-size:inherit;line-height:inherit;float:none;margin:0;color:inherit}
.v3 .svc-full-more{margin-top:18px}
@media(max-width:900px){
  .v3 .svc-full{grid-template-columns:1fr;gap:14px}
  .v3 .svc-full-media{position:static}          /* never pin on mobile — it would eat the viewport */
  .v3 .svc-full-card{margin-top:14px}
  .v3 .svc-full-card .c-img{height:180px}
  .v3 .svc-full-more{justify-self:start}
}

/* ===== form flash banners (thank-you / error after Contact submit) + recaptcha sizing ===== */
.v3 #msg-flash{border-radius:12px;padding:14px 18px;font-size:.92rem;line-height:1.5;margin-bottom:16px}
.v3 .alert-success,.v3 #msg-flash.alert{background:rgba(58,208,122,.12);border:1px solid rgba(58,208,122,.45);color:#7ce0a8}
.v3 .alert-error{background:rgba(255,90,60,.1)!important;border:1px solid rgba(255,127,26,.55)!important;color:#ffb066!important}
.v3 .g-recaptcha{transform-origin:left top}
@media(max-width:360px){.v3 .g-recaptcha{transform:scale(.86)}}

/* ===== PROJECT GALLERY — STACKING CARDS (audit george 2026-07-28) =============================
   "this is not nice, replace it wherever you used it with the one found at
    memory/stacking-cards-scroll-prompt.md"
   Ported from the real source (nobox StackingCards.astro), not from the prompt: sticky pins that
   FAN, deeper cards scaling down from their top edge like a dealt deck, ambient wash behind.

   HISTORY THAT STILL BINDS — this component has flipped twice, do not undo these:
     · The STACK is the design. It was once swapped for a carousel; he corrected that.
       "never told you to remove the previous carousel. just told you to remove the text."
     · Cards are IMAGE ONLY. No caption panel, and NO `title` attribute. `alt` stays, for a11y/SEO.
     · 🚨 THE STACK STAYS ON ON MOBILE. An earlier version set position:static below 900px and the
       signature effect simply vanished on phones. Only PROPORTIONS change in the media query.
     · 🚨 NO backdrop-filter. Sticky-stacked cards overlap, so each blur re-samples everything
       beneath it and the cost compounds with depth. That is what caused teo's "after the 4th card
       it's lagging very bad". Measured then: the blur changed 0.064% of pixels. It buys nothing.
   GONE, deliberately: the spinning conic-gradient edge. That was the "glass" look now rejected, and
   it repainted a full-card conic gradient every frame on every card. With it goes the .tgv parking
   hack that existed only to stop that repaint. The new effect is transform-only.
   The wash uses the BRAND accent rather than a per-card colour: these cards carry no text, so there
   is no per-card accent to read, and inventing colours per image would be guesswork. */
.v3 .pstack-lead{color:var(--mut);font-weight:300;line-height:1.7;margin:14px 0 0;max-width:60ch}
/* 🚨 NO `overflow:hidden` HERE, EVER. It was added to contain the full-bleed wash and it silently
   killed the whole effect: an ancestor with overflow other than visible becomes the scroll container
   for its descendants, so every `position:sticky` pin inside stopped pinning and the deck rendered
   as a plain vertical list ("the cards do not stack"). The wash does not need clipping anyway, it is
   `inset:0` on this box so it cannot spill. */
.v3 .pstack-sec{position:relative}
.v3 .pstack{position:relative;z-index:1}
/* FULL-BLEED ambient wash (audit george: "a sharp cut-out rectangle is created, the color stops
   before the edges ... its a full width effect please"). It lives on the SECTION, not inside .wrap,
   so it spans the viewport; the gradient reaches transparent well inside every edge, so there is no
   box to see. --accent is the front card's colour, set by v3.js; @property lets it TRANSITION
   between cards instead of snapping. */
@property --pacc{syntax:'<color>';inherits:false;initial-value:#ff7f1a}
.v3 .pstack-bg{position:absolute;inset:0;z-index:0;pointer-events:none;--pacc:#ff7f1a;--p:0;
  background:
    radial-gradient(90% 46% at 50% calc(18% + var(--p) * 42%),
      color-mix(in srgb, var(--pacc) 34%, transparent) 0%,
      color-mix(in srgb, var(--pacc) 14%, transparent) 38%,
      transparent 72%),
    radial-gradient(120% 70% at 50% 50%,
      color-mix(in srgb, var(--pacc) 9%, transparent) 0%, transparent 68%);
  transition:--pacc .85s cubic-bezier(.4,0,.2,1)}
/* no color-mix or @property: fall back to a plain brand wash rather than nothing */
@supports not (background: color-mix(in srgb, red 50%, transparent)){
  .v3 .pstack-bg{background:radial-gradient(90% 46% at 50% 40%,rgba(255,127,26,.22),transparent 70%)}
}
/* each pin rests a touch lower than the last, so the deck fans instead of stacking dead flat.
   --i is capped at 7 in the PHP: these sets run to 21 cards and an uncapped stagger walks off screen. */
.v3 .pstack-pin{position:sticky;top:calc(92px + var(--i) * 1.05rem);min-height:56vh;z-index:1;
  display:flex;align-items:flex-start;justify-content:center}
.v3 .pstack-card{position:relative;display:block;width:100%;max-width:880px;aspect-ratio:16/9;
  border-radius:22px;overflow:hidden;transform-origin:top center;background:#101218;
  border:1px solid rgba(255,255,255,.10);
  box-shadow:0 30px 60px -28px rgba(0,0,0,.85),0 2px 10px rgba(0,0,0,.4);
  will-change:transform}
/* accent hairline along the top edge, static: the animated version is what caused the repaint cost */
.v3 .pstack-edge{position:absolute;inset:0 0 auto 0;height:3px;z-index:3;pointer-events:none;
  background:linear-gradient(90deg,transparent,var(--acc) 22%,var(--acc) 78%,transparent)}
.v3 .pstack-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
@media(hover:hover){
  .v3 .pstack-img{transition:transform .6s cubic-bezier(.2,.9,.2,1)}
  .v3 .pstack-card:hover .pstack-img{transform:scale(1.04)}
}
@media(max-width:900px){
  /* proportions only. position:sticky is NOT touched here, see the history note above. */
  .v3 .pstack-pin{min-height:44vh;top:calc(76px + var(--i) * .8rem)}
  .v3 .pstack-card{border-radius:16px}
  .v3 .pstack-bg{inset:-4vh -6vw}
}
/* weak devices: keep the pin-and-fan (it is free, plain sticky) and drop the wash */
.lowfx .v3 .pstack-bg{display:none}
@media(prefers-reduced-motion:reduce){
  /* release the pins and let the cards flow as a plain list; v3.js also skips the scroll handler */
  .v3 .pstack-pin{position:static;min-height:0;margin-bottom:18px;top:auto}
  .v3 .pstack-card{transform:none !important}
  .v3 .pstack-img{transition:none}
  .v3 .pstack-bg{display:none}
}
