/* ============================================================
   Yardly — public site design system: "Meridian"
   ------------------------------------------------------------
   Loaded only by the marketing pages (index.html, funkciok.html,
   funkcio-*.html), always AFTER styles.css — so everything here may
   safely override the app's shared component styles without touching
   the logged-in product.

   Direction: cool near-white ground, deep navy acts, one teal brand
   colour. Structured corporate grid, large display type, photography
   in full-bleed bands, cards that differ by role rather than repeating
   one rounded box.
   ============================================================ */

.mkt{
  /* ---------- ground & ink ---------- */
  --ground:#F8FAFC;
  --ground-2:#EEF2F6;
  --card:#FFFFFF;
  --ink:#0A1A2B;
  --ink-2:#12293F;
  --deep:#123A5C;
  --deep-2:#0D2B45;

  /* ---------- brand ----------
     One teal carries the whole brand, because it is legible as both a surface
     and as text: 6.1:1 on white, 5.5:1 on the grey ground, 5.3:1 on the tint —
     so eyebrows, links, icons and button fills can all share it instead of
     needing the three-way split a saturated warm accent forced. On the dark
     acts the ground flips and --brand-light takes over (9.9:1 on --ink). */
  --brand:#0E6E66;
  --brand-deep:#0B554F;
  --brand-light:#5FD4C4;
  --tint:#E4F2EF;

  /* ---------- semantic status (used by the UI mocks) ----------
     Deliberately outside the brand hue, so "expiring" never reads as "brand". */
  --st-crit:#D92D20;  --st-crit-bg:#FEF3F2;  --st-crit-tx:#B42318;
  --st-warn:#DC6803;  --st-warn-bg:#FFFAEB;  --st-warn-tx:#B54708;
  --st-ok:#079455;    --st-ok-bg:#ECFDF3;    --st-ok-tx:#067647;

  /* ---------- text ---------- */
  --tx:#0A1A2B;
  --tx-soft:#42546B;
  --tx-mute:#5B6B7F;
  --on-ink:#F2F5F8;
  --on-ink-soft:#A8B6C6;

  /* ---------- lines ---------- */
  --hair:rgba(10,26,43,.12);
  --hair-strong:rgba(10,26,43,.24);
  --hair-on-ink:rgba(242,245,248,.16);

  --shell:1240px;
  --gutter:clamp(20px,5vw,64px);

  --font-display:'Bricolage Grotesque','Instrument Sans',system-ui,sans-serif;
  --font-body:'Instrument Sans','Inter',system-ui,sans-serif;
  --font-mono:'IBM Plex Mono',ui-monospace,SFMono-Regular,monospace;

  --ease:cubic-bezier(.22,1,.36,1);
  --ease-io:cubic-bezier(.65,0,.35,1);
}

/* ============================================================
   Base
   ============================================================ */
body.mkt{background:var(--ground);color:var(--tx);font-family:var(--font-body);
  font-size:17px;line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden;}
.mkt *,.mkt *::before,.mkt *::after{box-sizing:border-box;}
.mkt img{max-width:100%;display:block;}

.mkt .wrap{width:100%;max-width:var(--shell);margin:0 auto;padding-inline:var(--gutter);}

.mkt h1,.mkt h2,.mkt h3,.mkt h4{font-family:var(--font-display);font-weight:700;
  letter-spacing:-0.035em;line-height:1.0;color:inherit;text-wrap:balance;}

/* Display scale — the page's whole personality lives here. */
/* Sized against the hero's ~half-width column, not the viewport — at 8vw the
   Hungarian compounds ("határidő", "csúszhat") each claimed their own line. */
.mkt .d1{font-size:clamp(42px,5.6vw,84px);line-height:.94;letter-spacing:-0.042em;font-weight:800;}
.mkt .d2{font-size:clamp(32px,4.8vw,64px);line-height:1.02;letter-spacing:-0.035em;}
.mkt .d3{font-size:clamp(23px,2.4vw,32px);line-height:1.12;letter-spacing:-0.025em;}
.mkt .lead{font-size:clamp(17px,1.5vw,20px);line-height:1.62;color:var(--tx-soft);max-width:56ch;}

.mkt .eyebrow{font-family:var(--font-mono);font-size:11.5px;font-weight:500;text-transform:uppercase;
  letter-spacing:.2em;color:var(--brand);display:inline-flex;align-items:center;gap:9px;}
.mkt .eyebrow::before{content:"";width:22px;height:1px;background:currentColor;opacity:.55;}

/* Brand-marked words inside a display heading. */
.mkt .mark{color:var(--brand);}
.mkt .quiet{color:var(--tx-mute);}

/* ============================================================
   Acts — full-bleed bands. Ground / ink / deep alternate.
   ============================================================ */
.mkt .act{position:relative;padding-block:clamp(88px,11vw,168px);}
.mkt .act-ground2{background:var(--ground-2);}
.mkt .act-ink{background:var(--ink);color:var(--on-ink);}
.mkt .act-ink h1,.mkt .act-ink h2,.mkt .act-ink h3{color:var(--on-ink);}
.mkt .act-ink .lead{color:var(--on-ink-soft);}
.mkt .act-deep{background:var(--deep);color:var(--on-ink);}
.mkt .act-deep h2,.mkt .act-deep h3{color:var(--on-ink);}
.mkt .act-deep .lead{color:rgba(242,245,248,.76);}
/* On the dark acts the ground flips, so the light teal is the readable one
   (9.9:1) and --brand would sink into the background. */
.mkt .act-ink .eyebrow{color:var(--brand-light);}
.mkt .act-deep .eyebrow{color:var(--brand-light);}

/* Section head: eyebrow + heading, left-aligned by default (not centered).
   The measure is set per child, not on the flex column — a max-width on the
   column would clamp the paragraph to the heading's much tighter measure. */
.mkt .act-head{display:flex;flex-direction:column;align-items:flex-start;gap:18px;}
.mkt .act-head h2{max-width:15ch;}
.mkt .act-head.wide h2{max-width:22ch;}
.mkt .act-head .lead{margin-top:2px;max-width:54ch;}

/* ============================================================
   Buttons — override the app's shared .btn for the public site.
   Square-cornered and solid, not the app's pill.
   ============================================================ */
.mkt .btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;
  height:54px;padding:0 28px;border-radius:4px;border:1px solid transparent;
  font-family:var(--font-body);font-size:16px;font-weight:600;letter-spacing:-0.01em;
  cursor:pointer;white-space:nowrap;position:relative;overflow:hidden;
  transition:transform .35s var(--ease),background .35s var(--ease),color .35s var(--ease),border-color .35s var(--ease);}
.mkt .btn-sm{height:44px;padding:0 20px;font-size:15px;}
/* White on --brand measures 6.1:1, so the primary button needs no special
   casing the way the previous warm accent did; hover simply deepens. */
.mkt .btn-primary{background:var(--brand);color:#fff;box-shadow:0 1px 0 rgba(10,26,43,.06);}
.mkt .btn-primary:hover{background:var(--brand-deep);transform:translateY(-2px);}
.mkt .btn-secondary,.mkt .btn-ghost{background:transparent;color:var(--tx);border-color:var(--hair-strong);}
.mkt .btn-secondary:hover,.mkt .btn-ghost:hover{border-color:var(--ink);background:rgba(10,26,43,.04);transform:translateY(-2px);}
.mkt .act-ink .btn-secondary,.mkt .act-deep .btn-secondary{color:var(--on-ink);border-color:var(--hair-on-ink);}
.mkt .act-ink .btn-secondary:hover,.mkt .act-deep .btn-secondary:hover{background:rgba(242,245,248,.09);border-color:var(--on-ink);}
.mkt .btn .btn-arrow,.mkt .mega-footer .btn-arrow{display:inline-block;transition:transform .35s var(--ease);}
.mkt .btn:hover .btn-arrow,.mkt .mega-footer:hover .btn-arrow{transform:translateX(4px);}
.mkt .btn-block{width:100%;}

.mkt .cta-row{display:flex;flex-wrap:wrap;gap:14px;align-items:center;}

/* Text link with a rule that grows on hover. */
.mkt .tlink{display:inline-flex;align-items:center;gap:8px;font-weight:600;color:var(--brand);
  position:relative;padding-bottom:2px;}
.mkt .tlink::after{content:"";position:absolute;left:0;bottom:0;height:1px;width:100%;
  background:currentColor;transform:scaleX(0);transform-origin:right;transition:transform .45s var(--ease);}
.mkt .tlink:hover::after{transform:scaleX(1);transform-origin:left;}

/* ============================================================
   Nav — floating, becomes a solid rail once scrolled.
   Class names come from marketing-nav.js; do not rename.
   ============================================================ */
/* The scrolled bar's surface belongs on <nav>, which is already full-bleed
   (fixed, left:0, right:0). It must NOT go on .nav-inner: that element is also
   a .wrap, so it is centred by `margin:0 auto`, and any margin-inline set on it
   to fake a full-bleed background replaces that auto and kicks the whole header
   to the left mid-scroll. */
.mkt nav{position:fixed;top:0;left:0;right:0;z-index:120;padding-top:14px;
  border-bottom:1px solid transparent;
  transition:padding .45s var(--ease),background .45s var(--ease),
    border-color .45s var(--ease),box-shadow .45s var(--ease),backdrop-filter .45s var(--ease);}
.mkt nav.scrolled{padding-top:0;background:rgba(248,250,252,.88);
  backdrop-filter:blur(14px) saturate(1.6);
  border-bottom-color:var(--hair);box-shadow:0 1px 0 rgba(10,26,43,.04);}
.mkt .nav-inner{display:flex;align-items:center;gap:28px;height:64px;}

.mkt .logo{display:flex;align-items:center;gap:10px;flex-shrink:0;}
.mkt .logo-img{display:block;height:28px;width:auto;}

.mkt .nav-links{display:flex;align-items:center;gap:4px;margin-left:8px;}
.mkt .nav-links > a,.mkt .mega-trigger{display:inline-flex;align-items:center;gap:6px;
  padding:9px 13px;border-radius:5px;font-size:15px;font-weight:500;color:var(--tx-soft);
  background:none;border:none;cursor:pointer;font-family:var(--font-body);
  transition:color .25s var(--ease),background .25s var(--ease);}
.mkt .nav-links > a:hover,.mkt .mega-trigger:hover{color:var(--tx);background:rgba(16,20,24,.05);}
/* Static on purpose: the panel is centred on the VIEWPORT, not on the trigger.
   The "Funkciók" button sits near the left of the rail, so anchoring an
   880px panel to it pushed the panel off the left edge of the screen once the
   menu grew to eight groups. Leaving .has-mega unpositioned makes the fixed
   <nav> the containing block, so left:50% means the middle of the window. */
.mkt .has-mega{position:static;}
.mkt .mega-chevron{transition:transform .35s var(--ease);}
.mkt [aria-expanded="true"] .mega-chevron{transform:rotate(180deg);}

.mkt .mega-panel{position:absolute;top:calc(100% + 8px);left:50%;transform:translate(-50%,8px);
  width:min(900px,92vw);max-height:calc(100vh - 110px);overflow-y:auto;
  background:var(--ground);border:1px solid var(--hair);border-radius:10px;
  box-shadow:0 30px 70px -24px rgba(16,20,24,.28);padding:14px;opacity:0;visibility:hidden;
  transition:opacity .3s var(--ease),transform .3s var(--ease),visibility .3s;}
.mkt .mega-panel.open{opacity:1;visibility:visible;transform:translate(-50%,0);}
.mkt .mega-grid{display:grid;grid-template-columns:1fr 1fr;gap:4px;}
.mkt .mega-item{display:flex;gap:13px;padding:14px;border-radius:8px;transition:background .25s var(--ease);}
.mkt .mega-item-body{display:flex;flex-direction:column;}
.mkt .mega-item:hover{background:var(--ground-2);}
.mkt .mega-item-icon{width:36px;height:36px;border-radius:8px;background:var(--tint);color:var(--brand);
  display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.mkt .mega-item-title{font-weight:600;font-size:15px;margin-bottom:2px;}
.mkt .mega-item-desc{font-size:13.5px;color:var(--tx-mute);line-height:1.45;}
.mkt .mega-footer{margin-top:6px;padding:14px;border-top:1px solid var(--hair);
  display:flex;justify-content:space-between;align-items:center;font-weight:600;font-size:14.5px;color:var(--brand);}

.mkt .nav-cta{margin-left:auto;display:flex;align-items:center;gap:8px;flex-shrink:0;}
.mkt .ghost-link{font-size:15px;font-weight:500;color:var(--tx-soft);padding:9px 13px;border-radius:5px;
  transition:color .25s var(--ease),background .25s var(--ease);}
.mkt .ghost-link:hover{color:var(--tx);background:rgba(16,20,24,.05);}
.mkt .nav-burger{display:none;width:44px;height:44px;border:1px solid var(--hair-strong);border-radius:6px;
  background:none;cursor:pointer;align-items:center;justify-content:center;color:var(--tx);position:relative;}
/* The burger's single <span> plus its two pseudo-elements make the three bars. */
.mkt .nav-burger span,.mkt .nav-burger span::before,.mkt .nav-burger span::after{
  display:block;width:18px;height:1.5px;background:currentColor;border-radius:2px;}
.mkt .nav-burger span::before,.mkt .nav-burger span::after{content:"";position:absolute;left:13px;}
.mkt .nav-burger span::before{top:15px;}
.mkt .nav-burger span::after{bottom:15px;}

.mkt .mobile-menu{display:none;}
.mkt .mobile-actions{display:flex;flex-direction:column;gap:8px;padding:10px 4px 4px;margin-top:6px;
  border-top:1px solid var(--hair);}

/* ============================================================
   HERO
   ============================================================ */
.mkt .hero{position:relative;padding-top:clamp(140px,17vw,210px);padding-bottom:clamp(70px,9vw,120px);
  overflow:hidden;}
/* Warm bloom behind the type, cool counter-bloom low right. Both fade to their
   own rgb at 0 alpha so they never leave a grey ghost on the paper ground. */
.mkt .hero::before{content:"";position:absolute;top:-18%;left:-12%;width:78vw;height:78vw;max-width:1000px;max-height:1000px;
  background:radial-gradient(circle,rgba(14,110,102,.10) 0%,rgba(14,110,102,0) 70%);pointer-events:none;}
.mkt .hero::after{content:"";position:absolute;bottom:-30%;right:-14%;width:70vw;height:70vw;max-width:900px;max-height:900px;
  background:radial-gradient(circle,rgba(18,58,92,.10) 0%,rgba(18,58,92,0) 70%);pointer-events:none;}
.mkt .hero .wrap{position:relative;z-index:1;}

.mkt .hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(32px,5vw,72px);align-items:stretch;}
.mkt .hero-copy{display:flex;flex-direction:column;gap:26px;align-items:flex-start;justify-content:center;}
.mkt .hero h1{max-width:15ch;}
.mkt .hero .lead{max-width:46ch;}
.mkt .hero-note{display:flex;flex-wrap:wrap;gap:8px 22px;font-size:14px;color:var(--tx-mute);}
.mkt .hero-note span{display:inline-flex;align-items:center;gap:7px;}
.mkt .hero-note svg{color:var(--brand);flex-shrink:0;}

/* ---------- hero product visual: an abstract "deadline board" ---------- */
.mkt .stage{position:relative;}
.mkt .board{background:var(--card);border:1px solid var(--hair);border-radius:10px;
  box-shadow:0 40px 80px -40px rgba(16,20,24,.35),0 2px 6px rgba(16,20,24,.05);overflow:hidden;}
.mkt .board-bar{display:flex;align-items:center;gap:8px;padding:13px 16px;border-bottom:1px solid var(--hair);
  background:var(--ground);}
.mkt .board-bar i{width:9px;height:9px;border-radius:50%;background:var(--hair-strong);display:block;}
.mkt .board-bar b{font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--tx-mute);
  letter-spacing:.1em;text-transform:uppercase;margin-left:6px;}
.mkt .board-body{padding:8px;}

.mkt .rowitem{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:13px;
  padding:13px 12px;border-radius:8px;transition:background .3s var(--ease);}
.mkt .rowitem + .rowitem{border-top:1px solid var(--hair);}
.mkt .rowitem:hover{background:var(--ground);}
.mkt .rowitem .dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
.mkt .rowitem .t{display:block;font-weight:600;font-size:14.5px;letter-spacing:-0.01em;}
.mkt .rowitem .s{display:block;font-size:12.5px;color:var(--tx-mute);margin-top:1px;}
.mkt .rowitem .when{font-family:var(--font-mono);font-size:12px;font-weight:500;padding:5px 9px;border-radius:5px;
  white-space:nowrap;}
.mkt .is-late .dot{background:var(--st-crit);}
.mkt .is-late .when{background:var(--st-crit-bg);color:var(--st-crit-tx);}
.mkt .is-soon .dot{background:var(--st-warn);}
.mkt .is-soon .when{background:var(--st-warn-bg);color:var(--st-warn-tx);}
.mkt .is-ok .dot{background:var(--st-ok);}
.mkt .is-ok .when{background:var(--st-ok-bg);color:var(--st-ok-tx);}

/* floating alert card overlapping the board */
.mkt .float-card{position:absolute;right:-6%;bottom:-8%;width:min(280px,74%);background:var(--ink);color:var(--on-ink);
  border-radius:10px;padding:16px 18px;box-shadow:0 30px 60px -22px rgba(16,20,24,.55);}
.mkt .float-card .fc-h{display:flex;align-items:center;gap:9px;font-family:var(--font-mono);font-size:10.5px;
  text-transform:uppercase;letter-spacing:.16em;color:var(--tint);margin-bottom:9px;}
.mkt .float-card .fc-b{font-size:14.5px;line-height:1.45;color:var(--on-ink);}
.mkt .float-card .fc-b b{color:var(--brand-light);}
.mkt .pulse{width:7px;height:7px;border-radius:50%;background:var(--brand-light);box-shadow:0 0 0 0 rgba(95,212,196,.6);
  animation:pulse 2.4s infinite;}
@keyframes pulse{70%{box-shadow:0 0 0 11px rgba(95,212,196,0);}100%{box-shadow:0 0 0 0 rgba(95,212,196,0);}}

/* ============================================================
   Trust strip
   ============================================================ */
.mkt .trust{padding-block:clamp(28px,4vw,44px);border-block:1px solid var(--hair);}
.mkt .trust-in{display:flex;align-items:center;gap:clamp(20px,4vw,52px);flex-wrap:wrap;}
.mkt .trust-label{font-family:var(--font-mono);font-size:11px;text-transform:uppercase;letter-spacing:.16em;
  color:var(--tx-mute);}
.mkt .trust-stats{display:flex;gap:clamp(20px,4vw,52px);flex-wrap:wrap;margin-left:auto;}
.mkt .tstat b{font-family:var(--font-display);font-size:26px;font-weight:700;letter-spacing:-0.03em;display:block;}
.mkt .tstat span{font-size:13px;color:var(--tx-mute);}

/* ============================================================
   Problem act (ink) — the cost of a missed deadline
   ============================================================ */
.mkt .cost-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--hair-on-ink);
  border:1px solid var(--hair-on-ink);border-radius:10px;overflow:hidden;margin-top:clamp(40px,5vw,64px);}
.mkt .cost{background:var(--ink);padding:clamp(26px,3vw,38px);}
.mkt .cost .n{font-family:var(--font-display);font-size:clamp(38px,4.6vw,60px);font-weight:800;
  letter-spacing:-0.04em;line-height:1;color:var(--brand-light);}
/* A word in the number slot needs a shade less size to keep the same optical weight. */
.mkt .cost .n.word{font-size:clamp(32px,3.6vw,46px);letter-spacing:-0.035em;}
.mkt .cost .k{font-size:15.5px;color:var(--on-ink);margin-top:12px;font-weight:600;}
.mkt .cost .d{font-size:14px;color:var(--on-ink-soft);margin-top:6px;line-height:1.55;}

/* ============================================================
   Pinned scene — chaos resolves into order
   ============================================================ */
.mkt .scene{position:relative;height:320vh;}
/* Padding, not margin: the pin is exactly 100vh, and the top inset keeps the
   pinned content clear of the fixed nav rail that floats over it. */
.mkt .scene-pin{position:sticky;top:0;height:100vh;padding-top:78px;
  display:flex;align-items:center;overflow:hidden;}
.mkt .scene-inner{width:100%;}
.mkt .scene-grid{display:grid;grid-template-columns:.9fr 1.1fr;gap:clamp(30px,5vw,70px);align-items:center;}
.mkt .scene-copy h2{margin-bottom:18px;}
.mkt .scene-steps{margin-top:26px;display:flex;flex-direction:column;gap:2px;}
.mkt .scene-step{display:flex;gap:14px;padding:14px 16px;border-radius:8px;border:1px solid transparent;
  transition:background .5s var(--ease),border-color .5s var(--ease),opacity .5s var(--ease);}
.mkt.anim-ready .scene-step{opacity:.4;}
.mkt.anim-ready .scene-step.on{opacity:1;background:var(--card);border-color:var(--hair);}
.mkt .scene-step .sn{font-family:var(--font-mono);font-size:12px;color:var(--brand);flex-shrink:0;padding-top:2px;}
.mkt .scene-step .st{display:block;font-weight:600;font-size:15.5px;}
.mkt .scene-step .sd{display:block;font-size:14px;color:var(--tx-mute);margin-top:3px;line-height:1.5;}

/* Resting layout: a plain readable stack. The scattered/absolute version only
   exists under .anim-ready, so with JS off or reduced motion on, this section
   still reads as the tidy list it is meant to resolve into. */
.mkt .swarm{display:flex;flex-direction:column;align-items:flex-start;gap:8px;}
.mkt .chip{display:inline-flex;align-items:center;gap:8px;padding:9px 13px;border-radius:7px;
  background:var(--card);border:1px solid var(--hair);box-shadow:0 8px 22px -12px rgba(10,26,43,.3);
  font-size:13.5px;font-weight:500;white-space:nowrap;}
.mkt .chip i{width:6px;height:6px;border-radius:50%;background:var(--st-warn);flex-shrink:0;
  transition:background .4s var(--ease);}
.mkt .chip.calm i{background:var(--st-ok);}

.mkt.anim-ready .swarm{display:block;position:relative;height:min(58vh,480px);}
.mkt.anim-ready .chip{position:absolute;top:0;left:0;will-change:transform;}

/* ============================================================
   Capability cards — deliberately NOT one repeated box.
   ============================================================ */
.mkt .cap-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:16px;margin-top:clamp(40px,5vw,64px);}
/* Each capability card is a link to its own subpage, so it must reset the
   app stylesheet's anchor colour and carry the card's own text colour. */
.mkt .cap{border-radius:8px;padding:clamp(24px,2.4vw,34px);display:flex;flex-direction:column;gap:12px;
  color:inherit;text-decoration:none;
  transition:transform .5s var(--ease),box-shadow .5s var(--ease);}
.mkt .cap:hover{transform:translateY(-4px);}
.mkt .cap .tlink{margin-top:auto;padding-top:6px;}
.mkt .cap-lead .tlink,.mkt .cap-deep .tlink{color:var(--brand-light);}
.mkt .cap h3{font-size:21px;letter-spacing:-0.025em;}
.mkt .cap p{font-size:15px;color:var(--tx-soft);line-height:1.55;}
.mkt .cap-ico{width:40px;height:40px;border-radius:9px;display:flex;align-items:center;justify-content:center;}

/* role-based treatments */
.mkt .cap-lead{grid-column:span 7;background:var(--ink);color:var(--on-ink);}
.mkt .cap-lead h3{color:var(--on-ink);font-size:clamp(24px,2.4vw,30px);}
.mkt .cap-lead p{color:var(--on-ink-soft);}
.mkt .cap-lead .cap-ico{background:rgba(95,212,196,.16);color:var(--brand-light);}
.mkt .cap-tint{grid-column:span 5;background:var(--tint);}
.mkt .cap-tint .cap-ico{background:rgba(16,20,24,.08);color:var(--ink);}
.mkt .cap-hair{grid-column:span 4;background:transparent;border:1px solid var(--hair);}
.mkt .cap-hair .cap-ico{background:var(--tint);color:var(--brand);}
.mkt .cap-solid{grid-column:span 4;background:var(--card);border:1px solid var(--hair);
  box-shadow:0 20px 40px -30px rgba(16,20,24,.4);}
.mkt .cap-solid .cap-ico{background:var(--tint);color:var(--brand);}
.mkt .cap-deep{grid-column:span 4;background:var(--deep);color:var(--on-ink);}
.mkt .cap-deep h3{color:var(--on-ink);}
.mkt .cap-deep p{color:rgba(250,249,246,.74);}
.mkt .cap-deep .cap-ico{background:rgba(95,212,196,.16);color:var(--brand-light);}

/* The sixth card closes the row instead of being stranded in an empty one: full
   width, laid out horizontally so the extra space reads as intent rather than
   as a card that grew. */
.mkt .cap-wide{grid-column:span 12;background:var(--card);border:1px solid var(--hair);
  display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:clamp(18px,3vw,36px);
  box-shadow:0 20px 40px -34px rgba(10,26,43,.4);}
.mkt .cap-wide .cap-ico{background:var(--tint);color:var(--brand);}
.mkt .cap-wide h3{margin-bottom:4px;}
.mkt .cap-wide .cap-body{min-width:0;}
.mkt .cap-wide p{max-width:64ch;}
.mkt .cap-wide .tlink{margin-top:0;padding-top:0;white-space:nowrap;}
@media (max-width:760px){
  .mkt .cap-wide{grid-template-columns:1fr;gap:12px;}
  .mkt .cap-wide .tlink{justify-self:start;}
}

/* ============================================================
   Steps act (deep)
   ============================================================ */
.mkt .steps{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(24px,3vw,44px);margin-top:clamp(40px,5vw,64px);}
.mkt .step{position:relative;padding-top:34px;}
.mkt .step::before{content:"";position:absolute;top:11px;left:0;right:-24px;height:1px;background:var(--hair-on-ink);}
.mkt .step:last-child::before{right:0;}
.mkt .step .sno{position:absolute;top:0;left:0;width:24px;height:24px;border-radius:50%;background:rgba(95,212,196,.18);
  color:var(--brand-light);font-family:var(--font-mono);font-size:11px;font-weight:600;
  display:flex;align-items:center;justify-content:center;}
.mkt .step h3{font-size:21px;margin-bottom:9px;letter-spacing:-0.025em;}
.mkt .step p{font-size:15px;color:rgba(250,249,246,.74);line-height:1.55;}

/* ============================================================
   Objection / "is this for me" split
   ============================================================ */
.mkt .split2{display:grid;grid-template-columns:1fr 1fr;gap:clamp(24px,3vw,48px);margin-top:clamp(40px,5vw,60px);}
.mkt .qa{border-top:1px solid var(--hair);padding-top:22px;}
.mkt .qa h3{font-size:19px;margin-bottom:9px;letter-spacing:-0.02em;}
.mkt .qa p{font-size:15px;color:var(--tx-soft);line-height:1.6;}

/* ============================================================
   Pricing
   ============================================================ */
/* Stretch, not start: the plans carry different numbers of bullets, and equal
   card heights are what lets `margin-top:auto` line the three CTAs up. */
.mkt .price-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:clamp(40px,5vw,64px);}
.mkt .price{background:var(--card);border:1px solid var(--hair);border-radius:8px;padding:clamp(26px,2.6vw,34px);
  display:flex;flex-direction:column;gap:16px;transition:transform .5s var(--ease),box-shadow .5s var(--ease);}
.mkt .price:hover{transform:translateY(-4px);box-shadow:0 30px 60px -34px rgba(16,20,24,.4);}
.mkt .price.featured{background:var(--ink);color:var(--on-ink);border-color:var(--ink);position:relative;}
.mkt .price.featured h3{color:var(--on-ink);}
.mkt .price.featured .p-sub,.mkt .price.featured li{color:var(--on-ink-soft);}
.mkt .price.featured .p-amount{color:var(--on-ink);}
.mkt .price.featured li svg{color:var(--brand-light);}
.mkt .price-tag{position:absolute;top:16px;right:16px;font-family:var(--font-mono);font-size:10px;
  text-transform:uppercase;letter-spacing:.14em;color:var(--ink);background:var(--tint);padding:5px 9px;border-radius:4px;}
.mkt .price h3{font-size:20px;letter-spacing:-0.02em;}
.mkt .p-sub{font-size:14px;color:var(--tx-mute);}
.mkt .p-amount{font-family:var(--font-display);font-size:clamp(34px,3.4vw,44px);font-weight:800;letter-spacing:-0.04em;
  line-height:1;}
.mkt .p-amount small{font-family:var(--font-body);font-size:14px;font-weight:500;color:var(--tx-mute);letter-spacing:0;}
.mkt .price ul{display:flex;flex-direction:column;gap:9px;margin-top:2px;}
.mkt .price li{display:flex;gap:9px;font-size:14.5px;color:var(--tx-soft);line-height:1.5;}
.mkt .price li svg{flex-shrink:0;margin-top:3px;color:var(--brand);}
.mkt .price .btn{margin-top:auto;width:100%;}

/* ============================================================
   FAQ
   ============================================================ */
.mkt .faq{margin-top:clamp(36px,4vw,54px);border-top:1px solid var(--hair);}
.mkt .faq details{border-bottom:1px solid var(--hair);}
.mkt .faq summary{list-style:none;cursor:pointer;padding:24px 44px 24px 0;position:relative;
  font-family:var(--font-display);font-size:clamp(18px,1.8vw,22px);font-weight:600;letter-spacing:-0.02em;}
.mkt .faq summary::-webkit-details-marker{display:none;}
.mkt .faq summary::after{content:"";position:absolute;right:6px;top:50%;width:13px;height:13px;
  border-right:2px solid var(--brand);border-bottom:2px solid var(--brand);
  transform:translateY(-70%) rotate(45deg);transition:transform .4s var(--ease);}
.mkt .faq details[open] summary::after{transform:translateY(-30%) rotate(-135deg);}
.mkt .faq .ans{padding:0 10% 26px 0;font-size:16px;color:var(--tx-soft);line-height:1.66;max-width:70ch;}

/* ============================================================
   Final CTA + footer
   ============================================================ */
.mkt .final{position:relative;overflow:hidden;}
.mkt .final::before{content:"";position:absolute;top:-40%;right:-10%;width:60vw;height:60vw;max-width:760px;max-height:760px;
  background:radial-gradient(circle,rgba(95,212,196,.14) 0%,rgba(95,212,196,0) 70%);pointer-events:none;}
.mkt .final .wrap{position:relative;z-index:1;}
.mkt .final-in{display:flex;flex-direction:column;gap:26px;align-items:flex-start;}
.mkt .final h2{font-size:clamp(34px,5.4vw,72px);max-width:14ch;}

.mkt footer{background:var(--ink);color:var(--on-ink-soft);padding-block:clamp(50px,6vw,76px) 34px;}
.mkt .foot-grid{display:grid;grid-template-columns:1.4fr repeat(4,1fr);gap:clamp(24px,3vw,44px);}
.mkt footer h4{font-family:var(--font-mono);font-size:11px;text-transform:uppercase;letter-spacing:.16em;
  color:var(--on-ink);margin-bottom:16px;font-weight:500;}
.mkt footer ul{display:flex;flex-direction:column;gap:10px;}
.mkt footer a{font-size:14.5px;color:var(--on-ink-soft);transition:color .25s var(--ease);}
.mkt footer a:hover{color:var(--brand-light);}
.mkt .foot-brand .logo-img{filter:brightness(0) invert(1);}
.mkt .foot-brand p{font-size:14.5px;margin-top:14px;max-width:34ch;line-height:1.6;}
.mkt .foot-bottom{margin-top:clamp(36px,4vw,56px);padding-top:24px;border-top:1px solid var(--hair-on-ink);
  display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;font-size:13.5px;}

/* ============================================================
   ANIMATED MOCKUPS
   A .mock is an ordinary .board whose parts play in sequence when it
   scrolls into view, and replay when it comes back. Everything is
   authored VISIBLE; the hiding rules sit behind .anim-ready, which the
   motion script only adds when it can actually animate — so with JS off
   or reduced motion on, a mock is simply a finished screenshot.
   ============================================================ */

/* --- staged entrance: JS numbers the [data-seq] children in DOM order --- */
.mkt.anim-ready .mock [data-seq]{opacity:0;transform:translateY(9px);}
.mkt.anim-ready .mock.run [data-seq]{opacity:1;transform:none;
  transition:opacity .45s var(--ease) calc(var(--i,0) * var(--step,150ms)),
             transform .45s var(--ease) calc(var(--i,0) * var(--step,150ms));}

/* --- bars grow to their own --w --- */
.mkt .bar{height:7px;border-radius:var(--radius-pill);background:var(--ground-2);overflow:hidden;}
.mkt .bar i{display:block;height:100%;width:var(--w,0%);border-radius:inherit;background:var(--brand);}
.mkt.anim-ready .mock .bar i{width:0;}
.mkt.anim-ready .mock.run .bar i{width:var(--w,0%);
  transition:width 1.1s var(--ease) calc(var(--i,0) * var(--step,150ms) + 120ms);}
.mkt .bar.alt i{background:var(--st-warn);}
.mkt .bar.crit i{background:var(--st-crit);}

/* --- a row that changes state part-way through the sequence --- */
.mkt .rowitem{transition:background .5s var(--ease);}
.mkt .rowitem .when,.mkt .rowitem .dot{transition:background .5s var(--ease),color .5s var(--ease);}

/* ------------------------------------------------------------
   Equal-height mockups.
   A mock sits beside a copy column, and the two should share a top AND a
   bottom edge — a centred, shorter panel next to a taller block reads as an
   accident. The board becomes a flex column filling its grid track, and its
   rows share whatever height is left over, so the list breathes rather than
   leaving a dead gap underneath.
   ------------------------------------------------------------ */
.mkt .feature-grid > .stage,.mkt .hero-grid > .stage{display:flex;flex-direction:column;}
.mkt .stage > .board{flex:1;display:flex;flex-direction:column;min-height:0;}
.mkt .stage > .board > .board-body{flex:1;display:flex;flex-direction:column;min-height:0;}
/* Direct children of a filling body share the slack. The bar and tick mocks
   declare their own flex column inline, so this reaches their rows too. */
.mkt .stage > .board > .board-body > *{flex:1 1 auto;}
.mkt .stage > .board > .board-body > .rowitem{align-content:center;}

/* The catalogue keeps its sticky visual instead: there the copy column is the
   complete feature list (up to two dozen rows), and stretching a panel to match
   would make a board several thousand pixels tall. Pinning it is what keeps the
   mock beside the list the whole way down. */
.mkt .cat-visual > .board{display:flex;flex-direction:column;}

/* --- caret for the typing mock --- */
.mkt .typed{border-right:1.5px solid var(--brand);padding-right:2px;}
.mkt .mock.run .typed{animation:caret 1s step-end infinite;}
@keyframes caret{50%{border-right-color:transparent;}}

/* --- checklist ticks --- */
.mkt .tick-row{display:flex;align-items:center;gap:11px;padding:11px 12px;border-radius:6px;}
.mkt .tick-row + .tick-row{border-top:1px solid var(--hair);}
.mkt .tick-box{width:18px;height:18px;border-radius:5px;border:1.5px solid var(--hair-strong);
  flex-shrink:0;display:flex;align-items:center;justify-content:center;color:#fff;
  transition:background .35s var(--ease),border-color .35s var(--ease);}
.mkt .tick-box svg{opacity:0;transition:opacity .3s var(--ease) .1s;}
.mkt .tick-row.on .tick-box{background:var(--st-ok);border-color:var(--st-ok);}
.mkt .tick-row.on .tick-box svg{opacity:1;}
.mkt .tick-row .tl{font-size:14px;font-weight:500;}
.mkt .tick-row .tv{margin-left:auto;font-family:var(--font-mono);font-size:11.5px;color:var(--tx-mute);}

/* --- a small caption under a mock, naming what it is showing --- */
.mkt .mock-cap{margin-top:12px;font-family:var(--font-mono);font-size:11px;letter-spacing:.13em;
  text-transform:uppercase;color:var(--tx-mute);display:flex;align-items:center;gap:8px;}
.mkt .mock-cap::before{content:"";width:16px;height:1px;background:currentColor;opacity:.5;}

@media (prefers-reduced-motion:reduce){
  .mkt .mock.run .typed{animation:none;}
}

/* ============================================================
   PHOTOGRAPHY
   Two treatments only, so the imagery reads as one art direction
   rather than as assorted stock: a full-bleed band behind a dark act,
   and a framed block sitting in the grid beside copy.
   ============================================================ */

/* Every photo gets the same slight desaturation and a navy wash, which is
   what keeps a set of stock frames looking like one commissioned shoot. */
.mkt .ph{position:relative;overflow:hidden;background:var(--ink-2);}
.mkt .ph img{width:100%;height:100%;object-fit:cover;display:block;filter:saturate(.86) contrast(1.02);}
.mkt .ph::after{content:"";position:absolute;inset:0;background:rgba(10,26,43,.14);pointer-events:none;}

/* ---------- full-bleed band ----------
   Used with .act-ink, which stays as the paint underneath: if the image is
   slow or missing, the act is still a solid navy panel with legible text. */
.mkt .act-photo{position:relative;isolation:isolate;overflow:hidden;}
.mkt .act-photo > .act-bg{position:absolute;inset:0;z-index:-2;}
.mkt .act-photo > .act-bg img{width:100%;height:100%;object-fit:cover;
  filter:saturate(.7) contrast(1.05);}
/* The copy column sits in the left ~55%, where the wash is near-opaque, so the
   measured contrast on --ink holds regardless of what the photo does. */
.mkt .act-photo::after{content:"";position:absolute;inset:0;z-index:-1;
  background:linear-gradient(100deg,rgba(10,26,43,.965) 0%,rgba(10,26,43,.93) 42%,
    rgba(10,26,43,.72) 72%,rgba(10,26,43,.55) 100%);}
.mkt .act-photo .wrap{position:relative;z-index:1;}
@media (max-width:900px){
  .mkt .act-photo::after{background:rgba(10,26,43,.93);}
}

/* ---------- framed block in the grid ---------- */
.mkt .ph-block{border-radius:8px;box-shadow:0 30px 60px -34px rgba(10,26,43,.5);}
.mkt .ph-block img{aspect-ratio:4/3;}
.mkt .ph-tall img{aspect-ratio:3/4;}
.mkt .ph-wide img{aspect-ratio:16/9;}
/* A hairline teal rule along the top edge ties the frame to the brand. */
.mkt .ph-block::before{content:"";position:absolute;top:0;left:0;right:0;height:3px;
  background:var(--brand);z-index:1;}
/* A closing act that already carries a photograph does not also need the wash
   behind it — the two stack into mud. */
.mkt .act-photo.final::before{display:none;}
/* The feature grid is reused on the landing to pair a section head with a
   photo; there the head must not be vertically centred against a tall image. */
.mkt .act .feature-grid:not(:has(.stage)){align-items:center;}
.mkt .act-deep .feature-grid{margin-bottom:clamp(40px,5vw,64px);}

/* ============================================================
   SUBPAGES (funkciok.html + funkcio-*.html)
   Same vocabulary as the landing: the acts, the board mock and the
   closing CTA are all reused, so only the page head, the alternating
   feature blocks and the module index are new here.
   ============================================================ */
.mkt .page-hero{position:relative;overflow:hidden;
  padding-top:clamp(130px,15vw,190px);padding-bottom:clamp(48px,6vw,80px);}
.mkt .page-hero::before{content:"";position:absolute;top:-30%;left:-8%;width:66vw;height:66vw;
  max-width:860px;max-height:860px;pointer-events:none;
  background:radial-gradient(circle,rgba(14,110,102,.09) 0%,rgba(14,110,102,0) 70%);}
.mkt .page-hero .wrap{position:relative;z-index:1;}
.mkt .page-hero-in{display:flex;flex-direction:column;align-items:flex-start;gap:20px;}
.mkt .page-hero h1{max-width:17ch;}
.mkt .page-hero .lead{max-width:62ch;}
/* With a photo the head becomes two columns and the measures tighten to suit. */
.mkt .page-hero-grid{display:grid;grid-template-columns:1.08fr .92fr;gap:clamp(30px,5vw,64px);
  align-items:center;}
.mkt .page-hero-grid h1{max-width:13ch;}
.mkt .page-hero-grid .lead{max-width:46ch;}
@media (max-width:900px){.mkt .page-hero-grid{grid-template-columns:1fr;}}

.mkt .back-link{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);
  font-size:11.5px;text-transform:uppercase;letter-spacing:.16em;color:var(--tx-mute);
  transition:color .25s var(--ease);}
.mkt .back-link:hover{color:var(--brand);}

/* ---------- alternating feature blocks ---------- */
.mkt .feature{padding-block:clamp(52px,7vw,96px);border-top:1px solid var(--hair);}
.mkt .feature-grid{display:grid;grid-template-columns:1fr 1fr;gap:clamp(32px,5vw,72px);align-items:stretch;}
/* Reversed rows swap the visual to the left without reordering the source, so
   the reading order stays copy-then-example for screen readers. */
.mkt .feature.rev .feature-copy{order:2;}
.mkt .feature-copy{display:flex;flex-direction:column;align-items:flex-start;gap:14px;}
.mkt .feature-copy h2{font-size:clamp(25px,2.6vw,36px);letter-spacing:-0.03em;max-width:19ch;}
.mkt .feature-copy p{font-size:16px;line-height:1.62;color:var(--tx-soft);max-width:52ch;}

.mkt .ticks{display:flex;flex-direction:column;gap:9px;margin-top:4px;}
.mkt .ticks li{display:flex;gap:10px;font-size:14.5px;color:var(--tx-soft);line-height:1.5;}
.mkt .ticks svg{flex-shrink:0;margin-top:3px;color:var(--brand);}

/* ---------- extra mock parts layered on .board ---------- */
.mkt .board-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--hair);
  border-bottom:1px solid var(--hair);}
.mkt .board-stats div{background:var(--card);padding:16px;}
.mkt .board-stats b{display:block;font-family:var(--font-display);font-size:24px;font-weight:700;
  letter-spacing:-0.03em;line-height:1;}
.mkt .board-stats span{font-size:12px;color:var(--tx-mute);}
.mkt .rowitem .when.neutral{background:var(--ground-2);color:var(--tx-soft);}
.mkt .board-note{padding:12px 16px;border-top:1px solid var(--hair);background:var(--ground);
  font-size:12.5px;color:var(--tx-mute);}
/* A second board tucked under the first, overlapping it slightly. */
.mkt .stack-2{margin-top:-18px;margin-left:clamp(16px,4vw,48px);position:relative;z-index:-1;
  padding-top:22px;}

/* ============================================================
   FULL FEATURE CATALOGUE (funkciok.html)
   ============================================================ */

/* Sticky chip rail so a long catalogue stays navigable. Sits under the
   fixed nav, hence the top offset. */
.mkt .secnav{position:sticky;top:64px;z-index:60;background:rgba(248,250,252,.9);
  backdrop-filter:blur(12px);border-bottom:1px solid var(--hair);}
.mkt .secnav-in{display:flex;gap:8px;overflow-x:auto;padding-block:12px;
  scrollbar-width:none;-ms-overflow-style:none;}
.mkt .secnav-in::-webkit-scrollbar{display:none;}
.mkt .secnav a{flex-shrink:0;font-size:13.5px;font-weight:600;color:var(--tx-soft);
  padding:8px 14px;border-radius:6px;border:1px solid var(--hair);background:var(--card);
  white-space:nowrap;transition:color .25s var(--ease),border-color .25s var(--ease),background .25s var(--ease);}
.mkt .secnav a:hover{color:var(--brand);border-color:var(--brand);}
.mkt .secnav a .n{font-family:var(--font-mono);font-size:11px;color:var(--tx-mute);margin-left:6px;}

/* A catalogue section: copy + full list on one side, live mock on the other. */
.mkt .cat{padding-block:clamp(64px,8vw,110px);border-top:1px solid var(--hair);}
.mkt .cat-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(32px,5vw,70px);align-items:start;}
.mkt .cat.rev .cat-copy{order:2;}
.mkt .cat-copy{display:flex;flex-direction:column;align-items:flex-start;gap:16px;min-width:0;}
.mkt .cat-copy h2{font-size:clamp(26px,2.8vw,38px);letter-spacing:-0.03em;max-width:18ch;}
.mkt .cat-copy > p{font-size:16px;line-height:1.62;color:var(--tx-soft);max-width:50ch;}
.mkt .cat-visual{position:sticky;top:132px;}

/* The exhaustive list, grouped into cards.
   It used to be one long two-column grid with a rule above every entry. That
   reads as a broken table, because sibling cells in a CSS grid row share a
   height: a two-line entry on the left leaves a visible gap beside a one-line
   entry on the right, and the hairlines stop lining up. Splitting each group
   into its own card puts every list back into a SINGLE column, so the rules
   between entries are always aligned, and the cards themselves tile. */
.mkt .feat-groups{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));
  gap:16px;align-items:start;margin-top:4px;width:100%;}
.mkt .feat-group{background:var(--card);border:1px solid var(--hair);border-radius:10px;
  padding:4px 22px 14px;box-shadow:0 1px 2px rgba(10,26,43,.04);}
.mkt .feat-group-head{display:flex;align-items:baseline;justify-content:space-between;gap:14px;
  padding:18px 0 12px;border-bottom:1px solid var(--hair);}
.mkt .feat-group-head h3{font-family:var(--font-mono);font-size:10.5px;font-weight:500;
  letter-spacing:.16em;text-transform:uppercase;color:var(--tx-mute);}
.mkt .feat-group-head .n{font-family:var(--font-mono);font-size:10.5px;color:var(--brand);
  flex-shrink:0;}
.mkt .feat-group li{display:flex;gap:10px;font-size:14.5px;line-height:1.55;color:var(--tx-soft);
  padding:10px 0;}
.mkt .feat-group li + li{border-top:1px solid var(--hair);}
.mkt .feat-group svg{flex-shrink:0;margin-top:5px;color:var(--brand);}
.mkt .feat-group b{color:var(--tx);font-weight:600;}
/* On a dark act the card ground flips with it. */
.mkt .act-ink .feat-group,.mkt .act-deep .feat-group{background:rgba(242,245,248,.05);
  border-color:var(--hair-on-ink);box-shadow:none;}
.mkt .act-ink .feat-group li,.mkt .act-deep .feat-group li{color:var(--on-ink-soft);}
.mkt .act-ink .feat-group b,.mkt .act-deep .feat-group b{color:var(--on-ink);}

/* Permission matrix mock. */
.mkt .matrix{width:100%;border-collapse:collapse;font-size:12.5px;}
.mkt .matrix th{text-align:left;font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--tx-mute);font-weight:500;padding:9px 10px;border-bottom:1px solid var(--hair);}
.mkt .matrix td{padding:9px 10px;border-bottom:1px solid var(--hair);}
.mkt .matrix td:first-child{font-weight:600;color:var(--tx);}
.mkt .matrix .yes{color:var(--st-ok);}
.mkt .matrix .no{color:var(--hair-strong);}

@media (max-width:900px){
  /* minmax(0,1fr): a long feature row in the copy column must wrap, not widen the page. */
  .mkt .cat-grid{grid-template-columns:minmax(0,1fr);}
  .mkt .cat.rev .cat-copy{order:0;}
  .mkt .cat-visual{position:static;}
  .mkt .secnav{top:56px;}
}
@media (max-width:620px){
  .mkt .feat-group{padding-inline:16px;}
}

/* ---------- module index on funkciok.html ---------- */
.mkt .modlist{border-top:1px solid var(--hair);margin-top:clamp(36px,5vw,60px);}
.mkt .mod{display:grid;grid-template-columns:minmax(180px,.8fr) 1.6fr auto;gap:clamp(18px,3vw,44px);
  align-items:start;padding:clamp(26px,3vw,38px) clamp(14px,2vw,24px);
  border-bottom:1px solid var(--hair);color:inherit;text-decoration:none;position:relative;
  transition:background .4s var(--ease);}
.mkt .mod:hover{background:var(--tint);}
.mkt .mod h2{font-size:clamp(21px,2.2vw,28px);letter-spacing:-0.028em;}
.mkt .mod p{font-size:15px;line-height:1.6;color:var(--tx-soft);}
.mkt .mod-pills{display:flex;flex-wrap:wrap;gap:7px;margin-top:14px;}
.mkt .pill{font-family:var(--font-mono);font-size:11px;letter-spacing:.05em;padding:5px 9px;
  border-radius:5px;background:var(--ground-2);color:var(--tx-soft);}
.mkt .mod:hover .pill{background:rgba(255,255,255,.6);}
.mkt .mod-go{align-self:center;width:38px;height:38px;border-radius:50%;border:1px solid var(--hair-strong);
  display:flex;align-items:center;justify-content:center;flex-shrink:0;
  transition:background .4s var(--ease),border-color .4s var(--ease),transform .4s var(--ease);}
.mkt .mod:hover .mod-go{background:var(--ink);border-color:var(--ink);color:var(--on-ink);transform:translateX(4px);}

@media (max-width:900px){
  .mkt .feature-grid{grid-template-columns:1fr;}
  .mkt .feature.rev .feature-copy{order:0;}
  .mkt .stack-2{margin-left:0;}
  .mkt .mod{grid-template-columns:1fr auto;}
  .mkt .mod-body{grid-column:1 / -1;}
}

/* ============================================================
   Motion primitives
   Everything starts VISIBLE. JS adds .anim-ready only when it can
   animate, so a JS failure or reduced-motion leaves the page readable.
   ============================================================ */
.mkt.anim-ready [data-anim]{opacity:0;}
.mkt.anim-ready [data-anim="up"]{transform:translateY(26px);}
.mkt.anim-ready [data-anim="fade"]{transform:none;}
.mkt.anim-ready [data-anim="scale"]{transform:scale(.965);}
.mkt.anim-ready [data-anim].in{opacity:1;transform:none;
  transition:opacity .9s var(--ease) var(--d,0ms),transform .9s var(--ease) var(--d,0ms);}

/* Word-mask reveal for display headings. */
.mkt.anim-ready .wsplit .w{display:inline-block;overflow:hidden;vertical-align:top;}
.mkt.anim-ready .wsplit .w > span{display:inline-block;transform:translateY(105%);
  transition:transform 1s var(--ease) var(--d,0ms);}
.mkt.anim-ready .wsplit.in .w > span{transform:translateY(0);}

@media (prefers-reduced-motion:reduce){
  .mkt *,.mkt *::before,.mkt *::after{animation-duration:.001ms !important;animation-iteration-count:1 !important;
    transition-duration:.001ms !important;scroll-behavior:auto !important;}
  .mkt.anim-ready [data-anim]{opacity:1 !important;transform:none !important;}
  .mkt.anim-ready .wsplit .w > span{transform:none !important;}
  .mkt .scene{height:auto;}
  .mkt .scene-pin{position:static;height:auto;padding-block:60px;}
  .mkt .scene-step{opacity:1;}
}

/* ============================================================
   Focus
   ============================================================ */
.mkt a:focus-visible,.mkt button:focus-visible,.mkt summary:focus-visible,.mkt details:focus-visible{
  outline:2px solid var(--brand);outline-offset:3px;border-radius:3px;}
/* The dark-ground counterpart, so the focus ring is visible in both worlds. */
.mkt .act-ink a:focus-visible,.mkt .act-ink button:focus-visible,
.mkt .act-deep a:focus-visible,.mkt .act-deep button:focus-visible,
.mkt .cap-lead:focus-visible,.mkt .cap-deep:focus-visible,
.mkt footer a:focus-visible{outline-color:var(--brand-light);}

/* ============================================================
   Responsive
   ============================================================ */
@media (max-width:1080px){
  .mkt .cap-lead,.mkt .cap-tint{grid-column:span 12;}
  .mkt .cap-hair,.mkt .cap-solid,.mkt .cap-deep{grid-column:span 6;}
  .mkt .cap-wide{grid-template-columns:auto 1fr;}
}
@media (max-width:900px){
  .mkt .hero-grid,.mkt .scene-grid,.mkt .split2{grid-template-columns:1fr;}
  .mkt .cost-grid,.mkt .steps,.mkt .price-grid{grid-template-columns:1fr;}
  .mkt .step::before{right:0;}
  .mkt .float-card{right:0;bottom:-6%;}
  .mkt .foot-grid{grid-template-columns:1fr 1fr;}
  /* No pinning below this width — so the swarm reverts to its static stack and
     the copy steps are all lit, matching what the scroll scene resolves into. */
  .mkt .scene{height:auto;}
  .mkt .scene-pin{position:static;height:auto;}
  .mkt.anim-ready .swarm{display:flex;height:auto;margin-top:30px;}
  .mkt.anim-ready .chip{position:static;transform:none !important;}
  .mkt.anim-ready .scene-step{opacity:1;}

  .mkt .nav-links,.mkt .nav-cta .ghost-link{display:none;}
  .mkt .nav-burger{display:flex;}
  .mkt .mobile-menu{display:block;position:absolute;top:calc(100% + 8px);left:var(--gutter);right:var(--gutter);
    background:var(--ground);border:1px solid var(--hair);border-radius:10px;padding:10px;
    box-shadow:0 30px 60px -26px rgba(16,20,24,.3);opacity:0;visibility:hidden;transform:translateY(-8px);
    transition:opacity .3s var(--ease),transform .3s var(--ease),visibility .3s;}
  .mkt .mobile-menu.open{opacity:1;visibility:visible;transform:translateY(0);}
  .mkt .mobile-menu > a,.mkt .mobile-accordion-body a{display:block;padding:13px 14px;border-radius:7px;font-weight:500;
    color:var(--tx);}
  .mkt .mobile-menu > a:hover,.mkt .mobile-accordion-body a:hover{background:var(--ground-2);}
  .mkt .mobile-actions .btn{width:100%;}
  .mkt .mobile-accordion-trigger{display:flex;justify-content:space-between;align-items:center;width:100%;
    padding:13px 14px;border:none;background:none;font:inherit;font-weight:500;cursor:pointer;color:var(--tx);}
  .mkt .mobile-accordion-body{display:none;padding-left:10px;}
  .mkt .mobile-accordion-body.open{display:block;}
  .mkt .mobile-accordion-body a{font-size:14.5px;color:var(--tx-soft);}
}
@media (max-width:640px){
  /* Logo + burger only: the CTA is too wide to sit beside them here, and the
     mobile menu already carries it. */
  .mkt .nav-cta .btn{display:none;}
}
@media (max-width:560px){
  .mkt .cap-hair,.mkt .cap-solid,.mkt .cap-deep{grid-column:span 12;}
  .mkt .foot-grid{grid-template-columns:1fr;}
  .mkt .trust-stats{margin-left:0;}
}

/* Text-sized icons from the Lucide sprite (assets/icons/icons.svg) that replaced characters such as ✕ and →. */
svg.i{display:inline-block;vertical-align:-0.125em;flex-shrink:0;}
