/* Fletch marketing site — motion and showcase components. Builds on styles.css tokens. */

/* ---------- global polish ---------- */
.progress{position:fixed;top:0;left:0;height:3px;width:0;z-index:60;background:linear-gradient(90deg,var(--teal),var(--blue));pointer-events:none;transition:width .12s linear}
.hl{background:linear-gradient(92deg,#5FD3E0 0%,#7FB0FF 55%,#B9D0FF 100%);-webkit-background-clip:text;background-clip:text;color:transparent;font-style:normal}
.hl.on-paper{background:linear-gradient(92deg,var(--teal-ink),var(--blue));-webkit-background-clip:text;background-clip:text;color:transparent}
.btn.primary{position:relative;overflow:hidden}
.btn.primary::after{content:"";position:absolute;top:-40%;left:-60%;width:40%;height:180%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.55),transparent);transform:skewX(-20deg);transition:left .55s ease}
.btn.primary:hover::after{left:120%}
.grain::after{content:"";position:absolute;inset:0;pointer-events:none;opacity:.14;mix-blend-mode:overlay;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/></filter><rect width='160' height='160' filter='url(%23n)' opacity='.6'/></svg>")}

/* ---------- reveal on scroll (visible at rest, nudged into place) ---------- */
.reveal{transform:translateY(22px);opacity:.62;transition:transform .9s cubic-bezier(.2,.7,.2,1),opacity .9s ease}
.reveal.in{transform:none;opacity:1}
.reveal.d1{transition-delay:.08s}.reveal.d2{transition-delay:.16s}.reveal.d3{transition-delay:.24s}.reveal.d4{transition-delay:.32s}
@media (prefers-reduced-motion:reduce){.reveal{transform:none;opacity:1;transition:none}}

/* ---------- hero v2 ---------- */
.hero2{background:var(--ink);color:var(--on-ink);position:relative;overflow:hidden;isolation:isolate}
.hero2 .aurora{position:absolute;inset:-20% -10%;z-index:-2;filter:blur(70px);opacity:.75}
.hero2 .aurora i{position:absolute;border-radius:50%;animation:drift 18s ease-in-out infinite alternate}
.hero2 .aurora i:nth-child(1){width:52vw;height:52vw;left:48%;top:-20%;background:radial-gradient(circle,rgba(4,97,255,.55),transparent 60%)}
.hero2 .aurora i:nth-child(2){width:42vw;height:42vw;left:-8%;top:40%;background:radial-gradient(circle,rgba(0,170,190,.45),transparent 60%);animation-delay:-6s}
.hero2 .aurora i:nth-child(3){width:30vw;height:30vw;left:60%;top:60%;background:radial-gradient(circle,rgba(127,176,255,.35),transparent 60%);animation-delay:-11s}
@keyframes drift{from{transform:translate(0,0) scale(1)}to{transform:translate(6%,8%) scale(1.12)}}
.hero2 canvas.flow2{position:absolute;inset:0;width:100%;height:100%;z-index:-1;opacity:.9}
.hero2 .wrap{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.2fr);gap:clamp(28px,5vw,72px);align-items:center;padding-block:clamp(64px,9vw,120px) clamp(72px,10vw,140px);position:relative}
.hero2 h1{color:#fff;font-size:clamp(2.6rem,5.8vw,4.9rem);line-height:1.02;letter-spacing:-.04em}
.hero2 .lead{color:var(--on-ink-2);max-width:44ch}
.hero2 .eyebrow{color:#5FD3E0}
.hero2 .hero-copy{display:grid;gap:24px}
.hero2 .hero-note{font-family:var(--mono);font-size:.78rem;color:var(--on-ink-2);display:flex;gap:16px;flex-wrap:wrap}
.hero2 .hero-note span{display:inline-flex;align-items:center;gap:7px}
.hero2 .hero-note i{width:8px;height:8px;border-radius:50%;background:#00AABE;display:inline-block;box-shadow:0 0 0 0 rgba(0,170,190,.6);animation:ping 2.4s ease-out infinite}
.hero2 .hero-note span:nth-child(2) i{animation-delay:.8s}.hero2 .hero-note span:nth-child(3) i{animation-delay:1.6s}
@keyframes ping{0%{box-shadow:0 0 0 0 rgba(0,170,190,.55)}70%{box-shadow:0 0 0 10px rgba(0,170,190,0)}100%{box-shadow:0 0 0 0 rgba(0,170,190,0)}}
@media (max-width:900px){.hero2 .wrap{grid-template-columns:minmax(0,1fr)}}

/* 3D tilt frame */
/* No perspective on a product screenshot: rotating the frame rotates the
   console's own type with it, and the UI reads as distorted rather than as
   depth. The depth comes from the shadow instead. */
.tilt .window{transition:transform .5s cubic-bezier(.2,.7,.2,1),box-shadow .5s ease;box-shadow:0 2px 4px rgba(0,0,0,.5),0 60px 120px -40px rgba(0,0,0,.9),-20px 40px 90px -50px rgba(4,97,255,.5)}
.tilt:hover .window{transform:translateY(-4px)}
@media (prefers-reduced-motion:reduce){.tilt .window{transform:none}}

/* annotation pins over a screenshot */
main{overflow-x:clip}
.shotpins{position:relative}
.pin{position:absolute;transform:translate(-50%,-50%);z-index:3}
.pin b{display:block;width:14px;height:14px;border-radius:50%;background:var(--teal);border:2px solid #fff;box-shadow:0 0 0 0 rgba(0,170,190,.55);animation:ping 2.6s ease-out infinite;cursor:default}
.pin:nth-of-type(2) b{animation-delay:.9s}.pin:nth-of-type(3) b{animation-delay:1.8s}
.pin span{position:absolute;left:18px;top:50%;transform:translateY(-50%) translateX(-6px);white-space:nowrap;background:var(--ink);color:#fff;font-family:var(--mono);font-size:.72rem;letter-spacing:.02em;padding:7px 10px;border-radius:8px;border:1px solid rgba(255,255,255,.14);opacity:0;pointer-events:none;transition:opacity .2s ease,transform .2s ease;box-shadow:0 10px 30px -10px rgba(0,0,0,.6)}
.pin.show span,.pin:hover span{opacity:1;transform:translateY(-50%) translateX(0)}
.pin.left span{left:auto;right:18px;transform:translateY(-50%) translateX(6px)}
.pin.left.show span,.pin.left:hover span{transform:translateY(-50%) translateX(0)}
@media (max-width:640px){.pin span{display:none}}

/* ---------- big numbers that count ---------- */
.stats > div{position:relative;overflow:hidden;transition:transform .25s ease}
.stats > div:hover{transform:translateY(-3px)}
.stats > div::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;background:linear-gradient(90deg,var(--teal),var(--blue));opacity:0;transition:opacity .25s ease}
.stats > div:hover::before,.stats > div.in::before{opacity:1}

/* ---------- ticker (Alteryx tool -> Fletch operator) ---------- */
.ticker{overflow:hidden;display:grid;gap:12px;mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent);-webkit-mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent)}
.ticker ul{display:flex;gap:12px;list-style:none;margin:0;padding:0;width:max-content;animation:marquee 70s linear infinite}
.ticker ul.rev{animation-direction:reverse;animation-duration:84s}
.ticker li{display:inline-flex;align-items:center;gap:10px;padding:8px 14px 8px 10px;border-radius:999px;background:var(--surface);border:1px solid var(--line);font-size:.86rem;white-space:nowrap}
.ticker li .ax{font-family:var(--mono);font-size:.72rem;letter-spacing:.04em;color:var(--muted);padding:3px 8px;border-radius:6px;background:var(--paper-2)}
.ticker li .arr{color:var(--teal-ink);font-weight:700}
.ticker li .op{font-family:var(--mono);font-size:.78rem;color:var(--blue)}
@media (prefers-reduced-motion:reduce){.ticker ul{animation:none}.ticker{mask-image:none;-webkit-mask-image:none}}

/* ---------- verdict tiles ---------- */
.verdicts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}
@media (max-width:820px){.verdicts{grid-template-columns:1fr}}
.verdict{position:relative;padding:28px;border-radius:18px;background:var(--surface);border:1px solid var(--line);display:grid;gap:12px;overflow:hidden;transition:transform .25s ease,border-color .25s ease}
.verdict:hover{transform:translateY(-4px)}
.verdict::before{content:"";position:absolute;inset:0;background:radial-gradient(400px 160px at 20% 0%,var(--vc,transparent),transparent 70%);opacity:.35}
.verdict.good{--vc:rgba(28,140,90,.35)}.verdict.warn{--vc:rgba(201,112,10,.35)}.verdict.lock{--vc:rgba(4,97,255,.3)}
.verdict svg{width:48px;height:48px;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;fill:none}
.verdict.good svg{stroke:var(--good)}.verdict.warn svg{stroke:var(--amber)}.verdict.lock svg{stroke:var(--blue)}
.verdict .k{font-family:var(--mono);font-size:.72rem;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.verdict h3{font-size:1.6rem}
.verdict p{color:var(--text-2);font-size:.98rem}
.draw{stroke-dasharray:60;stroke-dashoffset:60;animation:draw 1.1s ease forwards}
.in .draw{animation-play-state:running}
@keyframes draw{to{stroke-dashoffset:0}}
.pulse{animation:pulse 1.8s ease-in-out infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}

/* ---------- tabbed demo ---------- */
.demo{background:var(--surface);border:1px solid var(--line);border-radius:18px;overflow:hidden;box-shadow:var(--shadow)}
.demo .tabs{display:flex;gap:4px;padding:10px;border-bottom:1px solid var(--line);background:var(--paper-2);overflow-x:auto}
.demo .tabs button{font:inherit;font-weight:600;font-size:.9rem;padding:9px 14px;border-radius:999px;border:1px solid transparent;background:transparent;color:var(--text-2);cursor:pointer;white-space:nowrap;display:inline-flex;gap:8px;align-items:center}
.demo .tabs button .n{font-family:var(--mono);font-size:.7rem;color:var(--muted)}
.demo .tabs button[aria-selected="true"]{background:var(--surface);color:var(--blue);border-color:var(--line)}
.demo .panel{display:none;padding:0}
.demo .panel.on{display:block;animation:fadein .4s ease}
@keyframes fadein{from{opacity:.4;transform:translateY(6px)}to{opacity:1;transform:none}}
.demo .panel pre{border-radius:0;border:0;min-height:380px;font-size:.82rem}
.demo .panel img{display:block;width:100%;height:auto}
.demo .tele{width:100%;border-collapse:collapse;font-size:.9rem}
.demo .tele th,.demo .tele td{padding:11px 16px;border-bottom:1px solid var(--line);text-align:left}
.demo .tele th{font-family:var(--mono);font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);background:var(--paper-2)}
.demo .tele td.mono{font-family:var(--mono);font-size:.82rem;color:var(--text-2)}
.demo .tele .bar{height:6px;border-radius:3px;background:linear-gradient(90deg,var(--teal),var(--blue));min-width:4px}
.demo .foot{padding:10px 16px;font-family:var(--mono);font-size:.72rem;color:var(--muted);border-top:1px solid var(--line);background:var(--paper-2)}
.cursor::after{content:"▋";animation:blink 1s steps(1) infinite;color:#5FD3E0}
@keyframes blink{50%{opacity:0}}

/* ---------- security: the building ---------- */
.building{background:var(--surface);border:1px solid var(--line);border-radius:18px;padding:clamp(12px,3vw,28px);overflow:hidden}
.building svg{width:100%;height:auto;font-family:var(--body)}
.building .wall{fill:var(--paper-2);stroke:var(--line-2);stroke-width:2}
.building .door{fill:var(--blue-soft);stroke:var(--blue);stroke-width:2}
.building .lbl{fill:var(--text);font-size:14px;font-weight:600}
.building .sub{fill:var(--muted);font-size:11.5px;font-family:var(--mono)}
.building .no{fill:var(--muted);font-size:12px;font-family:var(--mono)}
.building .orbit{fill:var(--teal)}
.building .orbit.b{fill:var(--blue)}
.building .orbit{offset-rotate:0deg;animation:orbit 9s linear infinite}
.building .orbit.b{animation-duration:12s;animation-delay:-4s}
.building .orbit.c{animation-duration:7s;animation-delay:-2s}
.building .orbit.d{animation-duration:10s;animation-delay:-7s}
@keyframes orbit{to{offset-distance:100%}}
.building .blocked{stroke:var(--amber);stroke-width:2;stroke-dasharray:4 6;fill:none;animation:dashmove 2s linear infinite}
@keyframes dashmove{to{stroke-dashoffset:-20}}
@media (prefers-reduced-motion:reduce){.building .orbit,.building .blocked{animation:none}}

/* hash chain */
.chain{display:flex;gap:0;align-items:center;overflow-x:auto;padding:8px 2px}
.chain .blk{flex:none;width:150px;border:1px solid var(--line);border-radius:12px;background:var(--surface);padding:12px 14px;display:grid;gap:4px;position:relative}
.chain .blk .k{font-family:var(--mono);font-size:.68rem;color:var(--muted);letter-spacing:.06em;text-transform:uppercase}
.chain .blk .h{font-family:var(--mono);font-size:.74rem;color:var(--blue);word-break:break-all}
.chain .blk .p{font-family:var(--mono);font-size:.68rem;color:var(--teal-ink);word-break:break-all}
.chain .lnk{flex:none;width:34px;height:2px;background:linear-gradient(90deg,var(--teal),var(--blue));position:relative}
.chain .lnk::after{content:"";position:absolute;right:-1px;top:-4px;border:5px solid transparent;border-left-color:var(--blue)}
.chain .blk.lit{border-color:var(--teal);box-shadow:0 0 0 4px var(--teal-soft)}

/* ---------- deploy: animated architecture ---------- */
.archflow .edge.live{stroke-dasharray:6 8;animation:dashmove 1.4s linear infinite}
.archflow .pkt{fill:var(--teal);offset-rotate:0deg;animation:orbit 4s linear infinite}
.archflow .pkt.b{fill:var(--blue);animation-duration:5s;animation-delay:-2s}
@media (prefers-reduced-motion:reduce){.archflow .edge.live,.archflow .pkt{animation:none}}
.term{background:#0B1324;color:#DCE4F5;border-radius:14px;border:1px solid #233050;font-family:var(--mono);font-size:.84rem;line-height:1.7;overflow:hidden;box-shadow:var(--shadow-lg)}
.term .bar{height:34px;display:flex;align-items:center;gap:6px;padding:0 14px;border-bottom:1px solid #233050;background:#0E1830;color:#8F9CB9;font-size:.7rem}
.term .bar i{width:10px;height:10px;border-radius:50%;background:#2E3D60;display:inline-block}
.term .bar span{margin-left:10px}
.term pre{border:0;border-radius:0;min-height:260px;background:transparent}
.term .p{color:#5FD3E0}.term .ok{color:#4CC98A}.term .c{color:#7E8CAA}

/* ---------- connectors: logo cloud ---------- */
.cloud{position:relative;height:clamp(260px,34vw,420px);overflow:hidden;border-radius:24px;background:radial-gradient(600px 300px at 50% 60%,var(--blue-soft),transparent 70%)}
.cloud .lg{position:absolute;width:64px;height:64px;border-radius:16px;background:#fff;border:1px solid var(--line);padding:12px;display:grid;place-items:center;box-shadow:var(--shadow);animation:float 7s ease-in-out infinite;transition:transform .25s ease}
.cloud .lg:hover{transform:scale(1.12) !important;z-index:2}
.cloud .lg img{width:100%;height:100%;object-fit:contain}
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-14px)}}
.cloud .core{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:96px;height:96px;border-radius:28px;background:var(--ink);display:grid;place-items:center;box-shadow:0 0 0 12px rgba(4,97,255,.12),0 0 0 28px rgba(0,170,190,.07);z-index:1}
.cloud .core img{width:52px;height:46px;object-fit:contain}
.cloud .ring{position:absolute;left:50%;top:50%;width:1px;height:1px}
@media (prefers-reduced-motion:reduce){.cloud .lg{animation:none}}
.ctile{position:relative;overflow:hidden}
.ctile::after{content:"";position:absolute;inset:0;background:radial-gradient(200px 80px at var(--mx,50%) var(--my,50%),rgba(4,97,255,.12),transparent 70%);opacity:0;transition:opacity .2s ease;pointer-events:none}
.ctile:hover::after{opacity:1}

/* ---------- misc ---------- */
.glass{background:color-mix(in srgb,var(--surface) 70%,transparent);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}
.kicker{display:inline-flex;align-items:center;gap:8px;font-family:var(--mono);font-size:.74rem;letter-spacing:.12em;text-transform:uppercase;color:#5FD3E0;padding:6px 12px;border:1px solid rgba(95,211,224,.35);border-radius:999px;background:rgba(95,211,224,.08)}
.kicker i{width:6px;height:6px;border-radius:50%;background:#5FD3E0;animation:pulse 1.6s ease-in-out infinite}
.page-hero.dark{background:var(--ink);color:var(--on-ink);position:relative;overflow:hidden;isolation:isolate}
.page-hero.dark h1{color:#fff}
.page-hero.dark .lead{color:var(--on-ink-2)}
.page-hero.dark .eyebrow{color:#5FD3E0}
.page-hero.dark .aurora{position:absolute;inset:-30% -10%;z-index:-1;filter:blur(70px);opacity:.7}
.page-hero.dark .aurora i{position:absolute;border-radius:50%;animation:drift 20s ease-in-out infinite alternate}
.page-hero.dark .aurora i:nth-child(1){width:50vw;height:50vw;right:-10%;top:-30%;background:radial-gradient(circle,rgba(4,97,255,.5),transparent 60%)}
.page-hero.dark .aurora i:nth-child(2){width:36vw;height:36vw;left:-10%;bottom:-40%;background:radial-gradient(circle,rgba(0,170,190,.4),transparent 60%);animation-delay:-8s}
.page-hero.dark .btn.ghost{border-color:rgba(255,255,255,.25);color:#fff}
.page-hero.dark .legend{color:var(--on-ink-2)}
.page-hero.dark .st{color:var(--on-ink-2);border-color:rgba(255,255,255,.2)}
.band.ink{background:var(--ink);color:var(--on-ink);position:relative;overflow:hidden}
.band.ink h2{color:#fff}.band.ink .lead,.band.ink p{color:var(--on-ink-2)}.band.ink .eyebrow{color:#5FD3E0}
.band.ink .card{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.1)}
.band.ink .card h3{color:#fff}.band.ink .card p,.band.ink .card ul{color:var(--on-ink-2)}
.band.ink .card .ic{background:rgba(255,255,255,.08);color:#5FD3E0}
.band + .band.ink,.band.ink + .band{border-top:0}

/* Anything that normally sits on paper has to be restyled when it sits on ink:
   its own light surface under inherited light text is unreadable. */
.page-hero.dark code,.hero2 code,.band.ink code,.cta code{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.18);color:#DCE4F5}
.band.ink .verdict{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.12)}
.band.ink .verdict h3{color:#fff}
.band.ink .verdict p{color:var(--on-ink-2)}
.band.ink .verdict .k{color:#8F9CB9}
.band.ink .verdict.good{--vc:rgba(76,201,138,.28)}
.band.ink .verdict.warn{--vc:rgba(240,162,74,.26)}
.band.ink .verdict.lock{--vc:rgba(91,147,255,.26)}
.band.ink .verdict.good svg{stroke:#4CC98A}
.band.ink .verdict.warn svg{stroke:#F0A24A}
.band.ink .verdict.lock svg{stroke:#7FB0FF}
.band.ink .callout{background:rgba(0,170,190,.1);border-color:#2BC6D9;color:var(--on-ink-2)}
.band.ink .callout b{color:#fff}
.band.ink .tbl-wrap{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.12)}
.band.ink .tbl th{background:rgba(255,255,255,.06);color:#8F9CB9}
.band.ink .tbl td{border-color:rgba(255,255,255,.1);color:var(--on-ink-2)}
.band.ink .st{color:var(--on-ink-2);border-color:rgba(255,255,255,.2)}
.band.ink .stats{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.12)}
.band.ink .stats > div{background:rgba(11,19,36,.9)}
.band.ink .stats .v{color:#fff}
.band.ink .stats .k{color:var(--on-ink-2)}
.band.ink .steps{border-color:rgba(255,255,255,.12)}
.band.ink .steps .n{color:#5FD3E0}
.band.ink .steps p{color:var(--on-ink-2)}
