/* == obv rethink v1: homepage + about == */
:root{--obv-bg:#030e14;--obv-panel:#04141c;--obv-line:rgba(255,255,255,.08);--obv-green:#d3ed05;--obv-green2:#5db934;--obv-text:#eaeee6;--obv-muted:#b7bfb9;--obv-heading:Inter,sans-serif;--obv-body:"Work Sans",sans-serif}
.obv-sec{position:relative;padding:72px 0;color:var(--obv-text);font-family:var(--obv-body)}
.obv-sec.tight{padding:48px 0}
.obv-sec.first{padding-top:56px}
.obv-sec>.container{padding-left:30px;padding-right:30px;box-sizing:border-box}
@media (max-width:767px){.obv-sec{padding:52px 0}.obv-sec.first{padding-top:30px}.obv-sec>.container{padding-left:22px;padding-right:22px}}
.obv-eyebrow{font-size:12px;letter-spacing:2px;text-transform:uppercase;font-weight:700;color:var(--obv-green);margin:0 0 12px}
.obv-h2{font-family:var(--obv-heading);font-size:40px;line-height:1.1;letter-spacing:-.01em;margin:0;color:#f4f7f1;font-weight:600}
.obv-h3{font-family:var(--obv-heading);font-size:20px;line-height:1.25;margin:0 0 8px;color:#f4f7f1;font-weight:600}
.obv-sub{font-size:18px;line-height:1.65;color:var(--obv-muted);margin:14px 0 0;max-width:720px}
.obv-head{max-width:820px;margin:0 0 36px}
.obv-head.center{margin-left:auto;margin-right:auto;text-align:center}
.obv-head.center .obv-sub{margin-left:auto;margin-right:auto}
.obv-p{font-size:17px;line-height:1.75;margin:0 0 14px;color:var(--obv-text)}
.obv-p:last-child{margin-bottom:0}
@media (max-width:767px){.obv-h2{font-size:30px}.obv-sub{font-size:16.5px}}
/* reveal */
/* visible by default (no JS = everything shown); hidden pre-reveal only when html.js is present */
.obv-reveal{transition:opacity .7s ease,transform .7s cubic-bezier(.2,.7,.2,1)}
.obv-reveal [data-stagger]{transition:opacity .6s ease,transform .6s cubic-bezier(.2,.7,.2,1)}
html.js .obv-reveal:not(.is-in){opacity:0;transform:translateY(18px)}
html.js .obv-reveal:not(.is-in) [data-stagger]{opacity:0;transform:translateY(14px)}
@media (prefers-reduced-motion:reduce){html.js .obv-reveal:not(.is-in),html.js .obv-reveal:not(.is-in) [data-stagger]{opacity:1;transform:none;transition:none}}
/* buttons */
.obv-actions{display:flex;flex-wrap:wrap;gap:14px;align-items:center;margin-top:28px}
.obv-btn-ghost{display:inline-flex;align-items:center;gap:10px;color:#f4f7f1;text-decoration:none;font-weight:600;font-size:16px;padding:14px 20px;border:1px solid rgba(255,255,255,.18);border-radius:58px;transition:border-color .2s,background .2s,transform .2s}
.obv-btn-ghost svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .2s}
.obv-btn-ghost:hover{border-color:var(--obv-green);background:rgba(211,237,5,.06)}
.obv-btn-ghost:hover svg{transform:translateX(3px)}
/* cards + grids */
.obv-grid{display:grid;gap:18px}
.obv-grid.c2{grid-template-columns:repeat(2,1fr)}
.obv-grid.c3{grid-template-columns:repeat(3,1fr)}
.obv-grid.c4{grid-template-columns:repeat(4,1fr)}
@media (max-width:991px){.obv-grid.c4,.obv-grid.c3{grid-template-columns:repeat(2,1fr)}}
@media (max-width:600px){.obv-grid.c4,.obv-grid.c3,.obv-grid.c2{grid-template-columns:1fr}}
.obv-card{position:relative;display:block;background:rgba(255,255,255,.03);border:1px solid var(--obv-line);border-radius:20px;padding:28px;color:inherit;text-decoration:none;transition:border-color .25s,transform .25s,background .25s}
.obv-card:hover{border-color:rgba(211,237,5,.5);transform:translateY(-3px);background:rgba(211,237,5,.035)}
.obv-card p{font-size:15.5px;line-height:1.65;margin:0;color:var(--obv-muted)}
.obv-card .obv-more{display:inline-flex;align-items:center;gap:6px;margin-top:16px;color:var(--obv-green);font-weight:600;font-size:14px}
.obv-card .obv-more svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .2s}
.obv-card:hover .obv-more svg{transform:translateX(3px)}
.obv-card.small{padding:20px 22px;display:flex;gap:14px;align-items:flex-start}
.obv-card.small .obv-h3{font-size:17px;margin-bottom:4px}
/* icons */
.obv-ico{width:56px;height:56px;border-radius:14px;display:flex;align-items:center;justify-content:center;background:rgba(211,237,5,.10);color:var(--obv-green);margin-bottom:18px}
.obv-ico svg{width:34px;height:34px}
.obv-card.small .obv-ico{width:40px;height:40px;flex:0 0 40px;margin:0;border-radius:10px}
.obv-card.small .obv-ico svg{width:24px;height:24px}
/* steps */
.obv-steps{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;counter-reset:s}
@media (max-width:991px){.obv-steps{grid-template-columns:repeat(2,1fr)}}
@media (max-width:600px){.obv-steps{grid-template-columns:1fr}}
.obv-step{background:rgba(255,255,255,.03);border:1px solid var(--obv-line);border-radius:18px;padding:24px}
.obv-step .n{display:block;font-family:var(--obv-heading);font-size:13px;font-weight:700;letter-spacing:2px;color:var(--obv-green);margin-bottom:12px}
.obv-step p{font-size:15px;line-height:1.6;margin:0;color:var(--obv-muted)}
/* badges */
.obv-badges{display:flex;flex-wrap:wrap;gap:10px;margin-top:26px}
.obv-badge{font-size:13px;font-weight:600;padding:8px 14px;border-radius:100px;border:1px solid rgba(211,237,5,.28);color:#eef2ec;background:rgba(211,237,5,.05)}
/* two-column feature */
.obv-split{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center}
@media (max-width:991px){.obv-split{grid-template-columns:1fr;gap:32px}}
.obv-panel{background:linear-gradient(135deg,rgba(211,237,5,.07),rgba(255,255,255,.02));border:1px solid rgba(211,237,5,.2);border-radius:22px;padding:32px}
/* checklist */
.obv-list{list-style:none;padding:0;margin:20px 0 0;display:grid;gap:12px}
.obv-list li{position:relative;padding-left:32px;font-size:16px;line-height:1.6;color:var(--obv-text)}
.obv-list li::before{content:"";position:absolute;left:0;top:4px;width:20px;height:20px;border-radius:50%;background:rgba(211,237,5,.14);border:1px solid rgba(211,237,5,.45)}
.obv-list li::after{content:"";position:absolute;left:6px;top:9px;width:7px;height:4px;border-left:2px solid var(--obv-green);border-bottom:2px solid var(--obv-green);transform:rotate(-45deg)}
/* founders strip */
.obv-founders-strip{display:grid;grid-template-columns:repeat(2,1fr);gap:18px}
@media (max-width:600px){.obv-founders-strip{grid-template-columns:1fr}}
.obv-fcard{display:flex;gap:18px;align-items:center;background:rgba(255,255,255,.03);border:1px solid var(--obv-line);border-radius:20px;padding:18px 20px}
.obv-fcard img{width:84px;height:84px;border-radius:16px;object-fit:cover;flex:0 0 84px;filter:saturate(.9)}
.obv-fcard .obv-h3{margin-bottom:2px}
.obv-fcard .role{font-size:13px;color:var(--obv-green);font-weight:600;margin:0 0 6px;letter-spacing:.3px}
.obv-fcard p{font-size:14.5px;line-height:1.55;color:var(--obv-muted);margin:0}
/* featured case */
.obv-case{display:grid;grid-template-columns:1.1fr .9fr;gap:0;overflow:hidden;border:1px solid var(--obv-line);border-radius:22px;background:rgba(255,255,255,.03)}
@media (max-width:900px){.obv-case{grid-template-columns:1fr}}
.obv-case-media{min-height:280px;background:#08141a center/cover no-repeat;position:relative}
.obv-case-media::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(3,14,20,0),rgba(3,14,20,.65))}
.obv-case-body{padding:34px}
/* blog reuse: keep Webflow classes but make cards a clean grid */
.obv-blog .blog-list{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
@media (max-width:991px){.obv-blog .blog-list{grid-template-columns:1fr 1fr}}
@media (max-width:600px){.obv-blog .blog-list{grid-template-columns:1fr}}
/* group (ReactiveZero + DGX) */
.obv-group .obv-card{padding:30px}
.obv-logo-rz{height:26px;width:auto;filter:grayscale(1) brightness(1.3);opacity:.75;margin-bottom:16px}
/* hero */
.obv-hero{padding:56px 0 40px}
@media (max-width:767px){.obv-hero{padding:30px 0 24px}}
.obv-hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:48px;align-items:center}
@media (max-width:991px){.obv-hero-grid{grid-template-columns:1fr;gap:34px}}
.obv-chip{display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--obv-green);background:rgba(211,237,5,.08);border:1px solid rgba(211,237,5,.25);border-radius:100px;padding:7px 14px;margin-bottom:22px}
.obv-chip i{width:8px;height:8px;border-radius:50%;background:var(--obv-green);box-shadow:0 0 0 0 rgba(211,237,5,.6);animation:obv-ping 2.2s infinite}
@keyframes obv-ping{0%{box-shadow:0 0 0 0 rgba(211,237,5,.55)}70%{box-shadow:0 0 0 10px rgba(211,237,5,0)}100%{box-shadow:0 0 0 0 rgba(211,237,5,0)}}
.obv-h1{font-family:var(--obv-heading);font-size:64px;line-height:1.05;letter-spacing:-.02em;margin:0;color:#fff;font-weight:600}
@media (max-width:991px){.obv-h1{font-size:48px}}
@media (max-width:600px){.obv-h1{font-size:38px}}
.obv-h1 em{font-style:normal;color:var(--obv-green)}
.obv-lead{font-size:19px;line-height:1.65;color:var(--obv-muted);margin:22px 0 0;max-width:600px}
.obv-hero-facts{display:flex;flex-wrap:wrap;gap:10px 22px;margin-top:26px;padding:0;list-style:none}
.obv-hero-facts li{font-size:14px;color:var(--obv-muted);display:flex;align-items:center;gap:8px}
.obv-hero-facts li::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--obv-green)}
/* about page */
.obv-founder{display:grid;grid-template-columns:320px 1fr;gap:40px;align-items:start;padding:34px;border:1px solid var(--obv-line);border-radius:22px;background:rgba(255,255,255,.03);margin-bottom:22px}
.obv-founder:last-child{border-bottom:1px solid var(--obv-line)}
@media (max-width:860px){.obv-founder{grid-template-columns:1fr;gap:22px;padding:22px}}
.obv-founder-photo{border-radius:22px;overflow:hidden;aspect-ratio:4/5;background:#08141a;border:1px solid var(--obv-line)}
.obv-founder-photo img{width:100%;height:100%;object-fit:cover;display:block}
.obv-founder .obv-h3{font-size:28px}
.obv-founder .role{color:var(--obv-green);font-weight:600;margin:4px 0 14px}
.obv-founder .certs{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 16px}
.obv-founder .certs span{font-size:12px;font-weight:700;letter-spacing:1px;padding:5px 10px;border-radius:6px;background:rgba(211,237,5,.12);color:var(--obv-green)}
.obv-linkedin{display:inline-flex;align-items:center;gap:8px;color:#fff;text-decoration:none;font-weight:600;font-size:14px;margin-top:14px;padding:9px 14px;border:1px solid rgba(255,255,255,.18);border-radius:100px;transition:border-color .2s,background .2s}
.obv-linkedin:hover{border-color:var(--obv-green);background:rgba(211,237,5,.06)}
.obv-linkedin b{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:3px;background:var(--obv-green);color:#0a0f0d;font-size:11px;font-weight:800}

/* == hero attack-path panel == */
.obv-ap-wrap{position:relative;border:1px solid rgba(255,255,255,.06);border-radius:12px;background:#04141c;overflow:hidden;box-shadow:0 30px 80px rgba(0,0,0,.45)}
.obv-ap{display:block;width:100%;height:auto;font-family:"Work Sans",sans-serif}
.obv-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.obv-ap .ap-edge{stroke:rgba(170,177,173,.25);stroke-width:1.5;stroke-dasharray:1;stroke-dashoffset:1;transition:stroke-dashoffset .6s ease,stroke .5s ease}
.obv-ap .ap-edge.is-on{stroke-dashoffset:0;stroke:#d3ed05}
.obv-ap .ap-edge.is-dead,.obv-ap .ap-edge.is-fixed{stroke-dashoffset:0;stroke:rgba(170,177,173,.25)}
.obv-ap .ap-dot{fill:#04141c;stroke:#6b7672;stroke-width:1.6;transition:stroke .4s ease,fill .4s ease}
.obv-ap .ap-glow{fill:#d3ed05;opacity:0;transition:opacity .5s ease}
.obv-ap .ap-ring{fill:none;stroke:#d3ed05;stroke-width:1.5;opacity:0;transform-box:fill-box;transform-origin:center}
.obv-ap .ap-node.is-on .ap-dot{stroke:#d3ed05}
.obv-ap .ap-node.is-on .ap-glow{opacity:.12}
.obv-ap .ap-node.is-on.big .ap-ring{animation:ap-pulse .9s ease-out 1 forwards}
@keyframes ap-pulse{0%{opacity:.6;transform:scale(1)}100%{opacity:0;transform:scale(2)}}
.obv-ap .ap-node.is-dead .ap-dot{stroke:#4a5350}
.obv-ap .ap-node.is-fixed .ap-dot{stroke:#5db934}
.obv-ap .ap-node.is-fixed .ap-glow{opacity:0}
.obv-ap .ap-check{fill:none;stroke:#5db934;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1;stroke-dashoffset:1;transition:stroke-dashoffset .45s ease .1s}
.obv-ap .ap-node.is-fixed .ap-check{stroke-dashoffset:0}
.obv-ap .ap-label{fill:#aab1ad;font-size:12px}
.obv-ap .ap-note{fill:#d3ed05;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;opacity:0;transition:opacity .4s ease}
.obv-ap .ap-node.is-on .ap-note{opacity:1}
.obv-ap .ap-node.is-dead .ap-note{opacity:1;fill:#8a948f}
.obv-ap .ap-node.is-fixed .ap-note{opacity:0}
.obv-ap .ap-marker{fill:#d3ed05;opacity:0;transition:transform .6s cubic-bezier(.4,0,.2,1),opacity .3s ease}
.obv-ap .ap-marker.is-on{opacity:1}
.obv-ap .ap-cap{fill:#aab1ad;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;opacity:0;transition:opacity .5s ease}
.obv-ap .ap-cap.is-on{opacity:1}
/* static state: default markup (no JS), reduced motion */
.obv-ap.is-static .ap-edge{stroke-dashoffset:0}
.obv-ap.is-static #e1w{stroke:rgba(170,177,173,.18)}
.obv-ap.is-static #nw .ap-dot{stroke:#4a5350}
.obv-ap.is-static #nw .ap-note{opacity:1;fill:#8a948f}
.obv-ap.is-static #n2 .ap-dot,.obv-ap.is-static #n3 .ap-dot,.obv-ap.is-static #n4 .ap-dot,.obv-ap.is-static #n5 .ap-dot{stroke:#5db934}
.obv-ap.is-static .ap-check{stroke-dashoffset:0}
.obv-ap.is-static #n2 .ap-note,.obv-ap.is-static #n3 .ap-note,.obv-ap.is-static #n4 .ap-note,.obv-ap.is-static #n5 .ap-note{opacity:1;fill:#aab1ad}
.obv-ap.is-static .ap-cap0{opacity:1}
.obv-ap.is-static .ap-marker,.obv-ap.is-static .ap-glow{opacity:0}
@media (prefers-reduced-motion:reduce){.obv-ap *{transition:none!important;animation:none!important}}
@media (max-width:991px){.obv-ap-wrap{max-width:560px;margin:0 auto}}
@media (max-width:767px){.obv-ap .ap-note,.obv-ap .ap-cap{display:none}.obv-ap .ap-label{font-size:15px}}

/* ===== Obventum service icons (final): shared ===== */
/* Root svg class is obv-ico-svg. The existing .obv-ico in obv-rethink.css is the tile wrapper and is never redefined here.
   Roles inside an icon: path with pathLength="1" = drawn on reveal; .obv-ico-x = static extra, fades in (no draw);
   .obv-ico-m = motion-only part (blip, ping): hidden until reveal, loop starts 1.1s after it, removed under reduced motion;
   circle with fill="currentColor" = node or point, pops in after its group has drawn.
   Reveal hook: obv-reveal.js adds .is-in to .obv-reveal. Draw-in and loops are keyed on an .is-in ancestor.
   An icon with no .obv-reveal ancestor renders complete and still.
   Hover hook: hover the svg itself, or give the card the class obv-ico-hover so hovering anywhere on it fires the icon's hover motion. */
.obv-ico-svg{display:block;overflow:visible}
.obv-ico-svg *{transform-box:fill-box;transform-origin:center}
.obv-ico-svg .obv-ico-m{visibility:hidden}
/* before reveal: strokes hidden, static extras and dots hidden */
html.js .obv-reveal:not(.is-in) .obv-ico-svg path:not(.obv-ico-x):not(.obv-ico-m){stroke-dasharray:1 2;stroke-dashoffset:1.2}
html.js .obv-reveal:not(.is-in) .obv-ico-svg .obv-ico-x,html.js .obv-reveal:not(.is-in) .obv-ico-svg circle{opacity:0}
/* on reveal: every path draws in the same .9s (pathLength=1), static extras fade, dots pop; groups stagger via --obv-ico-delay */
.is-in .obv-ico-svg path:not(.obv-ico-x):not(.obv-ico-m){stroke-dasharray:1 2;animation:obv-ico-draw .9s cubic-bezier(.4,0,.2,1) var(--obv-ico-delay,0s) both}
.is-in .obv-ico-svg .obv-ico-x{animation:obv-ico-fade .6s ease-out var(--obv-ico-delay,0s) both}
.is-in .obv-ico-svg circle{animation:obv-ico-pop .5s cubic-bezier(.2,.8,.3,1.2) calc(var(--obv-ico-delay,0s) + .5s) both}
.is-in .obv-ico-svg .obv-ico-m{visibility:visible}
@keyframes obv-ico-draw{from{stroke-dashoffset:1.2}to{stroke-dashoffset:0}}
@keyframes obv-ico-fade{from{opacity:0}}
@keyframes obv-ico-pop{from{opacity:0;transform:scale(.3)}}
/* reduced motion: everything complete and still; motion-only parts removed */
@media (prefers-reduced-motion:reduce){
  .obv-ico-svg,.obv-ico-svg *{animation:none!important;transition:none!important;transform:none!important}
  .obv-ico-svg path{stroke-dashoffset:0!important}
  .obv-ico-svg .obv-ico-x,.obv-ico-svg circle{opacity:1!important}
  .obv-ico-svg .obv-ico-m{display:none!important}
}
/* Integration (change in obv-rethink.css, not here): the tile currently sets .obv-ico svg to 34px. This set is drawn for 44 to 72px,
   so use a 64px tile with the svg at 44px, and a 40px tile with the svg at 28px for .obv-card.small. Colour comes from the tile's
   color: var(--obv-green). Add obv-ico-hover to the card. */
/* ===== Penetration Testing: open door, leaf swings, arrow strikes on hover ===== */
.obv-ico-pt .obv-ico-pt-leaf{--obv-ico-delay:.15s;transform-origin:left center}
.obv-ico-pt .obv-ico-pt-arrow{--obv-ico-delay:.45s}
.is-in .obv-ico-pt-leaf{animation:obv-ico-pt-swing 5s ease-in-out 1.2s infinite}
.obv-ico-svg:hover .obv-ico-pt-arrow-h,.obv-ico-hover:hover .obv-ico-pt-arrow-h{animation:obv-ico-pt-strike .7s cubic-bezier(.3,0,.2,1)}
@keyframes obv-ico-pt-swing{0%,100%{transform:scaleX(1)}50%{transform:scaleX(.78)}}
@keyframes obv-ico-pt-strike{0%,100%{transform:none}35%{transform:translateX(4px)}}
/* ===== Social Engineering: baited hook swings above a person, drops on hover ===== */
.obv-ico-se .obv-ico-se-rig{--obv-ico-delay:.2s;transform-origin:100% 0}
.obv-ico-se .obv-ico-se-rig-h{transform-origin:100% 0}
.obv-ico-se .obv-ico-se-bait{--obv-ico-delay:.45s}
.is-in .obv-ico-se-rig{animation:obv-ico-se-swing 3.6s ease-in-out 1.2s infinite}
.obv-ico-svg:hover .obv-ico-se-rig-h,.obv-ico-hover:hover .obv-ico-se-rig-h{animation:obv-ico-se-drop .8s cubic-bezier(.3,0,.2,1)}
@keyframes obv-ico-se-swing{0%,100%{transform:none}25%{transform:rotate(5deg)}75%{transform:rotate(-5deg)}}
@keyframes obv-ico-se-drop{0%,100%{transform:none}45%{transform:translateY(4px) rotate(-3deg)}}
/* ===== Reverse Engineering: chip with a lifted corner, corner drifts, lifts on hover ===== */
.obv-ico-re .obv-ico-re-pins{--obv-ico-delay:.2s}
.obv-ico-re .obv-ico-re-code{--obv-ico-delay:.4s}
.obv-ico-re .obv-ico-re-lid{--obv-ico-delay:.55s}
.obv-ico-re .obv-ico-re-lid-h{transition:transform .5s cubic-bezier(.34,1.56,.64,1)}
.is-in .obv-ico-re-lid{animation:obv-ico-re-drift 2.8s ease-in-out 1.2s infinite alternate}
.obv-ico-svg:hover .obv-ico-re-lid-h,.obv-ico-hover:hover .obv-ico-re-lid-h{transform:translate(3px,-3px)}
@keyframes obv-ico-re-drift{from{transform:none}to{transform:translate(2px,-2px)}}
/* ===== Red Teaming: route through the perimeter to the flag, blip runs the route, flag waves on hover ===== */
.obv-ico-rt .obv-ico-rt-route{--obv-ico-delay:.1s}
.obv-ico-rt .obv-ico-rt-pole{--obv-ico-delay:.35s}
.obv-ico-rt .obv-ico-rt-flag{--obv-ico-delay:.5s;transform-origin:0 50%}
.obv-ico-rt .obv-ico-rt-blip{stroke-dasharray:.6 100;stroke-dashoffset:100;stroke-opacity:.95}
.is-in .obv-ico-rt-blip{animation:obv-ico-rt-run 3.6s linear 1.1s infinite backwards}
.obv-ico-svg:hover .obv-ico-rt-flag,.obv-ico-hover:hover .obv-ico-rt-flag{animation:obv-ico-rt-wave 1s ease-in-out 2}
@keyframes obv-ico-rt-run{0%{stroke-dashoffset:100;opacity:0}6%{opacity:1}74%{opacity:1}78%,100%{stroke-dashoffset:0;opacity:0}}
@keyframes obv-ico-rt-wave{0%,100%{transform:none}25%{transform:skewY(-6deg)}75%{transform:skewY(5deg)}}
/* ===== Secure Code Review: lens reads the code line by line, zooms on hover ===== */
.obv-ico-scr .obv-ico-scr-glass{--obv-ico-delay:.3s}
.obv-ico-scr .obv-ico-scr-check{--obv-ico-delay:.65s}
.is-in .obv-ico-scr-glass{animation:obv-ico-scr-read 4s ease-in-out 1.4s infinite}
.obv-ico-svg:hover .obv-ico-scr-glass-h,.obv-ico-hover:hover .obv-ico-scr-glass-h{animation:obv-ico-scr-zoom .8s ease-in-out}
@keyframes obv-ico-scr-read{0%,15%,100%{transform:none}50%,65%{transform:translateY(10px)}}
@keyframes obv-ico-scr-zoom{0%,100%{transform:none}50%{transform:scale(1.08)}}
/* ===== OSINT: found point pings inside the lens, magnifier zooms on hover ===== */
.obv-ico-os .obv-ico-os-globe{--obv-ico-delay:.15s}
.obv-ico-os .obv-ico-os-handle{--obv-ico-delay:.35s}
.is-in .obv-ico-os-ping{animation:obv-ico-os-ping 2.4s cubic-bezier(.2,.6,.3,1) 1.1s infinite backwards}
.obv-ico-svg:hover .obv-ico-os-mag,.obv-ico-hover:hover .obv-ico-os-mag{animation:obv-ico-os-zoom .8s ease-in-out}
@keyframes obv-ico-os-ping{0%{transform:scale(.4);opacity:0}10%{opacity:1}55%{opacity:.45}80%,100%{transform:scale(1.9);opacity:0}}
@keyframes obv-ico-os-zoom{0%,100%{transform:none}50%{transform:scale(1.08)}}
/* == homepage sections == */
.obv-hero-note{font-size:14px;color:var(--obv-muted);margin:16px 0 0}
.obv-hero-panel{position:relative;z-index:2}
.obv-hero{overflow:visible}
.obv-hero .hero-background{z-index:0;opacity:.9;top:-100px;height:calc(100% + 100px)}
.obv-hero>.container{position:relative;z-index:2}
.obv-ico{width:64px;height:64px;border-radius:16px}
.obv-ico svg{width:44px;height:44px}
.obv-card.small .obv-ico{width:44px;height:44px;flex:0 0 44px;border-radius:11px}
.obv-card.small .obv-ico svg{width:30px;height:30px}
.obv-svc{display:flex;flex-direction:column}
.obv-svc .obv-more{margin-top:auto;padding-top:16px}
@media (max-width:600px){.obv-svc{align-items:center;text-align:center}.obv-svc .obv-ico{margin-left:auto;margin-right:auto}.obv-svc .obv-more{align-self:center}}
.obv-minor-label{margin:34px 0 12px}
.obv-rail{list-style:none;padding:0;margin:0;position:relative;display:grid;grid-template-columns:repeat(6,1fr);gap:14px}
.obv-rail::before{content:"";position:absolute;left:12px;right:calc(16.66% - 2px);top:12px;height:2px;background:rgba(211,237,5,.35);transform:scaleX(0);transform-origin:left;transition:transform 1.2s cubic-bezier(.2,.7,.2,1)}
@media (max-width:1199px){.obv-rail{grid-template-columns:repeat(3,1fr);row-gap:22px}.obv-rail::before{display:none}}
.is-in .obv-rail::before{transform:scaleX(1)}
.obv-rail .obv-step{padding-top:34px;background:transparent;border:0;position:relative}
.obv-rail .obv-step::before{content:"";position:absolute;left:12px;top:6px;width:14px;height:14px;border-radius:50%;background:#04141c;border:2px solid var(--obv-green);transition:background .3s ease}
.is-in .obv-rail .obv-step::before{background:var(--obv-green);transition-delay:calc(var(--i,0) * .15s + .2s)}
.obv-rail .obv-step .n{margin-bottom:6px}
.obv-rail .obv-step h3{font-size:16px;margin:0 0 6px}
@media (max-width:991px){.obv-rail{grid-template-columns:repeat(3,1fr)}.obv-rail::before{display:none}}
@media (max-width:600px){.obv-rail{grid-template-columns:1fr;gap:6px}.obv-rail .obv-step{padding:10px 0 10px 36px}.obv-rail .obv-step::before{top:14px}}
.obv-promise{background:var(--obv-panel);border:1px solid var(--obv-line);border-radius:22px;padding:30px}
.obv-promise .obv-ico{width:48px;height:48px;border-radius:12px;margin-bottom:14px}
.obv-promise .obv-ico svg{width:26px;height:26px}
.obv-list li{transition:opacity .5s ease,transform .5s ease}
html.js .obv-reveal:not(.is-in) .obv-list li{opacity:0;transform:translateX(-6px)}
.is-in .obv-list li{transition-delay:calc(var(--i,0) * 60ms + .15s)}
.obv-center{display:flex;justify-content:center;margin-top:34px}
.obv-founders-lead{max-width:760px;margin-bottom:28px}
.obv-fcard .obv-linkedin{margin-top:8px;padding:6px 10px;font-size:13px}
.obv-fcard img{transition:clip-path .6s ease-out,opacity .4s ease}
.obv-founders-strip .obv-fcard:nth-child(1) img{object-position:50% 18%}
.obv-founders-strip .obv-fcard:nth-child(2) img{object-position:50% 26%}
.obv-group{border-bottom:0}
.obv-group + .cta-section{padding-top:72px}
html.js .obv-reveal:not(.is-in) .obv-fcard img{opacity:0;clip-path:inset(100% 0 0 0)}
.obv-case-link{display:block;color:inherit;text-decoration:none}
.obv-case-media{background-image:url(/assets/img/svc-penetration-testing.svg);background-position:73% 50%}
@media (max-width:600px){.obv-case-media{min-height:210px;background-position:73% 50%}}
@media (max-width:600px){.obv-chip{font-size:11.5px;padding:6px 12px;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;letter-spacing:-.01em;gap:7px}.obv-chip i{flex:0 0 8px}}
.obv-case-body .obv-more{display:inline-flex;align-items:center;gap:6px;margin-top:16px;color:var(--obv-green);font-weight:600;font-size:14px}
.obv-case-body .obv-more svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .2s}
.obv-case-link:hover .obv-case{border-color:rgba(211,237,5,.5)}
.obv-case-link:hover .obv-more svg{transform:translateX(4px)}
.obv-blog-head{display:flex;justify-content:space-between;align-items:flex-end;gap:20px;flex-wrap:wrap}
.obv-blog .single-blog{height:100%}
.obv-blog .blog-thumbnail{transition:transform .35s ease}
.obv-blog .single-blog:hover .blog-thumbnail{transform:scale(1.03)}
.obv-group{padding:54px 0;border-top:1px solid var(--obv-line);background:var(--obv-panel)}
.obv-group .obv-h2{font-size:30px}
.obv-group .obv-p{font-size:16px}
.obv-group-links{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-top:22px;max-width:760px}
@media (max-width:600px){.obv-group-links{grid-template-columns:1fr}}
.obv-ext{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;margin-left:auto;color:var(--obv-muted);flex:0 0 16px}
.obv-tag{display:inline-block;font-size:11px;font-weight:700;letter-spacing:1px;text-transform:uppercase;padding:3px 8px;border-radius:6px;background:rgba(93,185,52,.15);color:#7dd45b;margin-left:8px;vertical-align:middle}
.obv-cta-direct{margin:18px 0 0;font-size:15px;color:var(--obv-muted)}
.obv-cta-direct a{color:#fff;text-decoration:none;border-bottom:1px solid rgba(255,255,255,.25)}
.obv-cta-direct a:hover{border-bottom-color:var(--obv-green)}
.obv-standards{margin-top:30px}
.obv-card:focus-visible,.obv-case-link:focus-visible,.obv-btn-ghost:focus-visible,.obv-linkedin:focus-visible,.obv-textlink:focus-visible,.button-style-01:focus-visible,.blog-button:focus-visible,.blog-title:focus-visible{outline:2px solid var(--obv-green);outline-offset:3px}
.obv-sec.first .obv-h1{font-size:52px}
@media (max-width:991px){.obv-sec.first .obv-h1{font-size:44px}}
@media (max-width:600px){.obv-sec.first .obv-h1{font-size:34px}}
.obv-hero-caption{font-size:12.5px;color:var(--obv-muted);margin:10px 4px 0;text-align:center}
@media (max-width:767px){.obv-hero-caption{color:#e6ebe3;font-size:13px}}

/* == about page == */
.obv-about-hero .obv-h1{font-size:56px}
@media (max-width:991px){.obv-about-hero .obv-h1{font-size:44px}}
@media (max-width:600px){.obv-about-hero .obv-h1{font-size:34px}}
.obv-about-hero .obv-lead{max-width:none}
/* desktop: photo spans the full row height so photo and text edges align; mobile keeps the 4:5 box */
@media (min-width:861px){.obv-founder{align-items:stretch}.obv-founder-photo{aspect-ratio:auto;height:100%;min-height:400px}.obv-founder-photo img{object-position:50% 22%}}
.obv-about-intro{max-width:760px;margin-top:22px}
.obv-inline-link{color:var(--obv-green);text-decoration:none;border-bottom:1px solid rgba(211,237,5,.45)}
.obv-inline-link:hover{border-bottom-color:var(--obv-green)}
.obv-founders{margin-top:10px}
.obv-founder .obv-h3{font-size:30px;position:relative;display:inline-block;padding-bottom:6px}
.obv-founder .obv-h3::after{content:"";position:absolute;left:0;bottom:0;height:2px;width:100%;background:var(--obv-green);transform-origin:left;transition:transform .5s ease .25s}
html.js .obv-founder.obv-reveal:not(.is-in) .obv-h3::after{transform:scaleX(0)}
.obv-founder .obv-founder-photo{width:100% !important;max-width:100% !important;flex:none}
.obv-founder.reverse .obv-founder-photo{justify-self:end}
.obv-founder-photo img{transition:clip-path .7s ease-out}
html.js .obv-founder.obv-reveal:not(.is-in) .obv-founder-photo img{clip-path:inset(100% 0 0 0)}
.obv-founder.reverse{grid-template-columns:1fr 320px}
.obv-founder.reverse .obv-founder-photo{order:2}
@media (max-width:860px){.obv-founder.reverse{grid-template-columns:1fr}.obv-founder.reverse .obv-founder-photo{order:0}}
.obv-founder .obv-p{font-size:16.5px}
.obv-textlink{display:inline-flex;align-items:center;gap:8px;color:var(--obv-green);font-weight:600;text-decoration:none;margin-top:14px}
.obv-textlink svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .2s}
.obv-textlink:hover svg{transform:translateX(4px)}
.obv-founder-body .obv-textlink{margin-left:22px}
@media (max-width:860px){.obv-founder-body .obv-textlink{margin-left:0;display:flex;width:max-content;margin-top:14px}}
.obv-how6{display:grid;grid-template-columns:repeat(6,1fr);gap:16px;margin-top:30px}
.obv-how6 .obv-card{grid-column:span 2}
.obv-how6 .obv-card:nth-child(4),.obv-how6 .obv-card:nth-child(5){grid-column:span 3}
@media (max-width:991px){.obv-how6{grid-template-columns:1fr 1fr}.obv-how6 .obv-card,.obv-how6 .obv-card:nth-child(4),.obv-how6 .obv-card:nth-child(5){grid-column:span 1}}
@media (max-width:600px){.obv-how6{grid-template-columns:1fr}}
.obv-how6 .obv-card{position:relative;overflow:hidden}
.obv-how6 .obv-card::before{content:"";position:absolute;left:0;top:0;height:2px;width:100%;background:var(--obv-green);transform:scaleX(0);transform-origin:left;transition:transform .2s ease}
.obv-how6 .obv-card:hover::before{transform:scaleX(1)}
.obv-how6 .idx{display:block;font-size:12px;letter-spacing:2px;color:var(--obv-muted);font-weight:700;margin-bottom:10px}
.obv-how6 .obv-ico{width:44px;height:44px;border-radius:11px;margin-bottom:14px}
.obv-how6 .obv-ico svg{width:24px;height:24px}
.obv-track{display:grid;grid-template-columns:1fr 1.2fr;gap:48px;align-items:start}
@media (max-width:860px){.obv-track{grid-template-columns:1fr;gap:20px}}
.obv-rule{display:block;width:44px;height:2px;background:var(--obv-green);margin-bottom:18px;transform-origin:left;transition:transform .4s ease .1s}
html.js .obv-reveal:not(.is-in) .obv-rule{transform:scaleX(0)}
.obv-disclosure{max-width:68ch;margin:0 auto;background:var(--obv-panel);border-left:2px solid var(--obv-green);border-radius:16px;padding:40px}
@media (max-width:600px){.obv-disclosure{padding:26px 22px}}
.obv-disclosure .obv-p{font-size:16.5px;line-height:1.8}
.obv-rz{display:grid;grid-template-columns:1.2fr .8fr;gap:40px;align-items:center;background:var(--obv-panel);border:1px solid var(--obv-line);border-radius:22px;padding:36px}
@media (max-width:860px){.obv-rz{grid-template-columns:1fr;padding:26px 22px}}
.obv-rz-links{display:grid;gap:12px}
.obv-rz-links .obv-card{display:flex;align-items:center;gap:14px;padding:18px 20px}
.obv-rz-links .dom{font-size:12px;color:var(--obv-muted);margin:0 0 3px;letter-spacing:.3px}
.obv-rz-links .obv-card p{color:#fff;font-weight:600;font-size:15px}
.obv-dgx{display:grid;grid-template-columns:1fr 1fr;gap:4px;width:30px;flex:0 0 30px}
.obv-dgx i{display:block;height:13px;border-radius:3px;background:var(--obv-green);transition:opacity .4s ease}
html.js .obv-reveal:not(.is-in) .obv-dgx i{opacity:.3}
.is-in .obv-dgx i:nth-child(2){transition-delay:.12s}.is-in .obv-dgx i:nth-child(3){transition-delay:.24s}.is-in .obv-dgx i:nth-child(4){transition-delay:.36s}
.obv-rz .obv-logo-rz{height:20px;margin:0}
