/* Patech Labs — site.css (generat) */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scroll-padding-top:88px;background:#0A0C0A}
@media (prefers-reduced-motion: reduce){html{scroll-behavior:auto}}
body{margin:0;background:#0A0C0A}
a{color:#B4FF39}a:hover{color:#FFFFFF}
img,svg{max-width:100%}
[hidden]{display:none!important}
.pl{background:#0A0C0A;color:#EEF2EC;font-family:'Inter',system-ui,-apple-system,'Segoe UI',Roboto,Arial,sans-serif;font-size:16px;line-height:1.6;min-height:100vh;overflow-x:clip}
.wordmark{font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:700;letter-spacing:-0.01em;color:#FFFFFF}
.wordmark span{font-weight:400;margin-left:2px}
.skip{position:absolute;left:16px;top:-60px;z-index:100;padding:10px 16px;border-radius:10px;background:#B4FF39;color:#0A0C0A!important;font-weight:600;text-decoration:none}
.skip:focus{top:12px}
.hp{position:absolute!important;left:-9999px!important;width:1px;height:1px;overflow:hidden}
.file-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}
.drop.has-file{border-color:var(--acc)!important;border-style:solid!important}
.ckb{position:fixed;left:16px;right:16px;bottom:16px;z-index:80;max-width:720px;margin:0 auto;display:flex;flex-direction:column;gap:16px;padding:20px 22px;border-radius:20px;border:1px solid #2A302A;background:rgba(15,18,15,0.97);box-shadow:0 24px 60px -20px rgba(0,0,0,.8);animation:fu .5s cubic-bezier(.2,.7,.2,1) both}
.ckb-btn{display:inline-flex;align-items:center;justify-content:center;height:44px;padding:0 18px;border-radius:999px;font:inherit;font-size:14px;font-weight:600;cursor:pointer;text-decoration:none}
.btn[disabled]{opacity:.6;cursor:wait;transform:none!important}
.pl p a:not(.btn):not(.lnk){text-decoration:underline;text-underline-offset:3px}
@media (max-width: 980px){footer nav a.lnk,footer a.lnk[href^="mailto"],footer a.lnk[href^="tel"]{display:inline-block;padding:6px 0}footer nav{gap:4px!important}}
.rfq-ok:target{display:flex!important}
.rfq:has(+ .rfq-ok:target){display:none!important}
.form-msg:target{display:block!important}
[role="region"][tabindex]:focus-visible{outline:2px solid #B4FF39;outline-offset:2px}
@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url(/assets/fonts/inter-ro-400-normal.woff2) format('woff2');unicode-range:U+0102-0103,U+015E-015F,U+0162-0163,U+0218-021B}
@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url(/assets/fonts/inter-latin-400-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:swap;src:url(/assets/fonts/inter-ro-500-normal.woff2) format('woff2');unicode-range:U+0102-0103,U+015E-015F,U+0162-0163,U+0218-021B}
@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:swap;src:url(/assets/fonts/inter-latin-500-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url(/assets/fonts/inter-ro-600-normal.woff2) format('woff2');unicode-range:U+0102-0103,U+015E-015F,U+0162-0163,U+0218-021B}
@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url(/assets/fonts/inter-latin-600-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:400;font-display:swap;src:url(/assets/fonts/space-grotesk-ro-400-normal.woff2) format('woff2');unicode-range:U+0102-0103,U+015E-015F,U+0162-0163,U+0218-021B}
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:400;font-display:swap;src:url(/assets/fonts/space-grotesk-latin-400-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:500;font-display:swap;src:url(/assets/fonts/space-grotesk-ro-500-normal.woff2) format('woff2');unicode-range:U+0102-0103,U+015E-015F,U+0162-0163,U+0218-021B}
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:500;font-display:swap;src:url(/assets/fonts/space-grotesk-latin-500-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:600;font-display:swap;src:url(/assets/fonts/space-grotesk-ro-600-normal.woff2) format('woff2');unicode-range:U+0102-0103,U+015E-015F,U+0162-0163,U+0218-021B}
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:600;font-display:swap;src:url(/assets/fonts/space-grotesk-latin-600-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:700;font-display:swap;src:url(/assets/fonts/space-grotesk-ro-700-normal.woff2) format('woff2');unicode-range:U+0102-0103,U+015E-015F,U+0162-0163,U+0218-021B}
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:700;font-display:swap;src:url(/assets/fonts/space-grotesk-latin-700-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/assets/fonts/jetbrains-mono-ro-400-normal.woff2) format('woff2');unicode-range:U+0102-0103,U+015E-015F,U+0162-0163,U+0218-021B}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/assets/fonts/jetbrains-mono-latin-400-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/assets/fonts/jetbrains-mono-ro-500-normal.woff2) format('woff2');unicode-range:U+0102-0103,U+015E-015F,U+0162-0163,U+0218-021B}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/assets/fonts/jetbrains-mono-latin-500-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
.pl{--acc:#B4FF39}
.pl *,.pl *::before,.pl *::after{box-sizing:border-box}
.pl ::selection{background:var(--acc);color:#0A0C0A}
.pl a{color:inherit;text-decoration:none}
.pl a.lnk{color:#C9D1C7;transition:color .2s}
.pl a.lnk:hover{color:var(--acc)}
.mono{font-family:'JetBrains Mono',ui-monospace,monospace}
.disp{font-family:'Space Grotesk','Inter',sans-serif}
.acc{color:var(--acc)}
@keyframes fu{from{opacity:0;transform:translateY(26px)}to{opacity:1;transform:none}}
.fu{animation:fu .9s cubic-bezier(.2,.7,.2,1) both}
.d1{animation-delay:.08s}.d2{animation-delay:.2s}.d3{animation-delay:.32s}.d4{animation-delay:.44s}.d5{animation-delay:.56s}.d6{animation-delay:.7s}
@supports (animation-timeline: view()){
.rv{animation:fu linear both;animation-timeline:view();animation-range:entry 0% cover 24%}
}
@keyframes gridpan{to{background-position:48px 48px,48px 48px}}
.gridbg{background-image:linear-gradient(rgba(255,255,255,.05) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.05) 1px,transparent 1px);background-size:48px 48px;animation:gridpan 7s linear infinite}
@keyframes build{0%{clip-path:inset(100% 0 0 0);opacity:1;animation-timing-function:steps(14,end)}75%{clip-path:inset(0 0 0 0);opacity:1}88%{clip-path:inset(0 0 0 0);opacity:1;animation-timing-function:ease}100%{clip-path:inset(0 0 0 0);opacity:0}}
.part{animation:build 8s infinite}
@keyframes rise{0%{transform:translateY(0);animation-timing-function:steps(14,end)}75%{transform:translateY(-252px)}100%{transform:translateY(-252px)}}
.rise{animation:rise 8s infinite}
@keyframes sweep{from{transform:translateX(-132px)}to{transform:translateX(132px)}}
.sweep{animation:sweep .4286s ease-in-out infinite alternate}
@keyframes prog{0%{width:0;animation-timing-function:steps(14,end)}75%{width:100%}100%{width:100%}}
.prog{animation:prog 8s infinite}
.ly{height:16px;border-radius:3px;background:linear-gradient(180deg,#2E352E,#1A1F1A);border-top:1px solid #4A554A;align-self:center}
@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}
.bob{animation:bob 5s ease-in-out infinite}
.bob2{animation:bob 6s ease-in-out -2s infinite}
.bob3{animation:bob 7s ease-in-out -4s infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(180,255,57,0.65);box-shadow:0 0 0 0 color-mix(in srgb,var(--acc) 65%,transparent)}100%{box-shadow:0 0 0 10px transparent}}
.pulse{animation:pulse 1.6s ease-out infinite}
@keyframes glow{0%,100%{opacity:.55}50%{opacity:1}}
.glow{animation:glow 1.2s ease-in-out infinite}
@keyframes mq{to{transform:translateX(-50%)}}
.mq{animation:mq 42s linear infinite}
.mqwrap:hover .mq{animation-play-state:paused}
.card{transition:transform .4s cubic-bezier(.2,.7,.2,1),border-color .4s,background .4s}
.card:hover{transform:translateY(-6px);border-color:var(--acc)!important;background:#131713!important}
.cico{transition:background .35s,color .35s,transform .35s}
.card:hover .cico{background:var(--acc)!important;color:#0A0C0A!important;transform:rotate(-8deg)}
.card .arr{transition:transform .35s}
.card:hover .arr{transform:translateX(6px)}
.btn{transition:transform .25s,box-shadow .25s,background .25s,color .25s,border-color .25s}
.btn:hover{transform:translateY(-2px);box-shadow:0 12px 32px -10px rgba(180,255,57,0.75);box-shadow:0 12px 32px -10px color-mix(in srgb,var(--acc) 75%,transparent)}
.btng:hover{border-color:var(--acc)!important;color:var(--acc)!important;box-shadow:none}
.btnd:hover{background:#000000!important;box-shadow:0 12px 32px -10px rgba(0,0,0,.6)}
.mtab{transition:all .25s;background:transparent;color:#C9D1C7;border:1px solid #2A302A;cursor:pointer}
.mtab:hover{border-color:#4A554A;color:#FFFFFF}
.mtab.on{background:var(--acc);color:#0A0C0A;border-color:var(--acc)}
@keyframes grow{from{width:0}}
.bar{animation:grow 1.1s cubic-bezier(.2,.7,.2,1) both}
.swap{animation:fu .55s cubic-bezier(.2,.7,.2,1) both}
@keyframes shim{from{left:-25%}to{left:100%}}
.shim{animation:shim 3.2s linear infinite}
.step{transition:border-color .35s,transform .35s}
.step:hover{border-color:var(--acc)!important;transform:translateY(-4px)}
.step:hover .snum{color:var(--acc)!important;-webkit-text-stroke:0!important}
.snum{transition:color .35s}
details.faq{transition:border-color .3s,background .3s}
details.faq:hover{border-color:#3A433A!important}
details.faq[open]{background:#111411!important;border-color:#3A433A!important}
details.faq summary{list-style:none;cursor:pointer}
details.faq summary::-webkit-details-marker{display:none}
.plus{transition:transform .35s,background .35s,color .35s}
details.faq[open] .plus{transform:rotate(45deg);background:var(--acc)!important;color:#0A0C0A!important}
details.faq[open] .ans{animation:fu .45s both}
.fld{transition:border-color .2s,box-shadow .2s}
.fld:focus{outline:none;border-color:var(--acc)!important;box-shadow:0 0 0 3px rgba(180,255,57,0.25);box-shadow:0 0 0 3px color-mix(in srgb,var(--acc) 25%,transparent)}
.drop{transition:border-color .25s,background .25s}
.drop:hover{border-color:var(--acc)!important;background:#131813!important}
.pl :focus-visible{outline:2px solid var(--acc);outline-offset:3px}
.menubtn{display:none!important}
.mlink{transition:color .2s,padding .25s}.mlink:hover{color:var(--acc)!important;padding-left:8px!important}
.morelink{display:inline-flex;align-items:center;gap:8px;color:var(--acc)!important;font-weight:600}
.morelink:hover .arr{transform:translateX(6px)}
@media (min-width: 981px){.mnav{display:none!important}}
@media (max-width: 980px){.navlinks{display:none!important}.menubtn{display:inline-flex!important}}
@media (max-width: 640px){.hide-sm{display:none!important}}
@media (max-width: 520px){.stagein{transform:scale(.74);transform-origin:50% 100%}}
@media (prefers-reduced-motion: reduce){.pl *,.pl *::before,.pl *::after{animation:none!important;transition:none!important}}
.nomo *,.nomo *::before,.nomo *::after{animation:none!important;transition:none!important}
.pl a.lnk:hover,.pl a.lnk.on{color:var(--acc)}
.d1{animation-delay:.08s}.d2{animation-delay:.2s}.d3{animation-delay:.32s}.d4{animation-delay:.44s}.d5{animation-delay:.56s}
@supports (animation-timeline: view()){.rv{animation:fu linear both;animation-timeline:view();animation-range:entry 0% cover 24%}}
.bob{animation:bob 5s ease-in-out infinite}.bob2{animation:bob 6s ease-in-out -2s infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.spin{animation:spin 14s linear infinite}.spinr{animation:spin 9s linear infinite reverse}
.arr{transition:transform .35s}a:hover .arr{transform:translateX(6px)}
.pill{transition:border-color .25s,color .25s,background .25s}
.pill:hover{border-color:var(--acc)!important;color:var(--acc)!important}
/* page */
.scene{perspective:900px}
.cube{position:relative;width:170px;height:170px;transform-style:preserve-3d;animation:cube 16s linear infinite}
.cube>span{position:absolute;inset:0;border:1.5px solid var(--acc);background:rgba(180,255,57,0.05);background:color-mix(in srgb,var(--acc) 5%,transparent)}
.cube>span:nth-child(1){transform:translateZ(85px)}
.cube>span:nth-child(2){transform:rotateY(180deg) translateZ(85px)}
.cube>span:nth-child(3){transform:rotateY(90deg) translateZ(85px)}
.cube>span:nth-child(4){transform:rotateY(-90deg) translateZ(85px)}
.cube>span:nth-child(5){transform:rotateX(90deg) translateZ(85px)}
.cube>span:nth-child(6){transform:rotateX(-90deg) translateZ(85px)}
.cube.in{position:absolute;left:45px;top:45px;width:80px;height:80px;animation:cube 9s linear infinite reverse}
.cube.in>span{border-color:#FFFFFF;background:transparent;opacity:.6}
.cube.in>span:nth-child(1){transform:translateZ(40px)}
.cube.in>span:nth-child(2){transform:rotateY(180deg) translateZ(40px)}
.cube.in>span:nth-child(3){transform:rotateY(90deg) translateZ(40px)}
.cube.in>span:nth-child(4){transform:rotateY(-90deg) translateZ(40px)}
.cube.in>span:nth-child(5){transform:rotateX(90deg) translateZ(40px)}
.cube.in>span:nth-child(6){transform:rotateX(-90deg) translateZ(40px)}
@keyframes cube{from{transform:rotateX(-24deg) rotateY(0)}to{transform:rotateX(-24deg) rotateY(360deg)}}
@keyframes iter{0%,30%{border-color:var(--acc);color:#FFFFFF;background:rgba(180,255,57,0.12);background:color-mix(in srgb,var(--acc) 12%,transparent)}36%,100%{border-color:#2A302A;color:#8E978D;background:transparent}}
.iter{animation:iter 6s infinite}
@keyframes pop{0%{transform:scale(0);opacity:0}8%{transform:scale(1);opacity:1}86%{transform:scale(1);opacity:1}100%{transform:scale(.6);opacity:0}}
.pop{animation:pop 6s cubic-bezier(.2,.7,.2,1) infinite both}
@keyframes lighter{0%,20%{width:100%}55%,85%{width:42%}100%{width:100%}}
.lighter{animation:lighter 6s ease-in-out infinite}
.bob{animation:bob 5s ease-in-out infinite}.bob2{animation:bob 6s ease-in-out -2s infinite}.bob3{animation:bob 7s ease-in-out -4s infinite}
@keyframes plab{0%{opacity:0;transform:translateY(6px)}3%{opacity:1;transform:none}16%{opacity:1;transform:none}19%{opacity:0;transform:translateY(-6px)}100%{opacity:0}}
.plab{animation:plab 15s infinite both}
@keyframes scan{from{left:-6%}to{left:104%}}
.scan{animation:scan 3.6s cubic-bezier(.6,0,.4,1) infinite alternate}
.lyr{height:14px;border-radius:4px;background:linear-gradient(90deg,#1E241E,#2C332C 40%,#1E241E);border-top:1px solid #3E473E}
.trow{transition:background .25s}.trow:hover{background:#121612}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(180,255,57,0.65);box-shadow:0 0 0 0 color-mix(in srgb,var(--acc) 65%,transparent)}100%{box-shadow:0 0 0 18px transparent}}
.pulse{animation:pulse 2s ease-out infinite}
.orbit{animation:spin 40s linear infinite}
.counter{animation:spin 40s linear infinite reverse}
.orbit2{animation:spin 26s linear infinite reverse}
.chip{transition:border-color .25s,color .25s}.card:hover .chip{border-color:#4A554A!important}
@media (max-width: 480px){.orbwrap{transform:scale(.8)}}
.radar{animation:spin 6s linear infinite}
@keyframes ring{0%{transform:scale(.15);opacity:.9}100%{transform:scale(1);opacity:0}}
.ring{animation:ring 3.6s ease-out infinite}
.ph{transition:border-color .35s}.ph:hover{border-color:var(--acc)!important}
@supports (animation-timeline: view()){.rv{animation:fu linear both;animation-timeline:view();animation-range:entry 0% cover 20%}}
@keyframes type{0%,8%{width:0}45%,85%{width:22ch}100%{width:0}}
.type{display:inline-block;overflow:hidden;white-space:nowrap;vertical-align:bottom;width:22ch;animation:type 7s steps(22) infinite}
@keyframes blink{50%{opacity:0}}
.caret{animation:blink 1s step-end infinite}
.pill{transition:border-color .25s,color .25s}
@keyframes ring{0%{transform:scale(.2);opacity:.9}100%{transform:scale(1);opacity:0}}
.ring{animation:ring 2.8s ease-out infinite}
@keyframes drop{0%{transform:translateY(-30px);opacity:0}60%{transform:translateY(4px);opacity:1}100%{transform:none;opacity:1}}
.drop-pin{animation:drop .9s cubic-bezier(.2,.7,.2,1) .4s both}
.card:hover{transform:translateY(-4px);border-color:var(--acc)!important;background:#131713!important}
.pl a.il{color:var(--acc);text-decoration:underline;text-underline-offset:3px}
.pl a.il:hover{color:#FFFFFF}
.d1{animation-delay:.08s}.d2{animation-delay:.2s}.d3{animation-delay:.32s}.d4{animation-delay:.44s}
@supports (animation-timeline: view()){.rv{animation:fu linear both;animation-timeline:view();animation-range:entry 0% cover 18%}}
.toc a{display:flex;gap:12px;padding:8px 0;color:#A3ACA2;transition:color .2s,padding .25s}
.toc a:hover{color:var(--acc);padding-left:6px}
.legal h2{font-family:'Space Grotesk','Inter',sans-serif;font-size:clamp(24px,2.6vw,32px);line-height:1.15;letter-spacing:-0.02em;font-weight:600;color:#FFFFFF;margin:0 0 18px}
.legal h3{font-size:18px;font-weight:600;color:#FFFFFF;margin:24px 0 8px}
.legal p,.legal li{color:#B5BDB3;font-size:16px;line-height:1.75}
.legal p{margin:0 0 14px}
.legal ul{margin:0 0 14px;padding-left:20px}
.legal li{margin-bottom:6px}
.legal strong{color:#FFFFFF;font-weight:600}
.legal section{padding:40px 0;border-top:1px solid #1C211C;scroll-margin-top:96px}
.legal section:first-child{border-top:0;padding-top:0}
.todo{color:#FFD27A}
.sw{position:relative;flex:none;width:54px;height:30px;border-radius:999px;border:0;background:#2A302A;cursor:pointer;transition:background .25s}
.sw::after{content:"";position:absolute;top:3px;left:3px;width:24px;height:24px;border-radius:50%;background:#FFFFFF;transition:transform .3s cubic-bezier(.2,.7,.2,1)}
.sw.on{background:var(--acc)}
.sw.on::after{transform:translateX(24px);background:#0A0C0A}
.sw.lock{opacity:.6;cursor:not-allowed}
.swap{animation:fu .45s cubic-bezier(.2,.7,.2,1) both}
